mathematica 发表于 2012-6-21 12:25:33


我把17楼的wayne的代码分解注释一下,同时他的代码稍微有些不完美的地方就是
没有给出连续的素数,只给出了连续的素数开始的位置,本人稍微补充了一下。(*2011是多少个连续素数的和*)
Clear["Global`*"];      ...
mathematica 发表于 2011-3-12 11:27 http://bbs.emath.ac.cn/images/common/back.gif
我觉得我注释的多么好呀!!!!!!!!!!赞美一下自己
几百年后我看到这段代码,依旧还是能明白代码所要表达的意思!

gw_0810 发表于 2013-9-30 14:56:18

很受教

282842712474 发表于 2014-7-28 13:25:37

wayne 发表于 2011-1-17 10:34
换了一种全新的思路,但代码超过了一行,不过速度又大大提高了,可以算出200万零11只有一个解:
{222161,...

请原谅我的挖坟呀^_^

wayne兄,你的这段代码,我在我的mathematica 9上运行,计算n=20000011(两千万零11)时,直接卡死了,我要强行重启了,你试试?

我也来一段python代码吧:

import time
start=time.clock()
import math

n=20000011
prime=#定义整数表
r=int(math.sqrt(n))

#下面是用删除式的方法把整数表中的合数删除掉
for j in range(2,r+1):
if prime != 0:
    s=j*j
    while s <= n:
      prime=0
      s=s+j
prime.sort() #从小到大重新排列(让0位于前面)
z=prime.count(0) #统计0的个数
prime=prime
#素数表生成完毕
pl=len(prime)
prime.append(n+1) #往素数表里边添加一个大数,避免溢出错误
i=1
a=0
b=0
s=2
while b<pl:
if s<n:
    b=b+1
    s=s+prime
elif s>n:
    s=s-prime
    a=a+1
else:
    print()
    s=s-prime
    a=a+1
end=time.clock()
print("time:",end-start)

比较长,因为基本上没有预先加载什么,完全就是从零开始生成素数表,然后再累加比较等等。
不打算跟大家比简洁了,呵呵~但是这个代码效率还算比较高,算两千万零11时,只用了5秒(在pypy上运行)
估计该算法是\(\mathcal{O} (n)\)的

wayne 发表于 2014-7-28 23:47:15

282842712474 发表于 2014-7-28 13:25
请原谅我的挖坟呀^_^

wayne兄,你的这段代码,我在我的mathematica 9上运行,计算n=20000011(两千 ...

我的没问题,耗时6秒钟,截图为证:

(Mathematica 10,windows 8.1,64bit)

282842712474 发表于 2014-7-29 01:17:59

wayne 发表于 2014-7-28 23:47
我的没问题,耗时6秒钟,截图为证:

(Mathematica 10,windows 8.1,64bit)

刚刚我再运行了一次,很悲剧地,我又强行重启了一次

我的是(Mathematica 9中文版,windows 8.1,64bit),不知道wayne的mathematica有没有设置什么,比如增大了内存等等,我对mathematica不熟悉,也不好说原因。

同样的程序,计算两百万零11的时候,程序还是比较快的,显示1.15秒完成,但不知道为何两千万零11就跪了...

wayne 发表于 2014-7-29 08:06:22

282842712474 发表于 2014-7-29 01:17
刚刚我再运行了一次,很悲剧地,我又强行重启了一次

我的是(Mathematica 9中文版,windows 8.1,64bit ...

我什么都没设置,是10的默认配置。

你这个是软件卡死,还是机器卡死?
如果是软件卡死的话,那很可能就是软件的bug了,或许就是版本9的bug。
如果是机器卡死的话,那估计是内存太小的缘故。 我的机器的内存是6G。
(这段代码要申请的内存空间还是不小的)

wayne 发表于 2014-7-29 08:15:09

不对啊。我刚才测试了一下,凭肉眼观察,发现 n= 20 000 011 ,耗时6秒钟,内存消耗的峰值好像不到400M ,
于是我索性继续增加10倍, n= 200 000 011 ,耗时61秒钟,内存峰值接近4G。算得答案是{4893, 7996},即第4893个素数到第7995个素数之和为200 000 011

chyanog 发表于 2014-7-29 09:21:05

我也测试了一下,win8.1 32bit,2GB内存,Mathematica10运行约19s,内存占用并不夸张;然后用Mathematica9测试,果然卡死,没有强制重启一直卡了15分钟后才好转

wayne 发表于 2014-7-29 09:34:11

chyanog 发表于 2014-7-29 09:21
我也测试了一下,win8.1 32bit,2GB内存,Mathematica10运行约19s,内存占用并不夸张;然后用Mathematica9测 ...

我怀疑是GatherBy函数的问题

282842712474 发表于 2014-7-30 15:42:18

wayne 发表于 2014-7-29 09:34
我怀疑是GatherBy函数的问题

刚装了个10,成功运行了,果然是9的问题呀,不过用时是14.5秒,感觉wayne的机器很快呀,wayne有没有兴趣下载个pypy(pypy是绿色版的),运行一下我那个python程序,看看在你的机器上用时多少?
页: 1 2 3 4 5 6 7 8 [9] 10
查看完整版本: 2011这个素数, 最多是多少个连续素数的和?