개요
이 과제에서는 중간 크기의 배수보다 작은 작은 오프셋 인 두 개의 숫자가 주어집니다. 작은 오프셋을 제외하고 두 숫자의 약수 인 중간 크기 숫자를 출력해야합니다.
관련된 숫자의 크기는 난이도 매개 변수로 매개 변수화됩니다 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 비트 값을 모듈로 (modulo) [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 개의 임의 인스턴스에서 실행되며 5 l
분마다 평균 시간이 1 분 미만인 정답을 출력해야합니다. 프로그램의 점수는 l
성공한 최고 점수입니다 . Tiebreaker는 평균 시간입니다 l
.
어떤 점수를 목표로하는지에 대한 아이디어를주기 위해 매우 간단한 무차별 솔버를 작성했습니다. 5 점을 받았습니다. 나는 훨씬 더 멋진 솔버를 썼습니다. 운에 따라 12 점 또는 13 점을 받았습니다.
세부
답을 완벽하게 비교하기 위해 랩톱에 제출하여 정식 점수를 제공합니다. 또한 행운을 다소 완화하기 위해 모든 제출에서 무작위로 선택된 동일한 인스턴스를 실행합니다. 내 노트북에는 4 개의 CPU, 1.9GHz에서 i5-4300U CPU, 7.5G의 RAM이 있습니다.
자신의 타이밍에 따라 임시 점수를 게시하고 임시인지 정식인지 명확하게 알려주십시오.
가장 빠른 프로그램이 이길 수 있습니다!
l^2
의 모든 비트 숫자가 l
작동합니다. 그러나 일반적으로 하나만 있습니다.