免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4166 | 回复: 12
打印 上一主题 下一主题

继续讨论素数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-27 13:36 |只看该作者 |倒序浏览
请使用C或者C++编写符合POSIX规范的下述程序。

写个列出所有long long能表示的素数的程序,单进程双线程的。
要求A线程用Rabin-Miller算法筛数,B线程用算法2验证。

A线程筛出N(N=100)个数之后(B线程此期间应协助A线程筛数),
B线程开始验证,A线程继续筛数,
A线程筛完数后,协助B线程验证。

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

但是编程我们一般不采用上面的方法,并不说这中方法计算机实现不了,或者说实现算法比较复杂。因为它更像一个数学推理。下面为通常所用算法:
设N=2^127-1是一个38位数,要验证它是否为素数,有下面几个不同的方法:
1.遍历2以上N的平方根以下的每一个整数,是不是能整除N;(这是最基本的方法)
2.遍历2以上N的平方根以下的每一个素数,是不是能整除N;(这个方法是上面方法的改进,但要求N平方根以下的素数已全部知道)
(以下为用于长数)
3.采用Rabin-Miller算法(1978 年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。 RSA的安全性依赖于大数难于分解这一特点。);
4.AKS 算法(Agrawal、Kayal和Saxena);
验算结果,假设计算机能每秒钟计算1亿次除法,那么
算法1要用4136年,算法2要用93年,算法3只要不到1秒钟!

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次测试)
采用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) 如果j>0且z=1, 那麽p不是素数;
(5) 设j=j+1。如果j且z<>p-1,设z=z^2 mod p,然后回到(4)。如果z=p-1,那麽p通过测试,可能为素数;
(6) 如果j=b 且z<>p-1,不是素数。

论坛徽章:
0
2 [报告]
发表于 2010-02-27 13:38 |只看该作者
再次重申,我既不会C也不懂C++,所以求各位兄弟姐妹帮忙写写啦。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
3 [报告]
发表于 2010-02-27 13:39 |只看该作者
请使用C或者C++编写符合POSIX规范的下述程序。

写个列出所有long long能表示的素数的程序,单进程双线程 ...
proge 发表于 2010-02-27 13:36



    费尔马小定理

论坛徽章:
0
4 [报告]
发表于 2010-02-27 14:06 |只看该作者
呵呵,题目不是这样要求的。而且也无法提供2^127的内存,请考虑在4G RAM + 4G Swap的机器上实现。

论坛徽章:
0
5 [报告]
发表于 2010-02-27 14:17 |只看该作者
请使用C或者C++编写符合POSIX规范的下述程序。

写个列出所有long long能表示的素数的程序,单进程双线程 ...
proge 发表于 2010-02-27 13:36



    long long,这可就大了,64位有符号整数,2^63-1=9223372036854775807,全部存下来?

论坛徽章:
0
6 [报告]
发表于 2010-02-27 15:43 |只看该作者
根据当n很大的时候,不超过n的素数个数π(x)满足x/(Lnx-0.5)<π(x)<x/(Lnx-1.5),那么我们拿下界来算的话,大概是213660902541404679个,恐怖了,如果只列举不存还好,要是列举出来的话……
再说说A的算法
假设你的A用筛法(你说的A筛法筛数),那么存储那个筛是个问题,原先有个位数为1,3,7,9才可能是素数的说法,这样只存这些数字为个位数的,也就是空间占用为40%,我们换一种,因为只有当n=6*k+1和n=6*k+5才有可能是素数(n>=6),那么这里空间占用为1/3,我们选后面那种,那么存储那个是否被筛的数组就要(2^63-1)/3=3074457345618258602,一个位置1bit算的话,349525TB,如果没算错的话,实在想不出列举是怎样的
如果A用一个个判定的方式,那再快的判定算法也白搭
所以深表怀疑…………

论坛徽章:
0
7 [报告]
发表于 2010-02-27 16:09 |只看该作者
回复 2# proge

proge (代码狂人)

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
8 [报告]
发表于 2010-02-27 16:24 |只看该作者
有个线性筛数方法。MR算法在筛数方面不行,它适合验证单个数字。

论坛徽章:
0
9 [报告]
发表于 2010-03-01 10:52 |只看该作者
也许是我表达能力太差,不过我觉得大家不必再讨论算法的问题,还有long long是128 bit的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2010-03-01 13:33 |只看该作者
所有???我的个神啊,你打算让处理器跑多久?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP