Tổng quat
Trong thử thách này, bạn sẽ được cung cấp hai số là cả hai phần bù nhỏ lớn hơn bội số của một số cỡ trung bình. Bạn phải xuất ra một số có kích thước trung bình gần như là một ước của cả hai số, ngoại trừ một phần bù nhỏ.
Kích thước của các số liên quan sẽ được tham số hóa bằng tham số độ khó , l
. Mục tiêu của bạn là giải quyết vấn đề lớn nhất có thể l
trong vòng dưới 1 phút.
Thiết lập
Trong một vấn đề nhất định, sẽ có một số bí mật p
, đó sẽ là một số bit ngẫu nhiên l^2
( l*l
). Sẽ có hai số nhân, q1, q2
sẽ là l^3
số bit ngẫu nhiên và sẽ có hai số bù, r1, r2
sẽ là ngẫu nhiênl
số bit .
Đầu vào cho chương trình của bạn sẽ được x1, x2
xác định là:
x1 = p * q1 + r1
x2 = p * q2 + r2
Đây là một chương trình để tạo các trường hợp thử nghiệm, trong 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)
Dòng đầu ra đầu tiên là một giải pháp khả thi, trong khi dòng thứ hai và thứ ba là đầu vào mà chương trình của bạn sẽ được cung cấp.
Chương trình của bạn
Với x1
, x2
và l
, bạn phải tìm một l^2
số chút p'
như vậy x1 % p'
và x2 % p'
đều l
số bit. p
sẽ luôn luôn làm việc, mặc dù có thể có những khả năng khác. Đây là một chức năng để xác minh một giải phá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)
Thí dụ
Giả sử l
là 3. Chương trình trình tạo chọn một số 9 bit p
, trong trường hợp này là 442
. Trình tạo chọn hai 3
số bit cho r1, r2
, đó là 4, 7
. Trình tạo chọn hai 27
số bit cho q1, q2
, đó là 117964803, 101808039
. Vì những lựa chọn này, x1, x2
là52140442930, 44999153245
.
Chương trình của bạn sẽ được cung cấp 52140442930, 44999153245
làm đầu vào và phải xuất ra một số 9 bit (trong phạm vi [256, 511]
) sao cho số đó 52140442930
và 44999153245
modulo đó cho 3 số bit (trong phạm vi [4, 7]
). 442
là giá trị duy nhất như vậy trong trường hợp này, vì vậy chương trình của bạn sẽ phải xuất ra 442
.
Thêm ví dụ
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
Chấm điểm
Như đã đề cập ở trên, điểm số của chương trình của bạn là cao nhất l
mà chương trình hoàn thành trong vòng dưới 1 phút. Cụ thể hơn, chương trình của bạn sẽ được chạy trên 5 trường hợp ngẫu nhiên với điều đó l
và nó phải đưa ra câu trả lời đúng cho cả 5, với thời gian trung bình dưới 1 phút. Điểm của chương trình sẽ là điểm cao nhất l
mà nó thành công. Tiebreaker sẽ là thời gian trung bình trên đó l
.
Để cung cấp cho bạn một ý tưởng về những điểm số để nhắm đến, tôi đã viết một người giải quyết vũ phu rất đơn giản. Nó được điểm 5. Tôi đã viết một người giải thích dễ thương hơn nhiều. Nó có điểm 12 hoặc 13, tùy thuộc vào may mắn.
Chi tiết
Để so sánh hoàn hảo giữa các câu trả lời, tôi sẽ gửi thời gian trên máy tính xách tay của mình để cho điểm số chuẩn. Tôi cũng sẽ chạy các trường hợp được chọn ngẫu nhiên tương tự trên tất cả các bài nộp, để giảm bớt phần nào may mắn. Máy tính xách tay của tôi có 4 CPU, CPU i5-4300U @ 1.9 GHz, RAM 7.5G.
Vui lòng gửi điểm tạm thời dựa trên thời gian của riêng bạn, chỉ cần làm rõ nó là tạm thời hay hợp quy.
Có thể chương trình nhanh nhất giành chiến thắng!
l^2
số bit nào - l
đều không phải là một yếu tố của cả hai số. Thông thường chỉ có một, tuy nhiên.