Panoramica
In questa sfida, ti verranno dati due numeri che sono entrambi un piccolo offset maggiore di un multiplo di un numero medio. È necessario generare un numero medio che sia quasi un divisore di entrambi i numeri, ad eccezione di un piccolo offset.
La dimensione dei numeri coinvolti sarà parametrizzato da un parametro di difficoltà, l
. Il tuo obiettivo è risolvere il problema nel modo più ampio possibile l
in meno di 1 minuto.
Impostare
In un dato problema, ci sarà un numero segreto p
, che sarà un numero di bit casuale l^2
( l*l
). Ci saranno due moltiplicatori, q1, q2
che saranno l^3
numeri di bit casuali e ci saranno due offset r1, r2
, che saranno casualil
numeri di bit .
L'input per il tuo programma sarà x1, x2
definito come:
x1 = p * q1 + r1
x2 = p * q2 + r2
Ecco un programma per generare casi di test, in Python:
from random import randrange
from sys import argv
l = int(argv[1])
def randbits(bits):
return randrange(2 ** (bits - 1), 2 ** bits)
p = randbits(l ** 2)
print(p)
for i in range(2):
q_i = randbits(l ** 3)
r_i = randbits(l)
print(q_i * p + r_i)
La prima riga di output è una possibile soluzione, mentre la seconda e la terza riga sono l'input che verrà fornito al programma.
Il tuo programma
Dato x1
, x2
e l
, si deve trovare un l^2
numero di bit p'
tale che x1 % p'
e x2 % p'
sono entrambi l
numeri di bit. p
funzionerà sempre, anche se potrebbero esserci altre possibilità. Ecco una funzione per verificare una soluzione:
def is_correct(x1, x2, l, p_prime):
p_prime_is_good = p_prime >> (l**2 - 1) and not p_prime >> l ** 2
x1_is_good = (x1 % p_prime) >> (l-1) and not (x1 % p_prime) >> l
x2_is_good = (x2 % p_prime) >> (l-1) and not (x2 % p_prime) >> l
return bool(p_prime_is_good and x1_is_good and x2_is_good)
Esempio
Supponiamo che l
sia 3. Il programma del generatore sceglie un numero di 9 bit per p
, che in questo caso è 442
. Il generatore seleziona due 3
numeri di bit per r1, r2
, che sono 4, 7
. Il generatore seleziona due 27
numeri di bit per q1, q2
, che sono 117964803, 101808039
. A causa di queste scelte, lo x1, x2
sono 52140442930, 44999153245
.
Il tuo programma verrebbe dato 52140442930, 44999153245
come input e deve emettere un numero a 9 bit (nell'intervallo [256, 511]
) tale che 52140442930
e 44999153245
quel modulo fornisca numeri a 3 bit (nell'intervallo [4, 7]
). 442
è l'unico valore in questo caso, quindi il tuo programma dovrebbe produrre 442
.
Più esempi
l = 2
x1 = 1894
x2 = 2060
p = 11
No other p'.
l = 3
x1 = 56007668599
x2 = 30611458895
p = 424
No other p'.
l = 6
x1 = 4365435975875889219149338064474396898067189178953471159903352227492495111071
x2 = 6466809655659049447127736275529851894657569985804963410176865782113074947167
p = 68101195620
I don't know whether there are other p'.
l = 12
x1 = 132503538560485423319724633262218262792296147003813662398252348727558616998821387759658729802732555377599590456096450977511271450086857949046098328487779612488702544062780731169071526325427862701033062986918854245283037892816922645703778218888876645148150396130125974518827547039720412359298502758101864465267219269598121846675000819173555118275197412936184329860639224312426860362491131729109976241526141192634523046343361089218776687819810873911761177080056675776644326080790638190845283447304699879671516831798277084926941086929776037986892223389603958335825223
x2 = 131643270083452525545713630444392174853686642378302602432151533578354175874660202842105881983788182087244225335788180044756143002547651778418104898394856368040582966040636443591550863800820890232349510212502022967044635049530630094703200089437589000344385691841539471759564428710508659169951391360884974854486267690231936418935298696990496810984630182864946252125857984234200409883080311780173125332191068011865349489020080749633049912518609380810021976861585063983190710264511339441915235691015858985314705640801109163008926275586193293353829677264797719957439635
p = 12920503469397123671484716106535636962543473
I don't know whether there are other p'.
l = 12
x1 = 202682323504122627687421150801262260096036559509855209647629958481910539332845439801686105377638207777951377858833355315514789392768449139095245989465034831121409966815913228535487871119596033570221780568122582453813989896850354963963579404589216380209702064994881800638095974725735826187029705991851861437712496046570494304535548139347915753682466465910703584162857986211423274841044480134909827293577782500978784365107166584993093904666548341384683749686200216537120741867400554787359905811760833689989323176213658734291045194879271258061845641982134589988950037
x2 = 181061672413088057213056735163589264228345385049856782741314216892873615377401934633944987733964053303318802550909800629914413353049208324641813340834741135897326747139541660984388998099026320957569795775586586220775707569049815466134899066365036389427046307790466751981020951925232623622327618223732816807936229082125018442471614910956092251885124883253591153056364654734271407552319665257904066307163047533658914884519547950787163679609742158608089946055315496165960274610016198230291033540306847172592039765417365770579502834927831791804602945514484791644440788
p = 21705376375228755718179424140760701489963164
punteggio
Come accennato in precedenza, il punteggio del tuo programma è il più alto l
che il programma completa in meno di 1 minuto. Più specificamente, il tuo programma verrà eseguito su 5 istanze casuali con questo l
, e deve produrre una risposta corretta su tutti e 5, con un tempo medio inferiore a 1 minuto. Il punteggio di un programma sarà il più alto su l
cui riesce. Tiebreaker sarà il tempo medio su quello l
.
Per darti un'idea di quali punteggi puntare, ho scritto un risolutore di forza bruta molto semplice. Ha ottenuto un punteggio di 5. Ho scritto un risolutore molto più elaborato. Ha ottenuto un punteggio di 12 o 13, a seconda della fortuna.
Dettagli
Per una perfetta comparabilità tra le risposte, prenderò in considerazione le osservazioni sul mio laptop per dare punteggi canonici. Eseguirò anche le stesse istanze scelte casualmente su tutti gli invii, per alleviare un po 'la fortuna. Il mio laptop ha 4 CPU, CPU i5-4300U a 1,9 GHz, 7,5G di RAM.
Sentiti libero di pubblicare un punteggio provvisorio in base al tuo tempismo, basta chiarire se è provvisorio o canonico.
Che vinca il programma più veloce!
l^2
numero di bit che è l
-bit lontano dall'essere un fattore di entrambi i numeri funziona. Di solito ce n'è solo uno.