描述:
费马定力:所有的素数p都是,给定一个大1 小于p 的a,a的p次幂模p为a,若有满足这是pseudoprime numbers (若有其他数满足,则称为pseudoprime )
输入样例:
3 2
341 2
0 0
输出:
no yes
#include<stdio.h>
#include<math.h>
// 判断是否是素数
bool isprime(int n) {
// 0.5是防止浮点数误差 因下面枚举 i < m 的
int m = floor(sqrt(n) + 0.5);
for (int i = 2; i < m; i++) {
if (m % i == 0) {
return false;
}
}
// 排除 n =0 的情况
return n > 1;
}
// 快速乘 类似于快速幂
int qmul(int a, int b, int mod) {
int ans = 0;
while (b) {
if (b & 1) {
ans = (ans + a) % mod;
}
b >>= 1;
a = (a <<1) % mod;
}
return ans;
}
// 实现快速幂
int qpow(int a, int n, int mod) {
int res = 1;
while (n) {
if (n & 1) {
// 原型为res = res*a %mod
res = qmul(res, a, mod) % mod;
}
n >>= 1;
// 原型为a = a * a % mod
a = qmul(a, a, mod) % mod;
}
return res;
}
int main() {
int p, a;
while (scanf("%d%d", &p, &a) && p | a) {
printf("%s\n", a == qpow(a, p, p) && !isprime(p) ? "yes" : "no");
}
return 0;
}
采用俄式快速算法!!!