Large Primes
<Text-field layout="_pstyle4" style="_pstyle4">Prime listing, primality testing, and prime factorizatrion</Text-field>
<Text-field layout="_pstyle5" style="_pstyle5">Prime listing</Text-field>
primelist:=proc(n) local candidatelist, i, propermultiple; candidatelist:=array([seq(i,i=1..n)]); candidatelist[1]:=0; for i from 2 to floor(sqrt(n)) do if candidatelist[i] <> 0 then for propermultiple from 2*i to n by i do candidatelist[propermultiple]:=0 end do; end if; end do; {seq(candidatelist[i],i=1..n)} minus {0}; end proc:primelist(100);NiM8OyIiIyIiJCIiJiIiKCIjNiIjOCIjPCIjPiIjQiIjSCIjSiIjUCIjVCIjViIjWiIjYCIjZiIjaCIjbiIjciIjdCIjeiIjJCkiIyopIiMoKg== map(x->[nops(primelist(x))],[seq(10^k,k=1..6)]);NiM3KDcjIiIlNyMiI0Q3IyIkbyI3IyIlSDc3IyIlI2YqNyMiJilceQ==newprimelist:=proc(n) local m, x,j,i; m:=floor((n-1)/2); x:=array([seq(1,i=1..m)]); for j from 1 to floor(evalf((sqrt(n)-1)/2)) do if x[j]=1 then for i from 2*j*(j+1) to m by 2*j+1 do x[i]:=0; end do; end if; end do; {seq(x[i]*(2*i+1),i=1..m)} minus {0} union {2}; end proc:newprimelist(100);NiM8OyIiIyIiJCIiJiIiKCIjNiIjOCIjPCIjPiIjQiIjSCIjSiIjUCIjVCIjViIjWiIjYCIjZiIjaCIjbiIjciIjdCIjeiIjJCkiIyopIiMoKg==ourlist:=convert(newprimelist(10^7),`list`):ourlist[500000];NiMiKCh5b3Q=
<Text-field layout="_pstyle5" style="_pstyle5">Primality testing</Text-field>primetest:=proc(n) local upperlimit,trialdivisor; upperlimit:=floor(evalf(sqrt(n))); for trialdivisor from 2 to upperlimit do if modp(n,trialdivisor)=0 then return(False); end if; end do; return(True); end proc: starttime:=time(): primetest(2^31-1);time()-starttime;NiNJJVRydWVHNiI=NiMkIiRJIiEiJA==primetest(ithprime(500000)*ithprime(500001));time()-starttime;NiNJJkZhbHNlRzYiNiMkIiZgZCIhIiQ=off;newprimetest:=proc(n) local upperlimit, i; upperlimit:=floor(evalf(sqrt(n))); for i from 1 while ourlist[i]<=upperlimit do if modp(n,ourlist[i])= 0 then return(False); end if; end do; return(True); end proc:starttime:=time():newprimetest(2^31-1); time()-starttime;NiNJJVRydWVHNiI=NiMkIiM/ISIknewprimetest(ithprime(500000)*ithprime(500001)); time()-starttime;NiNJJkZhbHNlRzYiNiMkIiUkeSIhIiQ=Prime factorizationprimefactorization:=proc(n) local primefactors, nstar, upperlimit, trialdivisor; primefactors:=[]; nstar:=n; upperlimit:=floor(evalf(sqrt(nstar))); trialdivisor:=2; while trialdivisor <= upperlimit do if modp(nstar,trialdivisor)=0 then primefactors:=[op(primefactors),trialdivisor]; nstar:=nstar/trialdivisor; upperlimit:=floor(evalf(sqrt(nstar))); else trialdivisor:=trialdivisor+1; end if; end do; primefactors:=[op(primefactors),nstar]; {seq([x,ListTools[Occurrences](x,primefactors)],x in primefactors)}; end proc:starttime:=time():primefactorization(2973087990183122315334); time()-starttime;NiM8JzckIixeKD5KQDYiIiI3JCIoKHlvdEYmNyQiIiNGJjckIiUqKj5GJjckIiIkRio=NiMkIiYvXCMhIiQ=newprimefactorization:=proc(n) local primefactors, nstar, upperlimit, i, trialdivisor; primefactors:=[]; nstar:=n; upperlimit:=floor(evalf(sqrt(n))); i:=1; trialdivisor:=ourlist[i]; while trialdivisor <= upperlimit do if modp(nstar,trialdivisor)=0 then primefactors:=[op(primefactors),trialdivisor]; nstar:=nstar/trialdivisor; upperlimit:=floor(evalf(sqrt(nstar))); else i:=i+1; trialdivisor:=ourlist[i]; end if; end do; primefactors:=[op(primefactors),nstar]; {seq([x,ListTools[Occurrences](x,primefactors)],x in primefactors)}; end proc:starttime:=time():newprimefactorization(2973087990183122315334); time()-starttime;NiM8JzckIiIkIiIjNyQiLF4oPkpANiIiIjckIiUqKj5GKTckIigoeW90Rik3JEYmRik=NiMkIiUkMyMhIiQ=newprimefactorization(9199838343019266106321698);Error, "invalid subscript selector" time = 3.21, bytes = 83555614off;ifactor(255678904536136571239);NiMqJi0lIUc2IyIsKltqPCFHIyIiIi1GJTYjIixeKD5KQDZGKA==
<Text-field layout="_pstyle4" style="_pstyle4">Fermat numbers</Text-field>fermatnumber:=n->2^(2^n)+1:seq(fermatnumber(n),n=0..4);NiciIiQiIiYiIzwiJGQjIiZQYic=seq(primetest(fermatnumber(n)),n=0..4);NidJJVRydWVHNiJGI0YjRiNGIw==fermatnumber(5);NiMiKyhIblxIJQ==primetest(%);NiNJJkZhbHNlRzYistarttime:=time():newprimefactorization(fermatnumber(5));time()-starttime;NiM8JDckIiRUJyIiIjckIig8L3EnRiY=NiMkIiNdISIkfermatnumber(6);NiMiNTw7YjRQMlduVz0=starttime:=time(): newprimefactorization(fermatnumber(6)); time()-starttime;NiM8JDckIi9AMkpAL0duIiIiNyQiJ3hURkYmNiMkIiV0QCEiJA==startime:=time(): f:=fermatnumber(10): trialdivisor:=4097: while modp(f,trialdivisor) <> 0 do trialdivisor:=trialdivisor+4096: end do: trialdivisor; time() - starttime;NiMiKXhEZlg=NiMkIiVgQSEiJA==fprime:=f/trialdivisor: while modp(fprime,trialdivisor) <> 0 do trialdivisor:=trialdivisor+4096: end do: trialdivisor; time() - starttime;NiMiKzQ9LihbJw==NiMkIiZPOiIhIiQ=st:=time(): f:=fermatnumber(7): trialdivisor:=513: while modp(f,trialdivisor) <> 0 do trialdivisor:=trialdivisor+512: end do: trialdivisor; time() -st;Warning, computation interruptedNiMiKnAoM0lVNiMkIiVYTiEiJA==pepintest:= proc(n) local m, a; m:=fermatnumber(n); a:=3; to 2^n-1 do a:=modp(a^2,m); end do; if modp(a,m) = m-1 then return("prime") else return("composite"); end if; end proc:starttime:=time():pepintest(7);time()-starttime;NiNRKmNvbXBvc2l0ZTYiNiMkIiNxISIk
<Text-field layout="_pstyle4" style="_pstyle4">Mersenne numbers</Text-field>mersennenumber:= n->2^n-1:seq(mersennenumber(n),n=1..10);NiwiIiIiIiQiIigiIzoiI0oiI2oiJEYiIiRiIyIkNiYiJUI1select(n->isprime(mersennenumber(n)),select(isprime,[seq(i,i=1..257)]));NiM3LiIiIyIiJCIiJiIiKCIjOCIjPCIjPiIjSiIjaCIjKikiJDIiIiRGIg==ifactor(mersennenumber(67));NiMqJi0lIUc2IyIqQHhxJD4iIiItRiU2IyItKEdkI1E9d0Yopseudoprimetest:=proc(n) if modp(3&^(n-1),n)=1 then return("test fails") else return("composite") end if; end proc:pseudoprimetest(mersennenumber(23));NiNRKmNvbXBvc2l0ZTYipseudoprimetest(mersennenumber(67));NiNRKmNvbXBvc2l0ZTYilucaslehmertest:=proc(p) local m, r; m:=mersennenumber(p); r:=4; to p-2 do r:=modp(r^2-2,m) end do; if r=0 then return("prime") else return("composite") end if; end proc:lucaslehmertest(521);NiNRJnByaW1lNiI=select(n->evalb(lucaslehmertest(n)="prime"),select(isprime,[seq(i,i=1..5000)])); NiM3NSIiJCIiJiIiKCIjOCIjPCIjPiIjSiIjaCIjKikiJDIiIiRGIiIkQCYiJDInIiV6NyIlLkEiJSJHIyIlPEsiJWBVIiVCVw==st:=time(): primefactorization(mersennenumber(67)); time()-st;NiM8JDckIi0oR2QjUT13IiIiNyQiKkB4cSQ+RiY=NiMkIidccXohIiQ=
<Text-field layout="_pstyle4" style="_pstyle4">Prime Certificates</Text-field>primecertificate:=proc(n) local primedivisors, exponents, a; primedivisors:={seq(ifactors(n-1)[2][i][1],i=1..nops(ifactors(n-1)[2]))}; exponents:=map(x->(n-1)/x,primedivisors); a:=2; while member(1,map(x->modp(a&^x,n),exponents)) do a:=a+1 end do; return[n,a,primedivisors]; end proc:n:=ithprime(10^4);NiM+JSJuRyInSFo1primecertificate(n);NiM3JSInSFo1IiM3PCYiIiMiIzgiIz4iI2A=newprimecertificate:=proc(n) local primedivisors, exponents, a; if n<10^7 then return(n) else primedivisors:={seq(ifactors(n-1)[2][i][1],i=1..nops(ifactors(n-1)[2]))}; exponents:=map(x->(n-1)/x,primedivisors); a:=2; while member(1,map(x->modp(a&^x,n),exponents)) do a:=a+1 end do; return([n,a,map(newprimecertificate,primedivisors)]) end if; end proc: newprimecertificate(mersennenumber(521));NiM3JSJodF5yMDo2SEdTZDdRazsoKip6KT43UCFlM1siUjZqSHhcYmE5bVMnZkQ3X2dsKFIkPVZiPWZNWSVSNGFJVixJTiVwc0AkUiIzKnorPilccjQxOGd3emtvIiIkPD4iIiNGJSIiJiIjNiIjPCIjSiIjVCIjYCIkSiIiJGQiIiRAJiIlODsiJUpGIiUiPikiJlRFJSImIlteIiYib2giJyIqKTQlIicsIWUpIigsZ3UmIiheUWkoNyUiK2hQZCtDRiU8J0YnRigiIzgiJFokIiVqOzclIjAib2UmKik0OTMiRio8KUYnRiVGKEY+IiQkbyIlTDkiJjRPIzclIjxUUSM+XzVbKCk9Uk0zTDxGJTwnRidGKEY+IiYkekc3JSIzPElGPCYqZUQ8T0YqPCdGJ0YlIiIoIiUiPiQ3JSItZFhSXVpuRic8JUYnRk43JSIseCRHIyk0Q0ZOPCZGJ0YlIiQ0IiIoaD1AKjclIiksMjZNIiM6PCdGJ0YoRj4iIz4iJSJRIjclIipUOXczJEYqPCdGJ0YlRihGPiImIltcNyUiLEBSWUZhJ0YqPChGJ0YlRihGTkY+IihqZCpINyUiMDYiZU45JkhYIkZOPChGJ0YlRihGTkY+NyUiK25cT01ERiU8JkYnRiVGTiIoKkc/Jyk=
<Text-field layout="_pstyle4" style="_pstyle4">Finding large primes</Text-field>ournextprime:=proc(n) local p; p:=n; while primetest(p)=False do p:=p+1 end do: return(p); end proc: ournextprime(24);NiMiI0g=newpseudoprimetest:=proc(n) if modp(2&^(n-1),n)=1 and modp(3&^(n-1),n)=1 and modp(5&^(n-1),n)=1 then return("test fails") else return("composite") end if; end proc:nextprimecandidate:=proc(n) local p; p:=n; while newpseudoprimetest(p)="composite" do p:=p+1 end do; return(p); end proc:nextprimecandidate(10^100);NiMiYHFuLSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyI=starttime:=time(): ournextprime(10^12); time()-starttime;NiMiLlIrKysrKyI=NiMkIiVWPyEiJA==starttime:=time(): nextprimecandidate(10^12); time()-starttime;NiMiLlIrKysrKyI=NiMkIiIhRiQ=primecertificatetest:=proc(n,p) local primedivisors, exponents, a; primedivisors:={seq(ifactors((n-1)/p)[2][i][1],i=1..nops(ifactors((n-1)/p)[2]))} union {p}; exponents:=map(x->(n-1)/x,primedivisors); a:=2; while modp(a&^(n-1),n)=1 do if member(1,map(x->modp(a&^x,n),exponents)) then a:=a+1 else return("prime") end if; end do; return("composite"); end proc:primecertificatetest(36,5);NiNRKmNvbXBvc2l0ZTYiprimecertificatetest(41,5);NiNRJnByaW1lNiI=largeprime:=proc(d) local p, pprime,i; i:=1; p:=ithprime(RandomTools[Generate](integer(range=1..10^4))); while p<10^d do pprime:=RandomTools[Generate](integer(range=10^6..10^7))*p+1; while primecertificatetest(pprime,p)="composite" do pprime:=RandomTools[Generate](integer(range=10^6..10^7))*p+1; end do; p:=pprime; end do; return(p); end proc:starttime:=time(): largeprime(100); time()-starttime;NiMiY3FIPF1iZHF1IUdbVHEmZSd5emJhcTZydCxhcFpnXUZ6PFE1Iz1Qbyk+YFBsZEYpKTN5TTE7bVcuJA==NiMkIiUoeiUhIiQ=