最近在学习数论:贴一下Miller_Rabbin测试;
代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define maxTest 100
__int64 Random(__int64 n)
{
return (__int64)((double)rand()/RAND_MAX*n+0.5);
}
__int64 Modular_Exp(__int64 a, __int64 b, __int64 n) // a^b mod n
{
__int64 ans;
if(b == 0)
return 1;
if(b == 1)
return a%n;
ans = Modular_Exp(a, b/2, n);//之前看书上说看书上说:快速乘方算法是一个二分的思想,现在好像有点像了
ans = ans*ans%n;
if(b%2)
ans = ans*a%n;
return ans;
}
bool Miller_Rabbin(__int64 n)
{
for(int i=1; i<=maxTest; i++)
{
__int64 a = Random(n-2)+1;
if(Modular_Exp(a, n-1, n) != 1)
return false;
}
return true;
}
int main()
{
srand(time(NULL));
__int64 n;
while(scanf("%I64d", &n)==1)
if(Miller_Rabbin(n))
printf("Primer\n\n");
else
printf("Not Prime\n\n");
return 0;
}