अवलोकन
इस चुनौती में, आपको दो नंबर दिए जाएंगे जो कि एक मध्यम आकार के एक नंबर से कई गुना छोटे ऑफसेट हैं। आपको एक मध्यम आकार की संख्या का उत्पादन करना चाहिए जो कि एक छोटे से ऑफसेट को छोड़कर, दोनों संख्याओं का लगभग एक विभाजक है।
शामिल संख्याओं का आकार एक कठिनाई पैरामीटर द्वारा पैरामीटर किया जाएगा l,। आपका उद्देश्य l1 मिनट से कम समय में सबसे बड़ी समस्या को हल करना है ।
सेट अप
दी गई समस्या में, एक गुप्त संख्या pहोगी, जो एक यादृच्छिक l^2( l*l) बिट संख्या होगी। दो गुणक q1, q2होंगे, जो यादृच्छिक l^3बिट संख्या होंगे, और दो ऑफसेट r1, r2होंगे, जो यादृच्छिक lबिट संख्या होंगे।
आपके कार्यक्रम का इनपुट निम्नानुसार होगा x1, x2:
x1 = p * q1 + r1
x2 = p * q2 + r2
यहाँ पायथन में, परीक्षण मामलों को उत्पन्न करने का एक कार्यक्रम है:
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)
आउटपुट की पहली पंक्ति एक संभावित समाधान है, जबकि दूसरी और तीसरी पंक्ति इनपुट है जिसे आपका प्रोग्राम दिया जाएगा।
आपका कार्यक्रम
दिया x1, x2और l, आपको एक l^2बिट संख्या मिलनी चाहिए p'जो कि x1 % p'और x2 % p'दोनों lबिट संख्याएँ हैं। pहमेशा काम करेंगे, हालांकि अन्य संभावनाएं हो सकती हैं। यहाँ एक समाधान को सत्यापित करने के लिए एक समारोह है:
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)
उदाहरण
मान लीजिए l3. जनरेटर प्रोग्राम 9-बिट संख्या के लिए चुनता है p, जो इस मामले में है 442। जनरेटर दो 3बिट संख्या के लिए चुनता है r1, r2, जो हैं 4, 7। जनरेटर दो 27बिट संख्या के लिए चुनता है q1, q2, जो हैं 117964803, 101808039। इन विकल्पों के कारण, x1, x2हैं 52140442930, 44999153245।
आपके प्रोग्राम 52140442930, 44999153245को इनपुट के रूप में दिया जाएगा , और 9-बिट नंबर (रेंज में [256, 511]) को आउटपुट करना होगा जैसे कि 52140442930और 44999153245मोडुलो जो नंबर 3 बिट नंबर (रेंज में [4, 7]) देते हैं। 442इस मामले में एकमात्र ऐसा मूल्य है, इसलिए आपके प्रोग्राम को आउटपुट देना होगा 442।
और ज्यादा उदाहरण
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
स्कोरिंग
जैसा कि ऊपर उल्लेख किया गया है, आपके कार्यक्रम का स्कोर उच्चतम lहै जो कार्यक्रम 1 मिनट से कम समय में पूरा होता है। अधिक विशेष रूप से, आपका कार्यक्रम 5 यादृच्छिक उदाहरणों के साथ चलाया जाएगा l, और इसे सभी 5 पर एक सही उत्तर का उत्पादन करना होगा, औसत समय 1 मिनट से कम। एक कार्यक्रम का स्कोर उच्चतम होगा lजो उस पर सफल होता है। टाईब्रेकर उस पर औसत समय होगा l।
आपको यह अनुमान लगाने के लिए कि किस स्कोर के लिए लक्ष्य करना है, मैंने एक बहुत ही सरल ब्रूट-फोर्स सॉल्वर लिखा। इसे 5 का स्कोर मिला। मैंने एक बहुत बड़ा प्रशंसक लिखा। इसे किस्मत के आधार पर 12 या 13 का स्कोर मिला।
विवरण
उत्तर भर में पूर्ण तुल्यता के लिए, मैं अपने लैपटॉप पर विहित स्कोर देने के लिए समय दूंगा। मैं भी सभी प्रस्तुतियाँ पर एक ही बेतरतीब ढंग से चुने हुए उदाहरण चलाऊंगा, कुछ हद तक भाग्य को कम करने के लिए। मेरे लैपटॉप में 4 सीपीयू, i5-4300U CPU @ 1.9 GHz, 7.5G RAM है।
अपने समय के आधार पर एक अनंतिम स्कोर पोस्ट करने के लिए स्वतंत्र महसूस करें, बस यह स्पष्ट करें कि क्या यह अनंतिम या विहित है।
सबसे तेज कार्यक्रम जीत सकता है!
l^2बिट-संख्या lदूर है। हालांकि आम तौर पर केवल एक ही होता है।