POJ Pseudoprime numbers (判断素数+快速幂取模)

题目大意:给两个数 p 和 a , 判断 p 是不是基于 a 伪素数。即a^(p-1) ≡ 1 (mod p).

伪素数:如果n是一个正整数且是非素数,如果存在和n互素的正整数a满足 a^(n-1) ≡ 1(mod n),我们说n是基于a的伪素数。如果一个数是伪素数,那么它几乎肯定是素数。

所以 , 首先判断p是不是素数 , 然后用快速幂取模求出(a^p)%a的值是否等于a。

代码

/* 先判断 p 是否是素数
 * 然后用幂取模判断(a^p) % p == a
 */
#include <iostream>
#include <cmath>

using namespace std;

bool isprim(int p)
{
    int m = (double)sqrt((double)p) + 0.5;
    for(int i = 2; i <= m; i++) if(p % i == 0) return true;
    return false;
}
int pow_mod(int a , int n , int m) //分治法快速幂取模
{
    if(n == 0) return 1;
    int x = pow_mod(a , n >> 1 , m);
    long long rel = (long long)x * x % m;
    if(n & 1) rel = rel * a % m;
    return (int)rel;
}
int main()
{
    int p , a;
    while(cin >> p >> a && p)
    {
        if(!isprim(p)) cout << "no" << endl;
        else {
            if(a == pow_mod(a , p , p)) cout << "yes" << endl;
            else cout << "no" << endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值