#include #include #include #include int main(int argc, char **argv) { int N = 0; if(argc > 1) { N = atoi(argv[1]); } else { printf("Please specify a number to factor...\n"); exit(1); } if(N <= 0) { printf("'%s' doesn't appear to be a number greater than zero...\n",argv[1]); exit(1); } int base,x,xsqr; int y,ysqr; base = sqrt(N); // check for square root if(base * base == N) { printf("Factorization: %d = %d * %d\n",N,base,base); exit(0); } int count = 0; for(x = base+1; (float)x * (float)x < (float)MAXINT && (count < (2 * N)); x++) { xsqr = x * x; ysqr = xsqr - N; y = (int)sqrt((double)ysqr); if(y * y == ysqr) { // both x+y and x-y should be a factor of N int factor1, factor2; // check x+y factor1 = x+y; if((factor1 != N) && (factor1 != 1) && (N % factor1 == 0)) { factor2 = N / factor1; printf("Factorization: %d = %d * %d\n",N,factor1,factor2); exit(0); } } count++; } printf("No non-trivial factorization found for %d\n",N); }