#!/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]),