genel bakış
Bu zorlukta, her ikisi de orta boyutlu bir sayının katından daha küçük olan küçük bir uzaklık olan iki sayı verilecektir. Küçük bir ofset haricinde, her iki sayının da neredeyse böleni olan orta boyutlu bir sayı çıkarmalısınız.
İlgili sayıların boyutu bir zorluk parametresi ile parametrelenecektir l
. Hedefiniz, sorunu l
1 dakikadan daha kısa sürede çözmek .
Kurmak
Belirli bir problemde, p
rastgele l^2
( l*l
) bir bit numarası olacak gizli bir sayı olacaktır . q1, q2
Rasgele l^3
bit sayıları olacak iki çarpan olacak ve rasgele bit sayıları olacak iki öteleme r1, r2
olacaktır l
.
Programınıza giriş şu şekilde x1, x2
tanımlanır:
x1 = p * q1 + r1
x2 = p * q2 + r2
İşte Python'da test senaryoları oluşturmak için bir program:
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)
İlk çıktı satırı olası bir çözümken, ikinci ve üçüncü satırlar programınıza verilecek girdidir.
Programınız
Verilen x1
, x2
ve l
, bir bulmalı l^2
bit sayı p'
öyle ki x1 % p'
ve x2 % p'
her ikisi de l
biraz sayılar. p
her zaman işe yarayacak olsa da, başka olasılıklar da olabilir. İşte bir çözümü doğrulamak için bir fonksiyon:
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)
Misal
Varsayalım l
. 3. Jeneratör programı p
bu durumda 9 bitlik bir sayı seçer 442
. Jeneratör iki seçer 3
için biraz numaralarını r1, r2
vardır 4, 7
. Jeneratör iki seçer 27
için biraz numaralarını q1, q2
vardır 117964803, 101808039
. Bu seçimler nedeniyle, x1, x2
vardır 52140442930, 44999153245
.
Programınız 52140442930, 44999153245
girdi olarak verilir ve 9 bitlik bir sayı (aralık [256, 511]
dahilinde) 52140442930
ve 44999153245
modulo bu sayı 3 bitlik sayı (aralıkta [4, 7]
) verir. 442
bu durumda tek değerdir, bu nedenle programınızın çıktı alması gerekir 442
.
Daha fazla örnek
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
puanlama
Yukarıda belirtildiği gibi, programınızın puanı, l
programın 1 dakikadan kısa sürede tamamladığı en yüksek puandır . Daha spesifik olarak, programınız bununla birlikte 5 rasgele örnek üzerinde çalıştırılacaktır l
ve ortalama 5 dakikanın altında, 5'in hepsinde doğru bir cevap vermelidir. Bir programın puanı l
başarılı olduğu en yüksek puan olacaktır . Tiebreaker bunun için ortalama bir zaman olacak l
.
Size hangi puanları hedefleyeceğiniz konusunda bir fikir vermek için çok basit bir kaba kuvvet çözücü yazdım. 5 puan aldı. Çok meraklı bir çözücü yazdım. Şansa bağlı olarak 12 veya 13 puan aldı.
ayrıntılar
Cevaplar arasında mükemmel karşılaştırılabilirlik için, dizüstü bilgisayarımdaki başvuruları kanonik puanlar vermek için zamanlayacağım. Şansı bir şekilde hafifletmek için tüm başvurularda aynı rastgele seçilmiş örnekleri de çalıştıracağım. Dizüstü bilgisayarımda 4 CPU, 1.9 GHz'de i5-4300U CPU, 7.5G RAM var.
Kendi zamanlamanıza göre geçici bir puan yayınlamaktan çekinmeyin, sadece geçici veya kanonik olup olmadığını açıkça belirtin.
En hızlı program kazanabilir!
l^2
bit sayısı l
çalışır. Bununla birlikte, tipik olarak sadece bir tane vardır.