网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C/C++ > 正文
C++几种常见的素数判断算法
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式
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 = 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

  • 上一篇资讯: 井字棋游戏
  • 下一篇资讯: 链表的综合应用.
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号