예제 #1
0
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);

	}

}
예제 #2
0
파일: gen.c 프로젝트: u1v3r/kry-proj02
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);
}