Factoring Carmichael Numbers

Andrew Walker <[email protected]>
Newsgroups gmane.comp.mathematics.pari.devel
Message-ID <[email protected]>
I've two suggestions which may or may not be useful, but should be fun to experiment with!

First is the one line factoring algorithm.

http://wrap.warwick.ac.uk/54707/1/WRAP_Hart_S1446788712000146a.pdf

Has Pari code! Just not sure what to do with it if it returns a composite factor.
More trial division?

Second is Pollards P-1 algorithm.

Wiki description:
Pollard's p − 1 algorithm - Wikipedia

One line code using pari is here:

Pollard p-1 in Pari/GP

in the answers.

Also check out
https://web.ma.utexas.edu/users/voloch/mathinfo3.html

has a link to some Pari code he has written if you scroll down, I haven't checked
or tested any of these!

For P-1 at least you can decrease the limit B if a composite factor is returned.

Andrew

*****************************************************************

Dear Pari Fans,

I am pleased to announce a new method to factorise Carmichael numbers which is based on Lucas sequences. Whether it is utile or futile I shall leave up to you to judge.

Carmichael numbers, n, have the property that a^n==a mod n for all bases a. For odd prime n over a quadratic polynomial x^2-P*x+Q has the property that Q^((n-1)/2)==kronecker(Q,n) mod n. Thus the polynomial x^2-x+a^2 implies a^n==a mod n. Rather we use the polynomial x^2-(a^2-2)*x+1 over which a quick binary chain can be computed. The idea to factor Carmichael numbers is to take the g.c.d with n of x^(2*(n-1))-1 or of x^(2*n)-x^2. The algorithm takes the factors of non trivial g.c.ds and recurses the work on the two factors and so on over the respective g.c.ds. The function returns a vector of the complete factorisation of n.

{global(nm1);} \\obsolete
                                        
{Cf(n)=nm1=n-1;vecsort(CF(n));} // main function

{CF(N)=my(k,a,lu,lv,i,g,V1,V2);while(1,

k=Mod(random(1000000)+3,N); \\ pool for random numbers

a=k^2-2;lu=2;lv=a; \\ initial Lucas sequence values

forstep(i=exponent(nm1),1,-1,
if(bittest(nm1,i),
lu=lu*lv-a;lv=lv*lv-2,
lv=lu*lv-a;lu=lu*lu-2));

g=lift(gcd(lu*lv-2*a,N)); \\ test with penultimate bit = 0

if(g<2,g=lift(gcd(lv*lv-2-a,N))); \\ test with penultimate bit = 1

if(g>1, \\ if g.c.ds on non trival factors recurse

if(ispseudoprime(g),V1=[g],V1=CF(g));

Paul and anyone else interested, I've been thinking about this and can suggest two other methods trhat might be worth experimenting with.

First is the one line factoring algorithm



g=N/g;if(ispseudoprime(g),V2=[g],V2=CF(g));

return(concat(V1,V2))));} \\ send back the factorisations \\ end of program


All timings were done on a single core of a 1.7GHz Celeron laptop with 1GB of memory allocated. For the 3808 digit number [1] with 662 factors:
23.0 seconds using Pari/GP's factor().
21.6 seconds using the above code.

For the 43779 digit number [1] with 5616 factors 5,443.5 seconds. The function factor() ran out of memory after 21 hours and did not complete the task it was given.

With a smaller amount of allocated memory the 16432 digit number [2] with 8 factors takes about 230 seconds.

This new algorithm is easily made parallel. It would be wise to switch to "factor()" below a certain length threshold on recursion.

[1] https://github.com/drazioti/Carmichael/tree/master/Tables/800_to_10000_factors

[2] https://listserv.nodak.edu/cgi-bin/wa.exe?A2=NMBRTHRY;a892cf10.2106&S=

Best,

Paul Underwood

| 
| 
| 
|  |  |

 |

 |
| 
|  | 
Pollard p-1 in Pari/GP

I would like to implement the Pollard p-1 algorithm in Pari/GP but I failed. Here is my code. I am confused with...
 |

 |

 |

in the answers




| 
| 
|  | 
Pollard's p − 1 algorithm - Wikipedia

The factors it finds are ones for which the number preceding the factor, p − 1, is powersmooth; the essential ob...
 |

 |

 |
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.