BOOLEAN prime_p(unsigned long int number) { int witnesses[] = { 2, 3, 5, 7, 11, 13, 17, 19 }; /* If number is odd and not equal to 1, perform Rabin-Miller test */ if ((number & 1) && (number ^ 1)) { int witness; /* Try with witnesses 2 through min(9, number) */ for (witness = 0; witness < 8 && witnesses[witness] < number; witness++) { /* If Rabin-Miller fails on this witness, the number is not prime */ if (!rabin_miller(number, witnesses[witness])) { return FALSE; } } /* If Rabin-Miller didn't fail on any of the witnesses, assume it is prime */ return TRUE; } else { /* If number is not odd or is 1, it is only prime if it is 2 */ return (number == 2); } }
void gen_prime(unsigned int b_size, mpz_t res) { gmp_randstate_t state; struct timeval r_time; gettimeofday(&r_time,NULL); gmp_randinit_default(state); gmp_randseed_ui(state,(r_time.tv_sec * 1000) + (r_time.tv_usec / 1000)); do { mpz_urandomb(res,state,b_size); mpz_setbit(res,0); mpz_setbit(res,b_size - 1); mpz_setbit(res,b_size - 2); } while(rabin_miller(res,20,state) == 0); gmp_randclear(state); }