#include int main(int argc, char *argv[]) { unsigned long p, i; mpz_t pp, ll, aux; mpz_init(pp); mpz_init(ll); mpz_init(aux); /* Inicializamos as variáveis pp, ll e aux. */ p = atol(argv[1]); /* Lemos p. */ mpz_set_ui(ll,(long)(4)); mpz_ui_pow_ui(aux,(long)(2),p); mpz_sub_ui(pp,aux,(long)(1)); /* Calculamos pp = Mp. */ for ( i = 1 ; i + 2 <= p ; i++ ) { mpz_powm_ui(aux,ll,(long)(2),pp); /* Elevamos ll ao quadrado modulo pp... */ mpz_sub_ui(ll,aux,(long)(2)); /* ... e subtraimos 2, para calcular s(p-2) modulo Mp. */ } if ( mpz_sgn(ll) == 0 ) { printf("M%ld é primo.\n",p); } else { printf("M%ld é composto.\n",p); } /* Imprimimos as conclusões. */ return(0); }