Fermat素性检验 python
时间: 2023-07-06 10:41:17 浏览: 153
Fermat素性检验是一种用于判断一个大整数是否为素数的方法。下面是一个用Python实现的Fermat素性检验的代码示例:
```python
import random
def fermat(n, k=10):
"""
Fermat素性检验
"""
if n == 2 or n == 3:
return True
if n % 2 == 0:
return False
for i in range(k):
a = random.randint(2, n-2)
if pow(a, n-1, n) != 1:
return False
return True
```
其中,`fermat`函数用于进行Fermat素性检验。参数`n`为待检验的大整数,参数`k`为检验次数,一般取10次即可。函数返回`True`表示`n`可能是素数,返回`False`表示`n`一定不是素数。
需要注意的是,Fermat素性检验的正确性并不是完全可靠的,存在一定的错误概率。因此,在实际应用中,一般需要结合其他素性检验方法来进行判断。
相关问题
fermat素性检验算法C语言
以下是使用 Fermat 素性检验算法判断一个数是否为素数的 C 语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
// 计算 a^b mod m 的值
long long pow_mod(long long a, long long b, long long m) {
long long ans = 1;
while (b) {
if (b & 1) {
ans = ans * a % m;
}
a = a * a % m;
b >>= 1;
}
return ans;
}
// Fermat 素性检验算法
bool fermat_test(long long n, int k) {
if (n == 2) {
return true;
}
if (n < 2 || !(n & 1)) {
return false;
}
srand(time(NULL));
for (int i = 0; i < k; ++i) {
long long a = rand() % (n - 2) + 2; // 随机选取 a,2 <= a <= n-1
if (pow_mod(a, n - 1, n) != 1) {
return false;
}
}
return true;
}
int main() {
long long n;
int k;
printf("请输入要测试的正整数:");
scanf("%lld", &n);
printf("请输入重复测试的次数:");
scanf("%d", &k);
if (fermat_test(n, k)) {
printf("%lld 是素数。\n", n);
} else {
printf("%lld 不是素数。\n", n);
}
return 0;
}
```
该程序先定义了一个用于计算 a^b mod m 的函数 pow_mod。接着定义了 Fermat 素性检验算法的函数 fermat_test,该函数使用随机化的方法选取 k 个整数进行测试,如果都通过测试,则认为 n 可能是素数,否则认为 n 不是素数。最后在主函数中读入要测试的正整数和重复测试的次数,调用 fermat_test 函数进行测试,输出测试结果。
Miller-Rabin素性检验 python
Miller-Rabin素性检验是一种用于判断一个大整数是否为素数的方法,它比Fermat素性检验更加可靠。下面是一个用Python实现的Miller-Rabin素性检验的代码示例:
```python
import random
def miller_rabin(n, k=10):
"""
Miller-Rabin素性检验
"""
if n == 2 or n == 3:
return True
if n % 2 == 0:
return False
r, s = 0, n-1
while s % 2 == 0:
r += 1
s //= 2
for i in range(k):
a = random.randint(2, n-2)
x = pow(a, s, n)
if x == 1 or x == n-1:
continue
for j in range(r-1):
x = pow(x, 2, n)
if x == n-1:
break
else:
return False
return True
```
其中,`miller_rabin`函数用于进行Miller-Rabin素性检验。参数`n`为待检验的大整数,参数`k`为检验次数,一般取10次即可。函数返回`True`表示`n`可能是素数,返回`False`表示`n`一定不是素数。
Miller-Rabin素性检验的正确性已经被证明。相比Fermat素性检验,它的错误概率更小,同时也可以检测出更多的合数。因此,Miller-Rabin素性检验常常被用于实际的应用中。
阅读全文