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

求解一个算法,我们首先要知道它的数学含义.依据这个原则,首先我们要知道什么是素数.; 素数是这样的整数,它除了表示为它自己和1的乘积以外,无论他表示为任何两个整数的乘积。 

找素数的方法多种多样。

1:是从2开始用“是则留下,不是则去掉”的方法把所有的数列出来(一直列到你不想再往下列为止,比方说,一直列到10,000)。第一个数是2,它是一个素数,所以应当把它留下来,然后继续往下数,每隔一个数删去一个数,这样就能把所有能被2整除、因而不是素数的数都去掉。在留下的最小的数当中,排在2后面的是3,这是第二个素数,因此应该把它留下,然后从它开始往后数,每隔两个数删去一个,这样就能把所有能被3整除的数全都去掉。下一个未去掉的数是5,然后往后每隔4个数删去一个,以除去所有能被5整除的数。再下一个数是7,往后每隔6个数删去一个;再下一个数是11,往后每隔10个数删一个;再下一个是13,往后每隔12个数删一个。就这样依法做下去。

但是编程我们一般不采用上面的方法,并不说这中方法计算机实现不了,或者说实现算法比较复杂。因为它更像一个数学推理。最后我们也给一个算法。

下面我们介绍几种长用的编程方法。

2:遍历2以上N的平方根以下的每一个整数,是不是能整除N;(这是最基本的方法)

3:遍历2以上N的平方根以下的每一个素数,是不是能整除N;(这个方法是上面方法的改进,但要求N平方根以下的素数已全部知道)
4:采用Rabin-Miller算法进行验算;

例如:N=2^127-1是一个38位数,要验证它是否为素数,用上面几个不同的方法:

验算结果,假设计算机能每秒钟计算1亿次除法,那么
算法2要用4136年,算法3要用93年,算法4只要不到1秒钟!(这些数据是通过计算得到)

另外印度有人宣称素数测试是P问题,我一直没有找到那篇论文,听说里面有很多数学理论。如果那位大人有这篇论文,麻烦转发一份。

下面我们分别实现上面的三种算法:

以下算法我们不涉及内存溢出,以及大数字的问题。如果测试数字超过2^32,发生内存溢出,你需要自己使用策略解决这个问题,在这里只讨论32位机有效数字算法。

1: 算法0:是从2开始用“是则留下,不是则去掉”的方法把所有的数列出来

最后数组中不为0的数字就是要查找的素数。

void PrimeNumber0()

{

int time GetTickCount();

cout start time time endl;

 

int Max[MAX_NUMBER]; 在栈上分配,栈上空间要求一般都在2M之间,

如果你需要更大空间,请在堆上申请空间(就是通过malloc,new来申请).

memset(Max,0,MAX_NUMBER);

for(int i = 0 ; i MAX_NUMBER; ++i)

{

Max[i] = i;

}

int cout = 0; 记录当前i的位置

 

遍历整个数组

for(i = 1; i MAX_NUMBER; ++i)

{

if(Max[i] != 0 ) 如果数据不为0,说明是一个素数

{

int iCout = i;

int j = Max[i]; 记录数组中数组位的数字,以便设置

while((iCout+=j) MAX_NUMBER)

{

把不是素数的数位在数组中置为0

Max[iCout] = 0;

}

++cout;

}

}

 

int time GetTickCount();

cout end time time endl;

}

 

2:这个算法可以修改成为,验证一个给定数字是否是一个素数。

因为我们讨论多个算法,所以我们把每个算法都单独

写在一个或多个函数内。这些函数并不要求输入值和返回值

如果你需要这些结果,可以自己修改。

 

算法1:遍历2以上N的平方根以下的每一个整数,是不是能整除N;

void PrimeNumber1()

{

int time GetTickCount();

cout start time time endl;

 

int Max[MAX_NUMBER2]; 在栈上分配,栈上空间要求一般都在2M之间,

如果你需要更大空间,请在堆上申请空间(就是通过malloc,new来申请).素数的个数很少

所以没有必要申请和所求数字同样大小的空间。

memset(Max,0,MAX_NUMBER);

Max[0] = 2; 放入第一个素数,有人说2不是素数,如果你是其中一员,就改成

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

    免费论文

    原创论文

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