(Relax 快速幂取模1.4)POJ 3641 Pseudoprime numbers(快速幂取模+大素数MillerRabin模板题)

来源:互联网 发布:天猫淘宝网商城首页 编辑:程序博客网 时间:2024/06/11 10:21
题目大意是这样的,输入p,a,两个数如果p是素数输出no,如果p不是素数,判断a^p%p==a是否成立,如果成立输出yes,否则输出no
/* * POJ_3641.cpp * *  Created on: 2013年11月19日 *      Author: Administrator */#include <iostream>#include <cstdio>using namespace std;typedef long long ll;/** * 快速幂取模 * 求a^b%m的值 */ll qpow(ll a, ll b, ll m) {ll ans = 1;while (b) {if (b & 1) {ans *= a;ans %= m;}a *= a;a %= m;b >>= 1;}return ans;}bool MillerRabinTest(ll x,ll n){//以x为底,判定n是否可能为素数ll y = n-1;while(!(y&1)){y >>= 1;}x = qpow(x,y,n);while(y < n-1 && x != 1 && x != n-1){x = (x*x)%n;y <<= (ll)1;}return x == (n-1) || (y&1) == 1;}bool isPrime(ll n){//判断32为内的整数n是否为素数if(n == 2 || n == 7 || n == 61){//如n为2、7、61,,则n为素数return true;}if(n == 1 || (n&1) == 0){//若n是1||n是非2偶数,则是合数return false;}return MillerRabinTest(2,n) && MillerRabinTest(7,n) && MillerRabinTest(61,n);}//以上是MillerRabin的算法模板,它用来测试大素数int main(){ll p,a;while(scanf("%lld%lld",&p,&a)!=EOF,p||a){if(isPrime(p)){printf("no\n");continue;}if(qpow(a,p,p) == a){printf("yes\n");}else{printf("no\n");}}return 0;}


	
				
		
原创粉丝点击