| 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);
)
}