miracl库实现费马素性检测
之前用java写的有点问题,测试数据不能太大
extern"C" {
#include"miracl.h"
#include"mirdef.h"
}
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define k 4 //安全系数
int farmattest(big m);
int main() {
FILE* fp;
miracl* mip = mirsys(1200, 10);
big m;
m = mirvar(0);
if ((fp = fopen("1.txt", "r+")) == NULL) {
printf("file open fail");
exit(0);
}
while (!feof(fp))
{
cinnum(m, fp);
cotnum(m, stdout);
if (farmattest(m) == 1) {
printf("m is %6.4f%% prime\n", 100 * (1 - pow(0.5, k)));
}
/*else
{
printf("m is a composite");
}*/
if(farmattest(m) == 0) {
printf("m is a composite\n");
}
}
return 0;
}
int farmattest(big m) {
int i = 0;
int j = 0;
big a; //随机数
big tran1; //m-2
big mgcd; //最大公因数 g
big tran2; //m-1
big r;
big number1; //数字1
big number2; //数字2
a = mirvar(0);
tran1 = mirvar(0);
mgcd = mirvar(0);
tran2 = mirvar(0);
r = mirvar(0);
number1 = mirvar(1);
number2 = mirvar(2);
decr(m, 2, tran1); //tran1 = m - 2;
decr(m, 1, tran2); //tran2 = m - 1;
srand((unsigned int)time(NULL));
bigrand(tran1, a); //生成随机数a
for (i = 0; i < k; i++) {
egcd(a, m, mgcd); //计算a与m的最大公因数
if (!mr_compare(mgcd, number1)) {
powmod(a, tran2, m, r);
if (!mr_compare(r, number1)) {
j++;
}
}
}
if (j == k) {
return 1;
}
else
{
return 0;
}
mirkill(a);
mirkill(tran1);
mirkill(tran2);
mirkill(r);
mirkill(mgcd);
mirkill(number1);
mirkill(number2);
}
如果出现这个问题
解决方法
右键项目,选择属性,将SDL检查选为否,再应用,确定即可