Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,19 @@
|
|||
var BN=Import("zklBigNum");
|
||||
fcn modEq(a,b,p) { (a-b)%p==0 }
|
||||
fcn legendre(a,p){ a.powm((p - 1)/2,p) }
|
||||
|
||||
fcn tonelli(n,p){ //(BigInt,Int|BigInt)
|
||||
_assert_(legendre(n,p)==1, "not a square (mod p)"+vm.arglist);
|
||||
q,s:=p-1,0;
|
||||
while(q.isEven){ q/=2; s+=1; }
|
||||
if(s==1) return(n.powm((p+1)/4,p));
|
||||
z:=[BN(2)..p].filter1('wrap(z){ legendre(z,p)==(p-1) });
|
||||
c,r,t,m,t2:=z.powm(q,p), n.powm((q+1)/2,p), n.powm(q,p), s, 0;
|
||||
while(not modEq(t,1,p)){
|
||||
t2=(t*t)%p;
|
||||
i:=1; while(not modEq(t2,1,p)){ i+=1; t2=(t2*t2)%p; } // assert(i<m)
|
||||
b:=c.powm(BN(1).shiftLeft(m-i-1), p);
|
||||
r,c,t,m = (r*b)%p, (b*b)%p, (t*c)%p, i;
|
||||
}
|
||||
r
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
ttest:=T(T(10,13), T(56,101), T(1030,10009), T(44402,100049),
|
||||
T(665820697,1000000009), T(881398088036,1000000000039),
|
||||
T("41660815127637347468140745042827704103445750172002", BN(10).pow(50) + 577),
|
||||
T(1032,10009) );
|
||||
foreach n,p in (ttest){ n=BN(n);
|
||||
r:=tonelli(n,p);
|
||||
assert((r*r-n)%p == 0,"(r*r-n)%p == 0 : %s,%s,%s-->%s".fmt(r,n,p,(r*r-n)%p));
|
||||
println("n=%d p=%d".fmt(n,p));
|
||||
println(" roots: %d %d".fmt(r, p-r));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue