www.pudn.com > miracl.zip > BRENT.C
/* * Program to factor big numbers using Brent-Pollard method. * See "An Improved Monte Carlo Factorization Algorithm" * by Richard Brent in BIT Vol. 20 1980 pp 176-184 * * Copyright (c) 1988-1997 Shamus Software Ltd. */ #include#include #define mr_min(a,b) ((a) < (b)? (a) : (b)) int main() { /* factoring program using Brents method */ long k,r,i,m,iter; big x,y,z,n,q,ys,c3; char *mem; #ifndef MR_NOFULLWIDTH mirsys(50,0); #else mirsys(50,MAXBASE); #endif mem=memalloc(7); /* allocate space for 7 bigs */ x=mirvar_mem(mem,0); /* bigs have index from 0-6 */ y=mirvar_mem(mem,1); ys=mirvar_mem(mem,2); z=mirvar_mem(mem,3); n=mirvar_mem(mem,4); q=mirvar_mem(mem,5); c3=mirvar_mem(mem,6); convert(3,c3); printf("input number to be factored\n"); cinnum(n,stdin); if (isprime(n)) { printf("this number is prime!\n"); return 0; } m=10L; r=1L; iter=0L; do { printf("iterations=%5ld",iter); convert(1,q); do { copy(y,x); for (i=1L;i<=r;i++) mad(y,y,c3,n,n,y); k=0; do { iter++; if (iter%10==0) printf("\b\b\b\b\b%5ld",iter); fflush(stdout); copy(y,ys); for (i=1L;i<=mr_min(m,r-k);i++) { mad(y,y,c3,n,n,y); subtract(y,x,z); mad(z,q,q,n,n,q); } egcd(q,n,z); k+=m; } while (k