数学研发论坛

 找回密码
 欢迎注册
查看: 14861|回复: 97

[提问] 2011这个素数, 最多是多少个连续素数的和?

[复制链接]
发表于 2011-1-15 11:37:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

x
2011 本身是一个素数, 且是 11 个连续素数之和。

(157+163+167+173+179+181+191+193+197+199+211=2011)
来源:http://tieba.baidu.com/f?kz=967687985
问题来了,
2011可以被写成哪些连续素数的和?
最长的是可以写成多少个?我想应该不会小于11吧
显然是可以穷举的,但是请写出程序吧,最好还能有注释,
没有注释的程序让人很不喜欢!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-1-15 12:20:54 | 显示全部楼层
661 +673+677=2011这是另外一组
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-1-15 12:32:05 | 显示全部楼层
  1. function output=sushu2011
  2. k=1;%结果个数
  3. for i=2:1:1005 %从2开始寻找
  4.     if isprime(i) %从第一个数是素数的开始找
  5.         [a,b]=istart(i);%求出和(>=2011)与素数序列
  6.         if a==2011 %如果和等于2011,则赋值
  7.            output{k}=b;%对结果赋值
  8.            k=k+1;
  9.         end
  10.     end
  11. end
  12. end
  13. %%%子函数,求出从素数j开始的连续素数,
  14. %使得其和略大于等于2011
  15. function [jsum,output]=istart(j)
  16. jsum=0;%用来保存素数和
  17. k=0;%用来保存素数个数
  18. sushu=[];%用来保存素数序列
  19. for i=j:1:1009
  20.   %j是奇数,找出连续素数的和,使其结果小于等于2011
  21.   %注意是jsum<2011,而不是jsum<=2011
  22.   if isprime(i)&&jsum<2011
  23.      jsum=jsum+i;%连续素数求和
  24.      sushu=[sushu,i];%记录连续素数
  25.      k=k+1;%连续素数的个数
  26.   end
  27. end
  28. output=[k,sushu];%素数个数,素数序列
  29. end
复制代码
上面的代码是用matlab写的,我几乎只会用matlab了,对mathematica有点熟悉,
但是还是对matlab比较熟悉,结果有两个!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-1-15 15:13:30 | 显示全部楼层
Pari/Gp
f(n)=forprime(p=2,n/2,s=0;forprime(q=p,n,s+=q;if(s==n,print(p","q));if(s>n,break())))

f(2011)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-1-15 15:49:25 | 显示全部楼层
4# mathe
mathe好厉害呀,我觉得这个也可以用mathematica编程,但是mathematica不是一个善于编程的软件
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-1-15 16:28:31 | 显示全部楼层
  1. Clear["Global`*"];(*清除所有变量*)
  2. num=2011;(*被求的数*)
  3. geshu=PrimePi[num];(*num以下的素数的个数*)
  4. tab=Table[Prime[n],{n,geshu}];(*给出num以下的素数表*)
  5. Do[
  6.    sum=0;
  7.    t=0;
  8.    Do[
  9.       sum=sum+tab[[j]];(*从第k个素数开始求和*)
  10.       t=t+1;(*参加求和的素数个数*)
  11.       (*如果和等于num,则输出是从第k个素数开始的*)
  12.       If[sum==num,Print[{k,t}]];
  13.       (*如果和大于num,从第k个素数开始的连续素数序列没有符合要求的*)
  14.       If[sum>num,Break[]],
  15.       {j,k,geshu}
  16.      ],
  17.    {k,1,geshu}
  18.   ]
复制代码
这个代码是用mathematica写的,速度要快很多很多!

结果是
{37,11}

{121,3}

{305,1}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-1-15 16:30:09 | 显示全部楼层
为了使别人更加容易代码,我使用了类似于C语言的风格的代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-1-15 16:37:12 | 显示全部楼层
  1. Clear["Global`*"];(*清除所有变量*)
  2. num=2011;(*被求的数*)
  3. geshu=PrimePi[num];(*num以下的素数的个数*)
  4. tab=Table[Prime[n],{n,geshu}];(*给出num以下的素数表*)
  5. Do[
  6.    sum=0;
  7.    t=0;
  8.    Do[
  9.       sum=sum+tab[[j]];(*从第k个素数开始求和*)
  10.       t=t+1;(*参加求和的素数个数*)
  11.       (*如果和等于num,则输出从第k个素数开始的连续t个素数序列*)
  12.       If[sum==num,Print[{t,tab[[k;;(k+t-1)]]}]];
  13.       (*如果和大于num,从第k个素数开始的连续素数序列没有符合要求的*)
  14.       If[sum>num,Break[]],
  15.       {j,k,geshu}
  16.      ],
  17.    {k,1,geshu}
  18.   ]  
复制代码
结果是{个数,连续素数序列}的形式
如下:
{11,{157,163,167,173,179,181,191,193,197,199,211}}

{3,{661,673,677}}

{1,{2011}}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-1-15 16:43:05 | 显示全部楼层
9527(对于这个数,请见周星驰的电影吧或者百度)是个很好的数,
输出结果是{29,{241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419}}
居然是连续29个素数之和,真的很奇妙的一个数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-1-17 07:56:47 | 显示全部楼层
4# mathe
mathe好厉害呀,我觉得这个也可以用mathematica编程,但是mathematica不是一个善于编程的软件
mathematica 发表于 2011-1-15 15:49

用Mathematica编程只需一行代码 即可搞定!!!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2019-3-22 13:52 , Processed in 0.055520 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表