| @@ -40,8 +40,20 @@ def decaf_encode_from_E(X,Y): | |||||
| def isqrt(x): | def isqrt(x): | ||||
| assert(x.is_square()) | assert(x.is_square()) | ||||
| if x == 0: return 0 | |||||
| else: return 1/sqrt(x) | |||||
| def op(st,sh,add): | |||||
| x,y,z = st | |||||
| return x,st[1]^(2^sh)*st[add],y | |||||
| ops = [(1,0),(1,0),(3,1),(6,1),(1,0),(12,2),(25,1),(25,2),(50,2),(125,1),(2,0),(1,0)] | |||||
| st = (x,x,x) | |||||
| for sh,add in ops: | |||||
| st = op(st,sh,add) | |||||
| #assert st[2] == x^(2^252-3) | |||||
| i = sqrt(F(-1)) | |||||
| if st[1] == 1: return st[2] | |||||
| else: return st[2] * i | |||||
| def decaf_encode_from_E_c(X,Y): | def decaf_encode_from_E_c(X,Y): | ||||
| Z = F.random_element() | Z = F.random_element() | ||||