#include #include #include #include char buffer[ 32 ]; long N, a; double number, nextnumber; double digits[ 18 ], array[36][18]; void zeroarrays( void ) { long m,n; for( m=0; m<18; m++) { for( n=0; n<36; n++) { array[n][m] = 0.0; } digits[m] = 0.0; } } double findprimecandidate( double candidate ) { double candidateone, candidatetwo, store; candidateone = candidate * M_PI; candidatetwo = candidate * M_PI * M_PI; while( candidateone > candidate ) { candidateone /= 4.0; } while( candidatetwo > candidate ) { candidatetwo /= 4.0; } if( candidatetwo > candidateone ) store = candidateone; else store = candidatetwo; if( (candidate - store) < (candidate / store) ) return store * 4.0; else return store; } void reconfigureS( double redo ) { double store, fraction; long n, trunc; zeroarrays(); n=0; do{ redo /= 10.0; n++; } while( redo >= 1.0 ); N=n; for(n=N-1; n >= 0; n-- ) { redo *= 10.0; trunc = redo; digits[n] = (double)(trunc); redo -= (double)(trunc); } } long realprime( double candidate, double number ) { double nextnumber; long truncator, spoiled; spoiled = 1; nextnumber = number / candidate; truncator = nextnumber; if( (nextnumber - (float)(truncator)) == 0 ) { a++; printf("\nPrime %d is %g", a, candidate); spoiled = 0; reconfigureS( nextnumber ); } return spoiled; } double reapplyprime( double candidate, double number, long W) { long m, truncator, w; double fraction, store; /* Now get the actual prime number through the new process for finding primes and prime candidates */ if( candidate > 10.0 ) { for( w=W-2; w--;) { truncator = store = (number / candidate ); fraction = store - (double)( truncator ); for( m = w; m--; ) { fraction *= 10.0; candidate /= 10.0; } truncator = fraction; fraction = (double)(truncator); truncator = candidate; candidate = (double)(truncator); for( m = w; m--; ) { candidate *= 10.0; } candidate += fraction; } } truncator = candidate; if( (truncator&1) == 0 ) { truncator += 1; } candidate = (double)(truncator); return candidate; } void enter( void) { long n; double store; printf("\n\nThis program factors the number inputed through a new means.\n"); do{ printf("\n\nMake sure the number of digits is 14>N>1.\nEnter the number of digits:\n\n"); N = atoi( gets( buffer ) ); } while( ( N > 13 ) || ( N < 2 ) ); printf("\n\nEnter the digits in the order from the lowest to the highest - lowest first.\nPress return after each entry.\n\n"); for( n=0; n < N; n++) { do{ printf("\n\nEnter the %d digit:",n+1); digits[ n ] = atof( gets( buffer ) ); } while( (digits[ n ] > 9.0) || (digits[ n ] < 0.0 ) ); } for( n=N-1, store = 0.0; n >= 0; n-- ) { store *= 10.0; store += digits[n]; } number = store; printf("\n\nTest number = %g",number); } void getprime( void ) { long k, m, n, w, W, spoiled, truncator; double store, primecon, candidate, firstcandidate, fraction, doub; W = 1, spoiled = 1, a=0; do{ if( spoiled == 1) { W += 1; } doub = (double)(N) / (double)(W); truncator = doub; if( (doub - (double)(truncator)) > 0.0 ) k = truncator + 1; else k = truncator; for(m = 0, n = 0; (n < N) || (m < k); m++) { for( w=0; w < W; w++, n++ ) { array[ m ][ w ] = digits[ n ]; array[ 2*k - m - 1 ][w] = digits[ n ]; } } for( w = 0, primecon = 1.0; w < W; w++ ) { for(m=0, store=0.0; m < 2*k; m++ ) { store += array[m][w]; } primecon *= store; } firstcandidate = findprimecandidate( sqrt( primecon ) ); printf("\nCandidate = %g PrimeConvolute = %g number = %g", candidate, primecon, number ); candidate = reapplyprime( firstcandidate, number, W); spoiled = realprime( candidate, number ); if( spoiled == 1) { candidate = reapplyprime( firstcandidate * sqrt( 2.0 ), number, W ); spoiled = realprime( candidate, number ); } } while( candidate != 1.0 ); } void main(void) { zeroarrays(); enter(); getprime(); getch(); }