/* This package requires the GNU MP package available at: http://www.swox.com/gmp/ To compile the program run: gcc -lm -lgmp -o germain germain.c */ #include #include #include void mpz_nextgermain(mpz_t, mpz_t); void mpz_nextinterval(mpz_t [], mpz_t []); main(int argc, char *argv[]) { int n, num, Pig; double PigLog; mpz_t cogermain, germain, gertail, Interval[2]; char filename[10]; FILE *gprimes; num = 10; Pig = 0; PigLog = 0; mpz_init(germain); mpz_init(cogermain); mpz_init(gertail); mpz_init(Interval[0]); mpz_init(Interval[1]); mpz_ui_pow_ui(Interval[0], 10, 18); mpz_ui_pow_ui(Interval[1], 10, 9); mpz_add(Interval[1], Interval[0], Interval[1]); for ( n = 0 ; n < num ; n++ ) { sprintf(filename, "%.2d.gprimes", mpz_sizeinbase(Interval[0], 10) - 1); printf("Creating file %s.\n", filename); if ( (gprimes = fopen(filename, "a")) == NULL ) { fprintf(stderr, "can't open file\n"); exit(1); } mpz_nextgermain(germain, Interval[0]); while ( mpz_cmp(germain, Interval[1]) < 0 ) { mpz_sub(gertail, germain, Interval[0]); gmp_fprintf(gprimes, "%Zd\n", gertail); mpz_mul_ui(cogermain, germain, 2); mpz_add_ui(cogermain, cogermain, 1); Pig++; PigLog = PigLog + log( mpz_get_d(germain) ) * log( mpz_get_d(cogermain) ); mpz_nextgermain(germain, germain); } gmp_fprintf(gprimes, "(%Zd,%Zd) %d %f\n", Interval[0], Interval[1], Pig, PigLog); fclose(gprimes); Pig = 0; PigLog = 0; mpz_nextinterval(Interval, Interval); } } void mpz_nextinterval(mpz_t Outpoint[2], mpz_t Inpoint[2]) { mpz_t Left, Right; mpz_init_set(Left, Inpoint[0]); mpz_init_set(Right, Inpoint[1]); mpz_sub(Right, Right, Left); mpz_mul_ui(Left, Left, 10); mpz_add(Right, Right, Left); gmp_printf("Completed interval (%Zd,%Zd).\n", Left, Right); mpz_set(Outpoint[0], Left); mpz_set(Outpoint[1], Right); mpz_clear(Left); mpz_clear(Right); return; } void mpz_nextgermain(mpz_t Outpoint, mpz_t Inpoint) { mpz_t Germain, CoGermain; mpz_init_set(Germain, Inpoint); mpz_init_set_ui(CoGermain, 4); while ( !mpz_probab_prime_p(CoGermain, 5) ) { mpz_nextprime(Germain, Germain); mpz_mul_ui(CoGermain, Germain, 2); mpz_add_ui(CoGermain, CoGermain, 1); } mpz_set(Outpoint, Germain); mpz_clear(Germain); mpz_clear(CoGermain); return; }