数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: 白新岭

[原创]请教vfbpgyfk先生一个编程问题

  [复制链接]
 楼主| 发表于 2010-5-15 16:12 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

我验证了它4999968979的确是一组四胞胎素数群中的最后一个素数,其余三个可有它通过-2,-6,-8得到。从这个事实上,我无法回答你的问题。
我提的疑问是从外循环次数上考虑的,如果你确实把50亿内的筛选完了,那外循环次数应该是:50亿/210=23809523.8≈23809524,澳,现在明白了,你给的外循环值少了一个数字2,即把千万位上的数字2给弄丢了。
发表于 2010-5-15 16:19 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

白新岭:您好!
我把初始值为199的也做出来啦,而且把19、109、199都合到一个表中了,经排序后,与以前的2亿内的四胞胎进行比较,除缺少5、7、11、13外,全部一致,总数量是:8096和8097。另外,如果计算初始值为19时,应该从素数3开始,否则将失去19这组。
下面把程序贴上,供参考。
************************************************************
CLEAR
SELECT 1
USE D:\nabaoj\白新岭\白新岭表.DBF EXCL ALIAS 白新岭
ZAP
SELECT 2
USE D:\nabaoj\随机素数表.DBF ALIAS 素数表
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
yxk=0
bcz=210
csz=19
kssj=SECONDS()                      &&取出开始时间
*FOR i=xks TO zds                   &&外循环开始
FOR i=0 TO 952382
@12,10 SAY i
bpz=csz+(i+yxk)*bcz                 &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 素数表                       &&打开素数表
LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
DO CASE
CASE EOF()                          &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 2                                &&从第二条记录开始读取素数(3)
FOR j=2 TO SSS                      &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 &&如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF j>sss
SELECT 白新岭                       &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 外环值 WITH i               &&将外循环数值保存到外循环字段中(外循环数据栏)
REPLACE 被判值 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
REPLACE 开方根 WITH kf              &&将开方根保存到开方根字段中(开方根值数据栏)
ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
SELECT 白新岭
BROWSE
CLEAR ALL
**************************************
注:这是初始值为19的程序,使用时,把直接赋值去掉,使用输入值也可。
如果能把取模条件规律总结出来,用计算机程序依据而行,随着判断数的增大,逐步去掉小素数,就能减少取模个数。可能使运行时间短些。
***!!使用这个程序时,请把前面打开数据表语句中的路径,改为您的机器上的路径。除此以外,复制到程序中(文件类型为.PRG),即可运行。
[br][br]-=-=-=-=- 以下内容由 vfbpgyfk 时添加 -=-=-=-=-
应该是这个问题,我的键盘2和1不太好用,必须使劲按。
 楼主| 发表于 2010-5-15 16:26 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

[这个贴子最后由白新岭在 2010/05/15 04:32pm 第 2 次编辑]

你得到的34248应该是正确的,它的3倍为:34248*3=102744个(组),而我用我以先给出的积分公式得出值是103094,相对误差为103094-102744=350个(组)。
积分值取前几项比较合理,到现在我也不知道,我是把积分中的阶乘项与LN(n)相比对的,如果积分式的第m项K!/6中的k已经大于LN(n)的值就结束,只取它的前几项,以后的项不在采用。
从你编程运行结果看,实际数据还是支持我的公式的。如果你不相信我的公式,你可以先不公布你的结果,当你要求我用公式计算出某n前的个数时,你比对后,再告诉我实际个数。
 楼主| 发表于 2010-5-15 17:12 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

[这个贴子最后由白新岭在 2010/05/15 05:30pm 第 2 次编辑]

“如果能把取模条件规律总结出来,用计算机程序依据而行,随着判断数的增大,逐步去掉小素数,就能减少取模个数。可能使运行时间短些”这个问题可以解决,但是你需做准备工作,那就是先得到初始值及步长。
方法大同小异,因为你喜欢编程,所以就给一种方法用编程得到不同的初始值。(我一般是习惯用Excel得到初始值的)
初始值只有可能在奇数位上产生,即在2n-1中产生,一般来说,我们需要合适数量的初始值,因为初始值数量越多,对程序来说,运行也会减慢,这就看利弊关系了。因为excel表格的限制,我一般取3-6万个初始值。
在前几楼我已经有些这方面的描述。直接说吧(你只有慢慢的理解),因为给了四个偶数做限制条件(0,2,6,8),所以从素数5开始对自然数分类,则余数0,2,1,3占所有分类的4/5,只有一类符合要求,同样按素数7分类余数0,2,6,1也占4类,留下3类余数符合条件,即余数3,4,5符合条件,当素数大于8时,余数中的0,2,6,8不符合条件,其余的都符合条件,这样还有11-4=7类余数符合条件,即符合条件的类数=(5-4)*(7-4)*(11-4)*(13-4)*(17-4)*(19-4)=1*3*7*9*13*15=36855,这个数量已经可以了,此时步长=2*3*5*7*11*13*17*19=9699690.
也就是说,被判断值=筛选出来的初始值(每个初始值,与以前的19,109,199意思相同)+0到n*9699690,这时,外循环值一次可跨越9699690个自然数,显然需要筛选的数据就少得多了,只不过,在这个新模型中,外循环是2维变量,出次数是变量外,初始值也必须是变量,以便取到每一个被判断值。
那么,怎样形成初始值数据表呢?
这好办,只需把被判断值=2n-1,n从0到9699690/2=4849845,也就是对这4849845个奇数进行筛选,得到我们要的初始值。
筛选步骤,调入一个被判断奇数值,然后调入素数3(素数2就不用调取了),进行求余数,同时对0,2,6,8也求余数(当然,它们对模3的余数只有0,和2,余数1可以过关,即在2n-1的数中,余数为1的都可以通过3的检验,即仅留下6n-5的数,继续调入素数5进行筛选,(0,2,6,8)对模5的余数是(0,2,1,3),即只留下余数为4的类;继续调入素数7,,(0,2,6,8)对模7的余数是(0,2,6,1),即只留下余数为3,4,5的类;当调入素数11时,(0,2,6,8)对模11的余数不变(为保证程序前后统一,也对(0,2,6,8)关于素数11求余数(虽然值并不改变);一直调取到素数19为止。
没有被3-19之间的素数筛除掉的9699690以内的奇数就是我们要判断的初始值,从筛选初始值的过程中,可以看出,后边的主程序不需要3-19的素数参与,因为它们已经参与过了。
第一个调取的素数为23.
发表于 2010-5-15 17:17 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

按3倍计算,只能是估计值,实际上不是完全相等。以2亿内为例:初始值为19时,有2688组;初始值为109时,有2757组;初始值为199时,有2651组。
 楼主| 发表于 2010-5-15 17:40 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

下面引用由vfbpgyfk2010/05/15 05:17pm 发表的内容:
按3倍计算,只能是估计值,实际上不是完全相等。以2亿内为例:初始值为19时,有2688组;初始值为109时,有2757组;初始值为199时,有2651组。
这就是熊一兵先生研究的《概率素数论》中的最大边界问题及等几公理。
 楼主| 发表于 2010-5-15 17:43 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

下面引用由vfbpgyfk2010/05/15 05:17pm 发表的内容:
按3倍计算,只能是估计值,实际上不是完全相等。以2亿内为例:初始值为19时,有2688组;初始值为109时,有2757组;初始值为199时,有2651组。
这种判断方法是基于概率原则。在100000次投掷硬币时,我们只能估计正反面各占50%,即每种情况各占50000次。还有色子等
 楼主| 发表于 2010-5-16 08:45 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

近来打扰先生已经不少了,谢谢先生的帮助。
我想我必须慢慢的学习vfp软件,一口不可能吃成一个胖子。
日后,有不懂的地方还需要先生帮助。
对于,k生素数群的独立筛选问题,我可以构造出相四胞胎素数群的数学模型。
它们除预先给的偶数不同和个数不同外,其余所用方法基本相同。
如果想减少运算量,那就需要增加初始值数量及增大步长,因为在增加的同时,会成倍的缩减外循环次数,整体运算数据会减少。
就拿一直讨论的问题为例吧,如果我们用3个初始值及210的步长,要对100亿内数据进行处理,我们需要计算机处理的总数据为:3*100亿/210=142857143;而用9699690做步长时,这时初始值数量为(5-4)*(7-4)*(11-4)*(13-4)*(17-4)*(19-4)=1*3*7*9*13*15=36855个初始值,步长=2*3*5*7*11*13*17*19.
这样计算机需要处理的数据为:36855*100亿/9699690=37996060.
这里只有3千8百万个要处理的数据,而原先是1点428亿,相当于后边的3.75倍,而且后边是从素数23开始调取第一个参与运算的素数。
 楼主| 发表于 2010-5-16 08:51 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

只是,用后边的方法,程序需要稍作改变,一个需要初始值存放表(而且是事先做好的),就像素数表那样。
另外,把外循环需要变成2维的。即除了原先的外循环是序号变量外,初始值也需要一个序号变量。
发表于 2010-5-16 12:42 | 显示全部楼层

[原创]请教vfbpgyfk先生一个编程问题

如果外循环改为二维,就要考虑到二维积与和问题,即:((一循环最大/2)*(一循环最小+一循环最大))*二循环最大,这个计算算量不可不考虑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2024-5-16 17:34 , Processed in 0.071289 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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