这是清华大学出版社,《信息安全数学基础(第二版)》里的题目,我自己写的代码。给大家做个参考,顺便发现问题可以告诉我,指出问题。
计算步骤:
先输入奇整数n>=3 和安全参数t(其实就是计算次数)
- 随机选取整数 b ,b的范围[2,n-2]。
- 计算r =b^((n-1)/2) (mod n)。
- 如果r != 1 以及 r != n-1,则n是合数。
- 计算Jacobi符号 s=(a/n)。
- 如果r != s,则n是合数。
- 上述过程重复t次。
代码:
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
int fenjie(int n, int e[]);
int main()
{
while (1)
{
int n, s, t, b, r, x, e[100];
begin:
cout << "请输入给定的奇整数n(n>=3)和安全参数t(用空格隔开)" << endl;
cin >> n >> t;
if (n < 3 || n % 2 == 0)
{
cout << "n不符合条件" << endl;
goto begin;
}
for (int i = 0; i < t; i++)
{
b = (time(0));
srand(b);
b = rand() % (n - 3) + 2; //随机数b的范围为[2,n-2]
x = (n - 1) / 2; //此时x为b的指数;
x = fenjie(x, e); //xb的指数的素因素的个数,e[]存放b的指数的素因数;
r = b; //开始计算r;
for (int j = 0; j <= x - 1; j++)
{
r = pow(r, e[j]);
r = r % n;
}
if (r != 1 && r != n - 1)
{
cout << n << "是合数" << endl;
goto begin;
}
s = 1;
x = fenjie(n, e); //x变成了n的素因素的个数 e[]存放n的素因素;
for (int j = 0; j <= x - 1; j++) //求出s=(b/n);
{
s = s * pow(b, (e[j] - 1) / 2);
s = s % e[j];
}
if (r != s)
{
cout << n << "是合数" << endl;
goto begin;
}
}
cout << n << "是奇素数" << endl;
}
}
int fenjie(int n, int e[]) //求出n的素因素放到集合e中;返回e中最后一个素因素的位置,x也等于素因素的个数;
{
int i = 2, x = 0;
while (i <= n)
{
if (n % i == 0)
{
e[x] = i;
x++;
n /= i;
}
else
i++;
}
return x;
}