数学中国

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

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

  [复制链接]
 楼主| 发表于 2010-5-20 18:57 | 显示全部楼层

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

外循环值从0-476190,  【k=54763]】,运行时间为21分42.62秒。
CLEAR
SELECT 1
USE f:\MYVFP\学习VFP\四胞胎素数群.DBF EXCL ALIAS 四胞胎素数
SELECT 2
USE f:\MYVFP\学习VFP\新制素数表.DBF ALIAS 新制素数
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
yxk=54763
bcz=210
csz=19
kssj=SECONDS()                      &&取出开始时间
*FOR i=xks TO zds                   &&外循环开始
FOR i=0 TO 476190
@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
 楼主| 发表于 2010-5-20 19:02 | 显示全部楼层

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

在111335700内,初始值为19的共有1800条符合记录。按上边的运行时间,从现在运行程序的话,大概可以计算35.45亿,为了不超时,今天先计算30亿的。
发表于 2010-5-20 20:26 | 显示全部楼层

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

白新岭:您好!
首先祝贺您,这么快就掌握程序的使用和修改程序。
关于ZIP命令问题,在使用时,如果不想清空表,请选择“否”。
如果您想使用输入任意值的话,把前面带有“INPUT”语句最左边的“*”去掉即可依需输入相关数据。如果这样操作,还要把对应的输入值删除或在他们的最左边加上“*”,外循环语句的开始和终结数值改为变量(输入语句的最后那个变量)。最左边的“*”表示是注释,程序运行时不执行这条语句。后面的“&&”是对本条语句的注释,运行时,也不执行。
关于您做过稍微修改事宜,我没有比较,只要能正确运行即可。
 楼主| 发表于 2010-5-21 08:44 | 显示全部楼层

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

下面引用由vfbpgyfk2010/05/20 08:26pm 发表的内容:
白新岭:您好!
首先祝贺您,这么快就掌握程序的使用和修改程序。
关于ZIP命令问题,在使用时,如果不想清空表,请选择“否”。
如果您想使用输入任意值的话,把前面带有“INPUT”语句最左边的“*”去掉即可依需 ...
这大部分功劳都是先生的。
之所以能一知半解,是与我的工作有关,我的工作要求自己必须熟练的运用Excel软件的各项功能,透视图,查询,导入数据等等,还有好些函数。我还学着运用了一个月的office数据库软件。多多少少也积累些知识。
另外还告诉先生我的数据进展情况,现在才计算了差不多1100万个外循环值,看来运算时间要超过预期(我原以为到现在一定可以处理完)。
 楼主| 发表于 2010-5-21 11:57 | 显示全部楼层

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

现在快12点了,才完成了10/11,还有1/11的数据未处理,已用时17小时,估计还需要2个小时才能结束。
 楼主| 发表于 2010-5-21 15:31 | 显示全部楼层

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

显示用时308分46.06秒,我想这个时间不对,大概应是19小时8分46.06秒。我想把数据调出来与我以前用Excel软件计算结果比对一下,以验证是否有问题,一般来说不会出问题,因为先生已经验证了。(计算的数据是从111500149到3111500299之间的数据,跨度大概为30亿,只计算了1/3的数据,因为109和199没有计算,如果正确,我不在计算它们,我将从22亿后开始计算,前边的数据已经得到)。
发表于 2010-5-21 15:54 | 显示全部楼层

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

如果还要进行那么多的数据计算,是否把程序转为表单式,那样会使计算速度快些。因为这种显示进度,比表单慢。另外,之所以加进进度显示,主要目的是为了表示计算机在运行,否则,是否死机,无法判断,什么也不显示,让人干着急。
发表于 2010-5-22 08:58 | 显示全部楼层

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

哥猜本身无反例!————这是成千上万的数学家早已得到过的结论了!
你们何苦还在做呢?!
 楼主| 发表于 2010-5-22 10:01 | 显示全部楼层

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

下面引用由vfbpgyfk2010/05/21 03:54pm 发表的内容:
如果还要进行那么多的数据计算,是否把程序转为表单式,那样会使计算速度快些。因为这种显示进度,比表单慢。另外,之所以加进进度显示,主要目的是为了表示计算机在运行,否则,是否死机,无法判断,什么也不显 ...
先生的建议很好,我希望先生把本程序转为表单式。
我大概计算了一下时间,如果按这个程序计算下去,恐怕没有300,200天的时间是无法算出10^12内的四胞胎素数群的,在Excel上,用手工操作加电算化计算也可以完成任务(指筛出10^12内的四胞胎素数群),只是要比这样辛苦罢了。
另外,把被判断值改成两个变量的表达式可以节省时间,我不懂在这样的式子中,调用会增加多少时间,但是它所要处理的数据要少的多,因为没扩大一个素数周期,都有4/Pi的数据量被排除。
举例,在本程序中如果要把1亿内的数据全部筛选完,就必须对3*1亿/210=3*476190.476=1428571.5个数据(被判值)进行处理,这是用210这个步长(我称它周期,有周而复始之意,即每跨过210个自然数,就会有3个自然数有可能产生四胞胎素数群的代表制),它=2*3*5*7,意思是已经经过2,3,5,7这4道素数关卡,即没有被它们(指2,3,5,7)筛选出局。
如果用2*3*5*7*11*13*17*19=9699690这个步长做为筛选周期,则它内能过2,3,5,7,11,13,17,19这8个素数关卡的自然数(即初始值)是:1*1*(5-4)*(7-4)*(11-4)*(13-4)*(17-4)*(19-4)=3*7*9*13*15=36855,那么1亿内程序要处理的数据是多少呢?(即被判断值有多少个)它=36855*1亿/9699690=379960.6,即只有38万不到,而前边要处理,142.8万多的数据,不到它的零头,142.8/38=3.758,大概是大步长的3.76倍,那么时间就从300天降到300/3.76=79.79天,显然要快的多。而初始值在Excel软件中很快能完成。(我还没有熟练掌握vfp软件,如果熟悉了,或许比Excel更快)
现在我想到了另一个问题,不知先生是否可以帮助,基本思路与此程序有一定的关联。
这样叙述吧,开始时,你也问过,初始值,步长是如何得到的,我要说的也就是此问题,因为vfp的记录条远远大于Excel的65536条记录,利用这个,我们可以大大的缩短时间和缩放被处理的数据(指被判断值),这次不是判断筛选四胞胎素数群的代表制,而是制造初始值,怎么制造,是这样的,开始还是把19作为第一个初始值,然后把它加上[0到(7-1)]*30,意思是得到7个不同的值,分别为19+0*30,19+1*30,19+2*30,19+3*30,19+4*30,19+5*30,19+(7-1)*30,这样就得到210周期内(步长内可能产生四胞胎素数群的代表值),然后对每个新数进行排查,其检验方法是,把每个数对素数7求余,把(0,2,6,8)也对7求余,如果新数对7的余数在后边给的4个偶数对7的余数当中,就去掉它,没有相同(与4个偶数对7的余数中的任何一个都不同),就留下它,进入下一个素数的同样排查上去,如法炮制,直到达到我们的预期时停止。
在炮制以前(在制造初始值和步长以前,我们需提前计算出要制造出的初始值和步长来,对于10^12这样一个范围来说,最好能把步长达到100亿左右,那么它会是怎样的一个数呢?当步长为9699690时,已经用到素数19,接着是23,29,31,而9699690*23=223092870,再乘29得6469693230,已经可以了,如果还嫌小,就在乘一个31,就得到200560490130了,已经超过2千亿了,足够大了,这时共有5个外循环值(10^12/2*10^11),那此时的初始值是多少呢?有36855*(23-4)*(29-4)*(31-4)=472665375,再乘5,总共需要处理的数据为5*472665375=2363326875,有2363326875个数据需要处理,此时我们也可以用前100个素数进行处理,使它的数量大大缩水,对每个数之作前100个素数的排查,不一定就是四胞胎素数群的代表值,处理方法,调取每个被判断值,调取素数(从素数37开始调取到它后边100个素数为止),还是取余数,如果有相同的就去掉,这一百个素数调取完还没有出现相同的就存到另一个表中,待以后继续排查。
发表于 2010-5-22 11:23 | 显示全部楼层

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

白新岭:您好!
看了您的叙述,真为您的精神和毅力所感动,别说我打击您的积极性,下面说点我的看法:
1、搞科学研究,不是搞生产,您要那么多四胞胎干什么用?您能算得完吗?您能证明得完吗?……
2、搞科学研究,是找事物的客观规律,只要抓住了事物的本质,什么问题都解决啦。
3、关于初始值、步长等,建议您好好地总结一下,它们肯定存在着某种内在的规律性。当您掌握了它们的内在规律,一切问题就迎刃而解啦。
4、如果感觉您的研究还存在不足之处,就要把主要精力放在完善上。只要具备够用的基本数据,就行啦。生产问题,是需要者的事。
5、既然我提出来啦,我可以把原先那程序做到表单中,算个事例吧。当您明白了表单与程序的关系后,并非难事。我相信,有了这个事例,您会很地掌握和运用。具体事宜待表单完成后,再有针对性交流。
6、为了交流方便,建议您把邮箱告诉我,像表单等内容通过邮箱较为方便,相对来讲,各自都方便。[br][br]-=-=-=-=- 以下内容由 vfbpgyfk 时添加 -=-=-=-=-
现在,我可以告诉您,四胞台永远找不完,在全人类进程中也找不完,而且还可能存在什么八胞胎、十六胞胎……。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-16 03:53 , Processed in 0.077149 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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