Fermat素性检验算法的C语言实现(基于Miracl大数运算库)
实验环境
Windows 10,Visual Studio 2019,Miracl大数库
背景及原理
Fermat小定理
给定素数 𝒑,𝒂 ∈ 𝒁,则有 a^(p-1) ≡ 𝟏(𝒎𝒐𝒅 𝒑)
如果有一个整数𝒂 ,( 𝒂, 𝒎 )= 𝟏,使得 a^(m-1) ≢ 𝟏( 𝒎𝒐𝒅 m)
则m一定是一个合数
如果有一个整数𝒂 ,( 𝒂, 𝒎 )= 𝟏,使得 a^(m-1)≡ 𝟏 (𝒎𝒐𝒅 m)
则m是素数或伪素数
引理
奇整数𝒎,若任取一整数 𝟐 ≤ 𝒂 ≤ 𝒎 − 𝟐,( 𝒂, 𝒎 )= 𝟏, 使得a^(m-1)≡ 𝟏 𝒎𝒐𝒅 𝒎 ,则 𝒎 至少有1/2的概率为素数
Fermat素性检验算法
给定奇整数 𝒎 ≥ 𝟑 和安全参数 𝒌
(1) 随机选取整数𝒂 ,𝟐 ≤ 𝒂 ≤ 𝒎 − 𝟐
(2) 计算𝒈 =( 𝒂, 𝒎 ),如果 𝒈 = 𝟏,转(3);否则,跳出, 𝒎 为合数
(3) 计算 𝒓 = 𝒂^𝒎−𝟏 𝒎𝒐𝒅 𝒎 ,如果 𝒓 = 𝟏,𝒎 可能是素数,转(1);否则,跳出, 𝒎 为合数
(4) 重复上述过程 𝒌 次,如果每次得到 𝒎 可能为素数,则 𝒎 为素数的概率为 𝟏 – 1/2^k
Miracl大数运算库相关函数
函数原型: miracl *mirsys(int nd, int nb);
功能说明: 初始化MIRACL系统,该函数必须在调用MIRACL库函数之前先执行
函数原型: void bigrand(big w, big x);
功能说明: 使用内置的随机数发生器,产生一个小于w的大数随机数,x<w
函数原型: int egcd(bigx, big y, big z);
功能说明:计算两个大数的最大公约数,z=gcd(x,y)
函数原型: void powmod(big x, big y,big z, big w);
功能说明: 模幂运算,w=xy mod z
函数原型: int mr_compare(big x, big y);
功能说明: 比较两个大数的大小
返回值: x>y时返回+1, x=y时返回0, x<y时返回-1
函数原型: void incr(big x, int n, big z);
功能说明: 将一个大数加上一个整数, z=x+n
函数原型: void decr(big x, int n, big z) ;
功能说明: 将一个大数减去一个整数, z=x-n.
函数原型: void convert(int n, big x);
功能说明: 将一个整数n转换成一个大数x
函数原型: void mirexit();
功能说明: 清除MIRACL系统,释放所有内部变量
程序代码
#include <stdio.h>
#include <math.h>
#include "miracl.h"
int