Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Testa se n é primo com o Teste de Miller na base b. Retorna true se n for
- //[pseudo]primo para b.
- bool miller(ll n, ll b){
- ll q = n-1, k = 0, r, i = 0;
- while ((q & 1) == 0){
- q >>= 1;
- ++k;
- }
- r = exp_mod(b,q,n);
- if (r == 1) return true;
- while (i < k) {
- if (r == n-1) return true;
- r = produc_mod(r, r, n);
- ++i;
- }
- return false;
- }
- //Determina se um número é primo usando o teste de Miller para 4 bases
- //(determinístico para n < 10^12).
- bool isprime(long long n){
- const int n_bases = 4;
- int j, bases[] = {2, 13, 23, 1662803};
- if (n < 0) n = -n;
- if (n <= 1) return false;
- for (j = 0; j < n_bases; ++j) {
- if (n == bases[j]) return true;
- if (n % bases[j] == 0) return false;
- if (!miller(n, bases[j])) return false;
- }
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement