编程实现Solovay-Stassen素性检验算法
时间: 2023-07-26 17:36:49 浏览: 144
下面是 Solovay-Stassen 素性检验算法的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
// 计算 a 的 b 次方对 c 取余的结果
int mod_pow(int a, int b, int c) {
int res = 1;
while (b > 0) {
if (b & 1) {
res = (res * a) % c;
}
a = (a * a) % c;
b >>= 1;
}
return res;
}
// 计算 Jacobi 符号
int jacobi(int a, int n) {
int t = 1;
while (a != 0) {
while (a % 2 == 0) {
a /= 2;
int r = n % 8;
if (r == 3 || r == 5) {
t = -t;
}
}
int tmp = a;
a = n;
n = tmp;
if (a % 4 == 3 && n % 4 == 3) {
t = -t;
}
a %= n;
}
if (n == 1) {
return t;
}
return 0;
}
// Solovay-Stassen 素性检验算法
int solovay_stassen(int n, int k) {
if (n == 2 || n == 3) {
return 1;
}
if (n == 1 || n % 2 == 0) {
return 0;
}
for (int i = 0; i < k; i++) {
int a = rand() % (n - 2) + 2;
int x = mod_pow(a, (n - 1) / 2, n);
if (x == 0 || x == 1) {
continue;
}
int j = jacobi(a, n);
if (x != j % n) {
return 0;
}
}
return 1;
}
int main() {
int n, k;
printf("请输入一个正整数:");
scanf("%d", &n);
printf("请输入测试次数:");
scanf("%d", &k);
if (solovay_stassen(n, k)) {
printf("%d 可能是素数\n", n);
} else {
printf("%d 不是素数\n", n);
}
return 0;
}
```
其中,`mod_pow` 函数和 `jacobi` 函数与 Fermat 素性检测算法中的实现相同。`solovay_stassen` 函数是 Solovay-Stassen 素性检验算法的实现。在 `main` 函数中,首先输入待测试的正整数 `n` 和测试次数 `k`,然后调用 `solovay_stassen` 函数进行素性检验,并输出检验结果。
阅读全文