zoukankan      html  css  js  c++  java
  • poj3641(Pseudoprime numbers)素性检测+快速幂

    Description

    Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power and divide by p, the remainder is a. Some (but not very many) non-prime values of p, known as base-pseudoprimes, have this property for some a. (And some, known as Carmichael Numbers, are base-a pseudoprimes for all a.)

    Given 2 < p ≤ 1000000000 and 1 < a < p, determine whether or not p is a base-a pseudoprime.

    Input

    Input contains several test cases followed by a line containing "0 0". Each test case consists of a line containing p and a.

    Output

    For each test case, output "yes" if p is a base-a pseudoprime; otherwise output "no".

    Sample Input

    3 2
    10 3
    341 2
    341 3
    1105 2
    1105 3
    0 0
    

    Sample Output

    no
    no
    yes
    no
    yes
    yes

    题意:求判断p是否是基于a的伪素数,即p不是质数且a^p ≡ a mod p


    题解:米勒罗宾素性检测,二分幂取模


    #include <iostream>
    #include <sstream>
    #include <fstream>
    #include <string>
    #include <map>
    #include <vector>
    #include <list>
    #include <set>
    #include <stack>
    #include <queue>
    #include <deque>
    #include <algorithm>
    #include <functional>
    #include <numeric>
    #include <iomanip>
    #include <limits>
    #include <new>
    #include <utility>
    #include <iterator>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cctype>
    #include <cmath>
    #include <ctime>
    using namespace std;
    
    typedef long long ll;
    
    ll prime[6] = {2, 3, 5, 233, 331};
    
    ll pow_mod(ll a, ll n, ll mod)
    {
        ll ret = 1;
        while (n)
        {
            if (n&1)
                ret = ret * a % mod;
            a = a * a % mod;
            n >>= 1;
        }
        return ret;
    }
    
    int isPrime(ll n)
    {
        if (n < 2 || (n != 2 && !(n&1)))
            return 0;
        ll s = n - 1;
        while (!(s&1))
            s >>= 1;
        for (int i = 0; i < 5; ++i)
        {
            if (n == prime[i])
                return 1;
            ll t = s, m = pow_mod(prime[i], s, n);
            while (t != n-1 && m != 1 && m != n-1)
            {
                m = m * m % n;
                t <<= 1;
            }
            if (m != n-1 && !(t&1))
                return 0;
        }
        return 1;
    }
    
    
    int main()
    {
        ll p, a;
        while (~scanf("%lld%lld", &p, &a) && (p || a))
            if (!isPrime(p) && pow_mod(a, p, p) == a)
                printf("yes
    ");
            else
                printf("no
    ");
        return 0;
    }
    


  • 相关阅读:
    Truck History(poj 1789)
    Highways poj 2485
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    115. Distinct Subsequences
    114. Flatten Binary Tree to Linked List
    113. Path Sum II
    109. Convert Sorted List to Binary Search Tree
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
  • 原文地址:https://www.cnblogs.com/godweiyang/p/12203944.html
Copyright © 2011-2022 走看看