cryptohack modular arithmetic
cryptohack modular arithmetic
앞부분 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
def gcd(a,b):
if b==0:
return a
return gcd(b,a%b)
def extended_euclidean(a,b):
if b==0:
return a,1,0
gcd,x1,y1=extended_euclidean(b,a%b)
x=y1
y=x1-(a//b)*y1
return gcd,x,y
def sol3():
print(11%6)
print(8146798528947%17)
def modular_exp(a,b,m): #
e = bin(b)[2:]
T = 1
G = a
for i in e[::-1]:
if i == '1':
T = (T * G) % m
G = (G * G) % m
return T
def sol4():
for i in enumerate(range(29)):
s = i[0]**2 % 29
if s==6:
print(s, i[1])
def legendre_symbol():
p = 101524035174539890485408575671085261788758965189060164484385690801466167356667036677932998889725476582421738788500738738503134356158197247473850273565349249573867251280253564698939768700489401960767007716413932851838937641880157263936985954881657889497583485535527613578457628399173971810541670838543309159139
ints = [25081841204695904475894082974192007718642931811040324543182130088804239047149283334700530600468528298920930150221871666297194395061462592781551275161695411167049544771049769000895119729307495913024360169904315078028798025169985966732789207320203861858234048872508633514498384390497048416012928086480326832803, 45471765180330439060504647480621449634904192839383897212809808339619841633826534856109999027962620381874878086991125854247108359699799913776917227058286090426484548349388138935504299609200377899052716663351188664096302672712078508601311725863678223874157861163196340391008634419348573975841578359355931590555, 17364140182001694956465593533200623738590196990236340894554145562517924989208719245429557645254953527658049246737589538280332010533027062477684237933221198639948938784244510469138826808187365678322547992099715229218615475923754896960363138890331502811292427146595752813297603265829581292183917027983351121325, 14388109104985808487337749876058284426747816961971581447380608277949200244660381570568531129775053684256071819837294436069133592772543582735985855506250660938574234958754211349215293281645205354069970790155237033436065434572020652955666855773232074749487007626050323967496732359278657193580493324467258802863, 4379499308310772821004090447650785095356643590411706358119239166662089428685562719233435615196994728767593223519226235062647670077854687031681041462632566890129595506430188602238753450337691441293042716909901692570971955078924699306873191983953501093343423248482960643055943413031768521782634679536276233318, 85256449776780591202928235662805033201684571648990042997557084658000067050672130152734911919581661523957075992761662315262685030115255938352540032297113615687815976039390537716707854569980516690246592112936796917504034711418465442893323439490171095447109457355598873230115172636184525449905022174536414781771, 50576597458517451578431293746926099486388286246142012476814190030935689430726042810458344828563913001012415702876199708216875020997112089693759638454900092580746638631062117961876611545851157613835724635005253792316142379239047654392970415343694657580353333217547079551304961116837545648785312490665576832987, 96868738830341112368094632337476840272563704408573054404213766500407517251810212494515862176356916912627172280446141202661640191237336568731069327906100896178776245311689857997012187599140875912026589672629935267844696976980890380730867520071059572350667913710344648377601017758188404474812654737363275994871, 4881261656846638800623549662943393234361061827128610120046315649707078244180313661063004390750821317096754282796876479695558644108492317407662131441224257537276274962372021273583478509416358764706098471849536036184924640593888902859441388472856822541452041181244337124767666161645827145408781917658423571721, 18237936726367556664171427575475596460727369368246286138804284742124256700367133250078608537129877968287885457417957868580553371999414227484737603688992620953200143688061024092623556471053006464123205133894607923801371986027458274343737860395496260538663183193877539815179246700525865152165600985105257601565]
quadratic_residue = -1
for i in ints:
#print(modular_exp(i,((p-1)//2), p))
if modular_exp(i,((p-1)//2), p) == 1:
quadratic_residue = i
break
#print(quadratic_residue)
res = modular_exp(quadratic_residue,(p+1)//4, p)
return res if (p-res)%p < res else (p-res)%p
if __name__ == "__main__":
# print(gcd(26513, 32321))
# print(extended_euclidean(26513, 32321))
# sol3()
#print(modular_exp(273246787654,65536,65537))
# 근데 페르마 소정리에 의해서...
# a^(p-1) ≡ 1 (mod p)
#sol4()
#print(legendre_symbol())
gcd, extended GCD
1
2
3
4
5
6
7
8
9
10
11
12
def gcd(a,b):
if b==0:
return a
return gcd(b,a%b)
def extended_euclidean(a,b):
if b==0:
return a,1,0
gcd,x1,y1=extended_euclidean(b,a%b)
x=y1
y=x1-(a//b)*y1
return gcd,x,y
modular arithmetic 2
1
2
3
4
5
6
7
8
9
def modular_exp(a,b,m): #
e = bin(b)[2:]
T = 1
G = a
for i in e[::-1]:
if i == '1':
T = (T * G) % m
G = (G * G) % m
return T
그냥 pow(a,b,m) 함수를 사용하면 c로 구현된 빠른 함수로 계산되는것 같다
modular inverting
풀때 손으로 계산한거같은데
a^(p-2) % p = a^(-1)
quadratic residue
find the quadratic residue and then calculate its square root. 답이 2개라면 작은것을 제출.
Legendre Symbol
;;
modular square root
CRT
adrien’s signs
modular binomials
This post is licensed under CC BY 4.0 by the author.