利用miracl库实现Fermat素性检测
Fermat素性检测是一种建立在Fermat小定理之上、针对大数的素性检测方案。它虽然能准确地判断“合数”,却无法保证“素数”结论的颠扑不破,换言之,对于“素数”的判断是概率性的。
用到的工具:VS2017、C语言大数库Miracl_5.5.4。
一、Fermat素性检测算法介绍
重要参数:待测大数m(从文件输入),安全参数k(从控制台输入)。
按如下步骤进行检验:
- 随机选取整数a,且a大于等于2,小于等于m-2。
- 计算a和m的最大公因数g。如果g不等于1(a和m不互素),判断m为合数并退出;否则转到第三步继续判断。
- 验证a和m是否满足Fermat小定理的要求。令r=am-1(mod m),若r不等于1,则违背了Fermat小定理,确定m为合数。否则m可能为素数。
- 重复k次。若最终m仍可能为素数,则其概率为1-1/(2k)。
二、miracl环境配置
参考链接:miracl库下载以及配置
前人栽树:很多同学调试时可能会遇到lib库无法正常载入的情况,有可能是文件名后缀的问题,你把cpp改为c后缀试试。
博主在这里栽了两个小时,呜呼哀哉,呜呼哀哉!!!
三、miracl基本函数
参考链接:miracl基本函数介绍
我们要用到的函数:mirsys(初始化miracl内存空间)、mirvar(big数初始化)、cinnum(大数的输入)、cotnum(大数的输出)、decr(大数与int数相减)、bigrand(生成随机big数)、egcd(计算两个大数的最大公因数)、compare(比较两个大数的大小)、powmod(计算大数之间的指数次方模值,如am-1(mod m))、mirexit(清理miracl内存空间)。
四、编程实现
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include "miracl.h"
int main()
{
int k;
FILE *fp = NULL;
char fileName[80];
double probability = 0;
miracl *mip = mirsys(500,10); //初始化miracl系统
big m = mirvar