Test de Rabbin Miller (nombre premier)

Portrait de trax

Petit code effectuant le test de Rabbin-Miller utilisant la librairie de calcul gmp

static int rabbin(int a_, mpz_t p){
 
	mpz_t temp;
	mpz_t r;
	mpz_t a;
	mpz_t q;
	mpz_t pm;
	mpz_t i;
 
	int moinsUn = 0;
 
	mpz_init(temp);
 
	mpz_init_set(r,p);
	mpz_init_set(pm,p);
	mpz_sub_ui(pm,pm,1);
	mpz_init_set_ui(a,a_);
	mpz_init_set_ui(q,0);
 
 
	mpz_sub_ui(r,r,1);
	do{
		mpz_cdiv_q_2exp(r,r,1);
		mpz_mod_ui(temp, r, 2);
		mpz_add_ui(q,q,1);
	}while (mpz_cmp_ui(temp,0) == 0);
	/**
	 * Nous avons q = r2^{pp}
	*/
 
	mpz_powm (a, a, r, p);
 
	if(mpz_cmp_ui(a, 1) == 0){
		return 0; /* le nombre est considere comme premier */
	}
 
	mpz_init_set_ui(i,0);
	while(mpz_cmp(i, q) < 0){
		mpz_powm_ui(a,a,2,p);
 
		if(mpz_cmp(a, pm) == 0){
			moinsUn = 1;
		}else if(mpz_cmp_ui(a, 1) == 0){
			if(moinsUn == 1 || i == i){
				return 0; /* le nombre est considere comme premier */
			}else{
				return -1; /* compose */
			}
		}
		mpz_add_ui(i,i,1);
	}
 
	return -1;
 
}
Domaine: 

Commentaires

Portrait de coco

static ?

Portrait de trax

Le mot clef static devant une fonction permet de dire au compilateur qu'elle n'est visible que dans le fichier ou elle est
--
2B G33K || !2B

2B G33K || !2B