HDUoj 1905 Pseudoprime numbers (快速幂)

本文介绍了一种通过快速幂运算判断特定整数是否为基-a伪素数的方法,并提供了一个C++实现示例。文章包括了如何利用快速幂算法进行高效计算,以及如何通过简单算法检查一个数是否为素数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




Pseudoprime numbers

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

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 containingp 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

题意  快速幂一发的值对底数相等且幂数不为素数的输出yes

#include<stdio.h>
#include<math.h>

long long powMod(long long a, long long b, long long c)
{
	long long ans = 1;
	a = a % c; 
	while(b){
		if(b&1)
			ans =(a*ans) % c;
		b /= 2;
		a = (a*a) %c;
	}
return ans;
}
bool prime(long long n)
{
	if(n == 2||n == 3)
		return true;
	if(n % 2 == 0||n % 3 == 0||n == 1)
		return false;
	long long k = sqrt(n)+1;
	for(long long i = 5;i < k;i += 6){
		if(n % i == 0||n % (i+2) == 0)
			return false;
	}
return true;
}
int main()
{
	long long b, a;
	while(~scanf("%lld%lld",&b,&a)){
		if(a==0&&b==0)
		break;
		if((powMod(a,b,b))==a&&!prime(b))
			printf("yes\n");
		else
			printf("no\n"); 
	}
return  0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值