61 lines
1.4 KiB
Python
61 lines
1.4 KiB
Python
#!/usr/bin/python3
|
|
|
|
import math
|
|
n = 0xB640000002A3A6F1D603AB4FF58EC74449F2934B18EA8BEEE56EE19CD69ECF25
|
|
p = 0xB640000002A3A6F1D603AB4FF58EC74521F2934B1A7AEEDBE56F9B27E351457D
|
|
# n = 65000549695646603732796438742359905742570406053903786389881062969044166799969
|
|
# p = 65000549695646603732796438742359905742825358107623003571877145026864184071783
|
|
sqrt_n = int( math.sqrt(n))
|
|
|
|
def lamb(n):
|
|
l = pow(2,(n-1)//3, n)
|
|
l2 = l**2%n
|
|
return min(l,l2)
|
|
# return max(l,l2)
|
|
|
|
def norm(a,b):
|
|
return int(math.sqrt(a**2 + b**2))
|
|
|
|
l = lamb(n)
|
|
print("lambda=",l)
|
|
print("lambda^2=",l**2%n)
|
|
print("")
|
|
# eta = pow(p-2, 2*(p-1)//3,p)
|
|
# print("eta = ", hex(eta))
|
|
# print("eta^2 = ", hex(eta**2%p))
|
|
s = [1,0]
|
|
t = [0,1]
|
|
r = [n,l]
|
|
|
|
while r[-1] > 1:
|
|
d = r[-2] // r[-1]
|
|
r.append(r[-2] - r[-1]*d)
|
|
s.append(s[-2] - s[-1]*d)
|
|
t.append(t[-2] - t[-1]*d)
|
|
|
|
d = r[-2] // r[-1]
|
|
r.append(r[-2] - r[-1]*d)
|
|
s.append(s[-2] - s[-1]*d)
|
|
t.append(t[-2] - t[-1]*d)
|
|
# r[-1] < sqrt_n
|
|
print("s * n + t * l = r")
|
|
for i in range(len(s)):
|
|
print("{} * n + {} * lambda = {}".format( s[i], t[i], r[i]))
|
|
print("")
|
|
|
|
print("sqrt(n)=",sqrt_n,"\n")
|
|
|
|
print("norm:")
|
|
print(norm(r[-1], t[-1]))
|
|
print(norm(r[-2], t[-2]))
|
|
print(norm(r[-3], t[-3]))
|
|
print("")
|
|
|
|
print("v1,v2:")
|
|
for i in range(len(s)):
|
|
print(r[i], -t[i], "\n==>", norm(r[i], t[i]), r[i] < sqrt_n)
|
|
print("")
|
|
# print(r[-1], -t[-1])
|
|
# print(r[-2], -t[-2])
|
|
# print(r[-3], -t[-3])
|
|
# print(r[-2]*t[-3]-r[-3]*t[-2]), |