Bill Allombert on Tue, 11 Feb 2020 18:39:44 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Primality test similar to the AKS test |
On Tue, Feb 11, 2020 at 04:36:28PM +0000, Predrag Terzic wrote: > Here is a working pari/gp implementation of my variation (see here<https://mathoverflow.net/questions/287560/primality-test-similar-to-the-aks-test>) of AKS test<https://en.wikipedia.org/wiki/AKS_primality_test> . Problem is that my code is extremely slow. Is there something that I could change in code to achieve a better running time? > > xmat(r,n,a) = [2*x, a; 1, 0]*Mod(1,x^r-1)*Mod(1,n); > AKSv2(n)={ > if(!(ispower(n)==0),print("Composite!"),r=2; > while(!(gcd(n,r)==1),r++);while(znorder(Mod(n,r))<=(log(n)/log(2))^2,r++;while(!(gcd(n,r)==1),r++)); > i=0;for(a=2,min(r,n-1),if(Mod(n,a)==0,print("Composite!");i++;break)); > if(i==0,if(n<=r,print("Prime!"),j=0;for(a=1,floor(sqrt(eulerphi(r))*(log(n)/log(2))),my(xp = xmat(r,n,a)^n*[x,1]~); > if(!(xp[2] == Mod(x*Mod(1,n),x^r-1)^n),print("Composite!");j++;break));if(j==0,print("Prime!")))))} AKS is slow in general. You can speed it up by replacing xmat by operations with POLMOD. I join a version I have since 2007. Cheers, Bill.
aks6(n)= { local(r,l,a,bornesup,X); if( ispower(n), return(0);break, r=2; l=log(n)/log(2); while( 1==1, if( gcd(r,n)==1, if( znorder(Mod(n,r))<(l^2),r++,break), r++) ); for( a=2, r, if( gcd(a,n) != 1, return(0);break)); if( n<5690035 && !n>r, return(1);break); bornesup=floor(sqrt(eulerphi(r))*l); X = Mod(Mod(1,n)*x,x^r-1); for( a=1, bornesup, if( (X+a)^n != X^n+a, return(0);break); ); return(1); ) }