|
[原创] 尹志元_简证命题(1+1)
尹志无侠客:您好!
看了您的证明,也研读了您程序,在此献丑,请见谅。
1、思路廷好,采用了奇数对原理。
2、由于没有使用中间点,出现了重复素数对,而后还要减去一半,影响运算速度。
3、有些表达式或提示等,不如直接些。
4、采用这种方式运行时间长,我比对了一下,当求解偶数为1000000时的素数和配素数对,用我的方法共用11.75秒(9.75+2),而您的程序是7分22.14秒,您的程序所用时间的零头都将近是我的两倍。这样,数据再大,那时间就难以承受啦。最近,我求解了两个亿内的素数并配对,共用时间是140分32.14秒+4分51.05秒=145分23.19秒(计算速度与计算机配置有关)。我的求素数和配素数主体思路详见:补充《≥6的偶数是两个素数之和起码存在一对》(一)和(二)。补充(一)是求素数编程思路,补充(二)是配素数对编程思路。
5、如是使用数据库存贮素数和素数对,可以保存每个素数和素数对,便于分析、研究。而且可以不断地补充素数表,免除重复劳动。
6、下面依据您的思路,改编出一个程序,请参考。
7、循环语句用DO还FOR以个爱好或需要而定,一般是依据循环区间的数能否确定,能确定的大多数用FOR循环语句,用FOR循环语句,还可以直接使用步长命令。循环区间的数不能确定的,用DO循环语句较多。
8、建一个素数表(SSB.DBF)和素数对表(SSD.DBF)
SSB.DBF表中的字段有:偶数,素数
SSD.DBF表中的字段有:偶数,小素数,大素数
9、改编后的程序,当偶数等于一百万时,求素数和配素数对全部完成共用14.40秒。如果把“越三”方法加进去,计算时间可以进一步缩短。
* 依据尹志元《简证命题(1+1)》程序思路改编的程序
Clear
input "请输入偶数:x=" to x &&这个如果使用表单形式,要好看些
clear
w2=0
l=0
Pn=0 && Pn 即为 Dx(1,1)。(作者注解)
@1,8 SAY"尹志元:《简证命题(1+1)》_倒序相加 6→[L3(>)+L3(<)]"color B*/+W
@2,6 SAY"--------------------------------------------------------"
@3,12 SAY"(yzy_dxxj_tj.prg - Microsoft Visual FoxPro)"&& dxxj-倒序相加;tj-统计。
SET TALK OFF
kf=INT(SQRT(x))
IF MOD(kf,2)=0
kf=kf+1 &&防止漏掉开方内的素数
ENDIF
SELECT 1
USE E:\猜想\DATA\SSD.DBF EXCL ALIAS SSD
ZAP &&清空表中信息
SELECT 2
USE E:\猜想\DATA\SSB.DBF EXCL ALIAS SSB
ZAP
kssj=SECONDS() &&开始计时
*先求素数和形成素数表
FOR i=3 TO 7 STEP 2
APPEND BLANK
REPLACE 偶数 WITH x
REPLACE 素数 WITH i
ENDFOR
Sss=3 &&表中共3条记录
*因为10前的素数都在表中啦,所以从11开始,而且跨过偶数(跨二),这样能省去一半时间
*求解开方根前的素数
FOR l=11 TO kf STEP 2 &&求开方根前的素数
GO 1
FOR k=1 TO sss
IF MOD(l,素数)=0
EXIT
ENDIF
SKIP
ENDFOR
IF k>sss
APPEND BLANK
REPLACE 素数 WITH l
@5,14 SAY "素数个数="+LTRIM(STR(RECNO()))
ENDIF
Sss=RECCOUNT()
ENDFOR
GO BOTTOM
sss=RECNO()
xks=素数+2
* 求解开方根后的素数
FOR l=xks TO x STEP 2
GO 1 &&因为我们是从3开始的
*重复使用素数表中的素数进行判断,减少重复计算而影响运算速度
FOR k=1 TO sss
IF MOD(l,素数)=0
EXIT
ENDIF
SKIP
ENDFOR
IF k>sss
APPEND BLANK
REPLACE 素数 WITH l
@5,14 SAY "素数个数="+LTRIM(STR(RECNO()))
ENDIF
ENDFOR
@5,23 SAY REPLICATE(" ",30)
*下面是配素数对
Zd=x/2 &&救出中点值
Pn=0 &&素数对
GO 1
Xsx=RECNO() &&小素数序数
Dsx=RECCOUNT() &&大素数序数
DO WHILE .T.
GO Xsx
Xss=素数 &&读取小素数
GO Dsx
Dss=素数 &&读取大素数
IF Xss>Zd OR Dss<Zd
EXIT
ENDIF
DO CASE &&利用奇素数之和进行判断
CASE Xss+Dss<x
Xsx=Xsx+1
CASE Xss+Dss=x
Pn=Pn+1
SELECT ssd
APPEND BLANK
IF Pn=1
REPLACE 偶数 WITH x
ENDIF
REPLACE 小素数 WITH Xss
REPLACE 大素数 WITH Dss
Xsx=Xsx+1
Dsx=Dsx-1
@5,14 SAY "Dx(1,1)="+LTRIM(STR(Pn))
CASE Xss+Dss>x
Dsx=Dsx-1
ENDCASE
SELECT ssb
ENDDO
SELECT ssb
@5,1 SAY REPLICATE(" ",130)
*@5,1 SAY "Dx(1,1)= "+LTRIM(STR(Pn*2)) &&因为该程序求得值没有重复
@5,1 SAY "素数个数= "+LTRIM(STR(RECCOUNT())) &&直接标识,根据习惯而定
@5, LEN(LTRIM(STR(Pn*2)))+15 SAY "(Dx="+LTRIM(STR(x))+")"
*@7,1 SAY " x(1,1)= "+LTRIM(STR(Pn)) &&因为该程序求得值没有重复
@7,1 SAY "素数对= "+LTRIM(STR(Pn)) &&直接标识,习惯用原来的形式,可删除本行
@7,LEN(LTRIM(STR(Pn*2)))+15 SAY "0.5*x/(Log(x))^2="+LTRIM(STR(0.5*x/(Log(x))^2,12))
=MESSAGEBOX("共用时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"进展显示")
SET TALK ON
CLOSE DATA ALL
|
|