POJ 3641. Pseudoprime numbers

题目概述

解题思路

这道题的要求是,判断当前的(a, p)是否符合base-a pseudoprime的条件。也就是说,我们先要判断p是否为质数(不是的话就输出no);然后判断a^{p}=p(mod \ p)是否成立。这一步就是考察快速幂运算的实现了。

算法性能

判断质数算法的复杂度为O(p^{1/2}),快速幂运算复杂度为O(log(p)),所以整个方法的复杂度为O(p^{1/2})。

回顾一下快速幂运算的流程:

res=a^{p} % m=\left\{\begin{matrix} (a^2 % m)^{p/2}, \ if \ p%2=0,\\ (a^2 % m)^{p/2}*(a % m), \ if \ p%2=1 \end{matrix}\right.

维护一个记录当前的幂指数p的变量,一个记录当前结果(res)的变量,一个记录当前的余数a^2%m的变量即可。

提交结果:

示例代码

#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
#include<vector>

using namespace std;

bool isPrime(long long num)
{
	if (num == 2 || num == 3)
		return 1;
	if (num % 6 != 1 && num % 6 != 5)
		return 0;
	int tmp = sqrt(num);
	for (int i = 5; i <= tmp; i += 6)
		if (num %i == 0 || num % (i + 2) == 0)
			return 0;
	return 1;
}

bool mods(long long p, long long a)
{
	long long res = 1, temp_a = a, temp_n = p;
	while (temp_n > 0)
	{
		if (temp_n & 1)
		{
			res = res * temp_a % p;
		}
		temp_a = temp_a * temp_a % p;
		temp_n >>= 1;
	}
	return res == a;
}

int main()
{
	long long P, A;
	bool is_prime = false;
	do
	{
		cin >> P >> A;
		if (!P)
			break;
		is_prime = isPrime(P);
		if (is_prime == true)
		{
			cout << "no" << endl;
			continue;
		}
		else
		{
			is_prime = mods(P, A);
			if (is_prime == false)
				cout << "no" << endl;
			else
				cout << "yes" << endl;
		}
	} while (1);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值