Wilson定理:对于给定的正整数n,判定n是一个素数的充要条件是(n-1)! -1(mod n)。 费尔马小定理:如果p是一个素数,且0<a<p,则a^(p-1)(mod p)。 二次探测定理:如果p是一个素数,且0<x<p,则方程x^21(mod p)的解为x=1,p-1。 Carmichael数:费尔马小定理是素数判定的一个必要条件。满足费尔马小定理条件的整数n未必全是素数。有些合数也满足费尔马小定理的条件,这些合数称为Carmichael数。前3个Ca
//随机化算法 蒙特卡罗算法 素数测试问题
#include "stdafx.h"
#include "RandomNumber.h"
#include <cmath>
#include <iostream>
using namespace std;
//计算a^p mod n,并实施对n的二次探测
void power(unsigned int a,unsigned int p,unsigned int n,unsigned int &result,bool &composite)
{
unsigned int x;
if(p == 0)
{
result = 1;
}
else
{
power(a,p/2,n,x,composite); //递归计算
result = (x*x)%n; //二次探测
if((result == 1) && (x!=1) && (x!=n-1))
{
composite = true;
}
if((p%2)==1)
{
result = (result*a)%n;
}
}
}
//重复调用k次Prime算法的蒙特卡罗算法
bool PrimeMC(unsigned int n,unsigned int k)
{
RandomNumber rnd;
unsigned int a,result;
bool composite = false;
for(int i=1; i<=k; i++)
{
a = rnd.Random(n-3)+2;
power(a,n-1,n,result,composite);
if(composite || (result!=1))
{
return false;
}
}
return true;
}
int main()
{
int k = 10;
for(int i=1010;i<1025;i++)
{
cout<<i<<"的素数测试结果为:"<<PrimeMC(i,k)<<endl;
}
return 0;
}