随机算法
算法原理:
输入:一个大于3的奇整数n和一个大于等于1的安全参数t(用于确定测试轮数)。
输出:返回n是否是素数(概率意义上的,一般误判概率小于((1/2))80)即可)。
将n-1表示成2sr
对i从1到t做循环做以下操作:
选择一个随机整数a(2 ≤ a ≤ n−2)
计算y ← ar bmod n
如果y≠1并且y≠ n−1循环做下面的操作,否则转3:
j ← 1
当j ≤ s−1并且y ≠ n−1循环做下面操作,否则跳到(iv.)
计算y ← y2 bmod n,如果y = 1返回“合数”,否则j ← j + 1
如果y ≠ n−1则返回“合数”
返回“素数”
#include
using namespace std;
/*=====================================================
* Fermat定理:
* 如果n是素数,那么对于所有的a<>0(mod n)有
* a^(n-1) mod n = 1
*=====================================================
*/
// 输出a^m(mod n)
int expmod(int a, int m, int n) {
int c = 1;
while (m > 0) {
c = (c*c)%n;
if (m%2 == 1)
c = (c*a)%n;
m /= 2;
}
return c;
};
/*=================&#