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;
    }
    


  • 相关阅读:
    鸟哥的 Linux 私房菜Shell Scripts篇(一)
    证券投资基金会计核算业务指引
    在LINUX上部署SOFA
    bash: sz: command not found
    git常用命令
    git删除指定commit
    dubbo-本地直连
    java 中的锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
    设置Chrome忽略网站证书错误
    mybatis-传多个参数
  • 原文地址:https://www.cnblogs.com/godweiyang/p/12203944.html
Copyright © 2011-2022 走看看