version 1.1, 2001/10/02 11:16:59 |
version 1.2, 2002/09/11 07:26:45 |
|
|
rho1(n)= |
rho1(n)= |
{ |
{ local(x,y); |
local(x,y); |
|
|
|
x=2; y=5; |
x=2; y=5; |
while(gcd(y-x,n)==1, |
while(gcd(y-x,n)==1, |
|
|
} |
} |
|
|
rho2(n)= |
rho2(n)= |
{ |
{ local(m); |
local(m); |
|
|
|
m=rho1(n); |
m=rho1(n); |
if (isprime(m), |
if (isprime(m), |
|
|
} |
} |
|
|
rho(n)= |
rho(n)= |
{ |
{ local(m = factor(n,0)); |
local(m); |
|
|
|
m=factor(n,0); print(m); |
print(m); m = m[,1]; n = m[#m]; |
n=m[length(m[,1]),1]; |
|
if (!isprime(n),rho2(n)); |
if (!isprime(n),rho2(n)); |
} |
} |
|
|
rhobrent(n)= |
rhobrent(n)= |
{ |
{ local(x,y,x1,k,l,p,c,g); |
x=y=x1=2; k=l=p=1; c=0; |
|
|
x1=x=y=2; k=l=p=1; c=0; |
while (1, |
while (1, |
x=(x^2+1)%n; p=(p*(x1-x))%n; c++; |
x=(x^2+1)%n; p=(p*(x1-x))%n; |
|
c++; |
if (c==20, |
if (c==20, |
if (gcd(p,n)>1, break); |
if (gcd(p,n)>1, break); |
y=x;c=0 |
y=x; c=0 |
); |
); |
k--; |
k--; |
if (!k, |
if (!k, |
if (gcd(p,n)>1, break); |
if (gcd(p,n)>1, break); |
|
|
x1=x; k=l; l <<= 1; \\ l = 2*l |
x1=x; k=l; l <<= 1; |
for (j=1,k, x=(x^2+1)%n); |
for (j=1,k, x=(x^2+1)%n); |
y=x; c=0 |
y=x; c=0 |
) |
) |
); |
); |
g=1; |
until (g!=1, |
while (g==1, |
|
y=(y^2+1)%n; |
y=(y^2+1)%n; |
g=gcd(x1-y,n) |
g=gcd(x1-y,n) |
); |
); |
if (g==n,error("algorithm fails")); |
if (g==n, error("algorithm fails")); |
g |
g |
} |
} |