ภาพรวม
ในการท้าทายนี้คุณจะได้รับตัวเลขสองตัวซึ่งทั้งคู่มีค่าออฟเซ็ตขนาดเล็กมากกว่าจำนวนของขนาดกลางจำนวนมาก คุณต้องส่งออกหมายเลขขนาดกลางที่เกือบจะเป็นตัวหารของตัวเลขทั้งสองยกเว้นการชดเชยขนาดเล็ก
ขนาดของตัวเลขที่เกี่ยวข้องจะถูกทำให้เป็นพารามิเตอร์โดยพารามิเตอร์ความยากลำบาก, l
. วัตถุประสงค์ของคุณคือการแก้ปัญหาให้ได้มากที่สุดl
ในเวลาไม่ถึง 1 นาที
ติดตั้ง
ในปัญหาที่กำหนดจะมีหมายเลขลับp
ซึ่งจะเป็นหมายเลขบิตแบบสุ่มl^2
( l*l
) จะมีตัวคูณสองตัวq1, q2
ซึ่งจะเป็นl^3
ตัวเลขสุ่มและจะมีสองออฟเซ็r1, r2
ตซึ่งจะเป็นl
ตัวเลขบิตสุ่ม
ข้อมูลเข้าสู่โปรแกรมของคุณจะถูกx1, x2
กำหนดเป็น:
x1 = p * q1 + r1
x2 = p * q2 + r2
นี่คือโปรแกรมสำหรับสร้างกรณีทดสอบใน 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)
บรรทัดแรกของเอาต์พุตเป็นวิธีแก้ปัญหาที่เป็นไปได้ในขณะที่บรรทัดที่สองและสามเป็นอินพุตที่โปรแกรมของคุณจะได้รับ
โปรแกรมของคุณ
ป.ร. ให้ไว้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)
ตัวอย่าง
สมมติว่าl
เป็น 3. โปรแกรมกำเนิดหยิบจำนวน 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
ที่จะประสบความสำเร็จ Tiebreaker จะเป็นเวลาเฉลี่ยในสิ่งl
นั้น
เพื่อให้คุณทราบถึงสิ่งที่จะทำคะแนนได้ฉันเขียนตัวแก้กำลังแบบเดรัจฉานที่ง่ายมาก มันได้คะแนน 5 ฉันเขียนนักคิดที่ยอดเยี่ยมกว่านี้ มันได้คะแนน 12 หรือ 13 ขึ้นอยู่กับโชค
รายละเอียด
สำหรับการเปรียบเทียบคำตอบที่สมบูรณ์แบบฉันจะใช้เวลาส่งแล็ปท็อปของฉันเพื่อให้คะแนนตามมาตรฐาน ฉันจะใช้อินสแตนซ์ที่สุ่มเลือกเดียวกันในทุกการส่งเพื่อบรรเทาโชคบ้าง แล็ปท็อปของฉันมี 4 CPU, i5-4300U CPU @ 1.9 GHz, RAM 7.5G
อย่าลังเลที่จะโพสต์คะแนนชั่วคราวตามเวลาของคุณเองเพียงแค่ทำให้ชัดเจนว่าเป็นชั่วคราวหรือเป็นบัญญัติ
โปรแกรมที่เร็วที่สุดอาจชนะ!
l^2
หมายเลขบิตใด ๆที่ - l
อยู่ห่างจากการเป็นปัจจัยของตัวเลขทั้งสองทำงาน อย่างไรก็ตามโดยทั่วไปจะมีเพียงหนึ่งเดียว