Files
xgcl/sm/sm9/internal/bn256/scripts/lattice.py
T
2026-05-27 23:03:00 +08:00

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]),