/* Factoring by determining how much over the mark a guess
* at phi(n) is. This method is only valid for an RSA composite number,
* if gives junk answers for others.
*/
**#include** <stdio.h>
**#include** "isqrt.c"
/* Modular arithmetic routines */
**#include** "xpymn.c"
**#include** "xbyymn.c"
**#include** "xtoymn.c"
main () { long n,s,p,q,test,guess,x,y,oversht;
/* get number to work on */
printf ("Product of two odd primes: N=\n");
scanf("%ld",&n); printf ("N=%ld\n",n);
if (n<0) {
printf ("N must be greater than zero\n"); return 1;
} else if (0 == (n & 1)) {
printf ("N must be odd, this number has a factor of 2\n"); return 2;
}
/* Form a good guess for phi (which could have been supplied) */
s = isqrt(n); guess = n-s-s+1; /* known to not undershoot */
/* Compute the overshoot of the guess for phi. */
test = xtoymn((long)2,guess,n); oversht = 0;
while (test != 1) {
if ( test & 1 ) { test += n; }
test >>= 1; oversht++;
}
/* Actually, if test is not an explicit power of two, you know
* you have overshot by at least log2(n), but we'll ignore that speedup here.
*/
/* derive actual phi */
guess -= oversht;
/* and try to factor by it. */
y = (n-guess+1)/2; x = isqrt(y*y-n);
p = y-x; q = y+x;
if (p*q==n) {
printf ("Factors: %ld and %ld\n",p,q);
} else {
printf ("N is not the product of TWO prime numbers?\n");
printf (" (Or has very very very small order)\n");
printf (" but we know lambda(N) (The actual order)\n");
printf (" is a multiple of %ld. *IF* N is the product of two\n", guess);
printf (" primes, then phi(N) is also a multiple\n");
}
return p;
}

# Go to ...

This page is http://www.cc.utah.edu/~nahaj/factoring/phiover.c.html
© Copyright 2003 by John Halleck, All Rights Reserved.
This snapshot was last modified on December 24th, 2013