int cout = 1; 记录素数个数
挨个数进行验证
bool bflag = true;
for(int i = 3; i MAX_NUMBER; ++i)
{
bflag = true;
需要是使用数学库(math.h)中sqrt
int iTemp = (int)sqrt((float)i); 强制转换成int类型,有的人在这里使用i+1就是为了增加sqrt的精度
没有特殊函数,你也可以使用int iTemp = (int)sqrt(i)+1;来提高进度
for (int j = 2; j iTemp; ++j)
{
if(i%j == 0) 求余,如果为0说明,可以整除,不是素数。
{
bflag = false;
break;
}
}
经过验证是素数,放入数组。
if(bflag)
{
Max[cout++] = i;
}
}
int time GetTickCount();
cout end time time endl;
}
3:这个方法是上面方法的改进,但要求N平方根以下的素数已全部知道
算法2:遍历2以上N的平方根以下的每一个素数,是不是能整除N;
(这个方法是上面方法的改进,但要求N平方根以下的素数已全部知道)
void PrimeNumber2()
{
int time GetTickCount();
cout start time time endl;
int Max[MAX_NUMBER2]; 在栈上分配,栈上空间要求一般都在2M之间,
如果你需要更大空间,请在堆上申请空间(就是通过malloc,new来申请).素数的个数很少
所以没有必要申请和所求数字同样大小的空间。
memset(Max,0,MAX_NUMBER);
Max[0] = 2; 放入第一个素数,有人说2不是素数,如果你是其中一员,就改成3吧
int cout = 1; 记录素数个数
挨个数进行验证
bool bflag = true;
for(int i = 3; i MAX_NUMBER; ++i)
{
bflag = true;
需要是使用数学库(math.h)中sqrt
int iTemp = (int)sqrt((float)i); 强制转换成int类型,有的人在这里使用i+1就是为了增加sqrt的精度
没有特殊函数,你也可以使用int iTemp = (int)sqrt(i)+1;来提高进度
修改的是这里以下的部分
for (int j = 0; j cout; ++j)
{
if(i%Max[j] == 0) 求余,如果为0说明,可以整除,不是素数。
{
bflag = false;
break;
}
}
修改的是这里以上的部分
经过验证是素数,放入数组。
if(bflag)
{
Max[cout++] = i;
}
}
int time GetTickCount();
cout end time time endl;
}
4:采用Rabin-Miller算法进行验算,Rabin-Miller算法是典型的验证一个数字是否为素数的方法。判断素数的方法是Rabin-Miller概率测试,那么他具体的流程是什么呢。假设我们要判断n是不是素数,首先我们必须保证n 是个奇数,那么我们就可以把n 表示为 n = (2^r)s+1,注意s 也必须是一个奇数。然后我们就要选择一个随机的整数a (1=a=n-1),接下来我们就是要判断 a^s=1 (mod n) 或a^((2^j)s)= -1(mod n)(0=j如果任意一式成立,我们就说n通过了测试,但是有可能不是素数也能通过测试。所以我们通常要做多次这样的测试,以确保我们得到的是一个素数。(DDS的标准是要经过50次测试)
算法3:采用Rabin-Miller算法进行验算
首先选择一个代测的随机数p,计算b,b是2整除p-1的次数。然后计算m,使得n=1+(2^b)m。
(1) 选择一个小于p的随机数a。
(2) 设j=0且z=a^m mod p
(3) 如果z=1或z=p-1,那麽p通过测试,可能使素数
(4) 如果j0且z=1, 那麽p不是素数
(5) 设j=j+1。如果j且zp-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数。
(6) 如果j=b 且zp-1,不是素数
判定是否存在 a^s=1 (mod n) 或a^((2^j)s)= -1(mod n)(0=j
bool Witness(int a,int n)
{
解释一下数学词汇:
ceil求不小于x的最小整数,函数原型extern float ceil(float x);求得i的最大值
log计算x的自然对数,函数原型extern float log(float x);
long i,d=1,x;
for (i=(int)ceil(log((double)n-1)log(2.0))-1;i=0;--i)
{
x=d;
d=(dd)%n;
if ((1==d) && (x!=1) && (x!=n-1))
{
return 1;
}
if ((n-1)&(10))
{
d=(da)%n;
}
}
return (d!=1);
}
&n