数学中国

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

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

  [复制链接]
 楼主| 发表于 2019-3-6 07:41 | 显示全部楼层
CLEAR ALL
SELECT 1
USE e:\用vfp求k生素数数量\三生素数表.DBF ALIAS 三素表
SELECT 2
USE  e:\用vfp求k生素数数量\三生素数合成结果.DBF ALIAS 三生合成结果
    kssj=SECONDS()                      &&取出开始时间
   For N=2 to 1000
    @ 3,6 say N
         FOR M=4 TO 16 step 6
          @ 4,8 say M
          X=M+N*30
          Y=X/2
                zhz=Y      &&求出偶数的中值
                SELECT  三素表             &&打开三素数表
                LOCATE FOR 三素>=zhz      &&根据三素表,查找最大三素数
                DO CASE
                CASE EOF()          &&如果超出三素数表最后一条记录
                        GO BOTTOM
                CASE 三素>zhz   &&如果找到三的素数中值大,就将记录指针退回一个,保证使用的最大三素数在中值内,小于等于即
                        SKIP -1
                       ENDCASE
                SSS=RECNO()+1   &&记录下最大三素数(中值内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
                  GO 1           &&从第一条记录开始读取三素数
                  FOR j=1 TO SSS      &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                     I=J
                     Z=X-三素 &&以读取的三素数为条件,对X-三素数值进行判断,看一看是否在三生素数表内
                       go sss-2
                       count next sss+4 for Z=三素 to js
                        IF js>0
                         EXIT         
                        ENDIF
                       GO I+1         &&素数表指针向下移动一个
                  ENDFOR
                   IF j>SSS
                   SELECT 三生合成结果             &&打开盛放素数的表
                   APPEND BLANK                    &&增加一条空记录
                   REPLACE 模30的偶数 WITH X       &&将N值付给素数
                   ENDIF
       ENDFOR
     ENDFOR
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")   
    CLEAR ALL
这是改用计数函数作为条件,来寻找不能有三生素数合成的偶数程序,运行速度快的多,30000内用了17.22秒,而用查找函数时则用17分多,相差悬殊。
 楼主| 发表于 2019-3-6 09:51 | 显示全部楼层
本帖最后由 白新岭 于 2019-3-6 01:53 编辑

不知问什么程序运行前需要在命令窗口输入clear后才运行。在2G内存中用时17.22秒,而在8G四核中用时28.47秒,这是为何,一个是数据库中的表,一个是自由表。
 楼主| 发表于 2019-3-6 15:50 | 显示全部楼层
范围        条件        统计        各段
1000000        <1000000        3878        3878
2000000        <2000000        4143        265
3000000        <3000000        4243        100
4000000        <4000000        4273        30
5000000        <5000000        4289        16
6000000        <6000000        4300        11
7000000        <7000000        4303        3
8000000        <8000000        4304        1
9000000        <9000000        4306        2
10000000        <10000000        4306        0
从这些数据看大部分反例出现在300万以内,我原来认为跨过300万后,运行速度会加快,可实际并不如意,后来仔细想,对了,不会快的,因为要想找到一组三生素数对是很难的,在这些偶数中拥有三生素数对并不多,这不是在孪生素数中,因为差一个ln(N)倍数,所以找一组三生素数对还是比较难的,这就是即便没有三生素数对偶数不出现,它的计算时间还是不少的原因。
 楼主| 发表于 2019-3-6 22:23 | 显示全部楼层
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\偶数素数对.DBF ALIAS 偶数素数
SELECT 2
USE E:\用vfp求k生素数数量\素数表2.DBF ALIAS 素数表
SELECT 3
USE E:\用vfp求k生素数数量\偶数参考素数.DBF ALIAS 偶数参考
GO top                                    &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
DO WHILE  参照元素<6000000                        &&*********既然是调用表中信息,而且是后部分,就应该使用“DO WHILE NOT EOF()”语句,由它来判断是否到文件尾**********
        czss=参照元素
        @ 2,5 say czss                      &&显示记录号
        bpz=12000000-czss                            &&计算被判断值
        Kf=INT(SQRT(bpz))                       &&求出被判断值的开方根
        SELECT 素数表                         &&打开素数表
        LOCATE FOR 素数>=kf                     &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()                          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()                             &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 1                                   &&从第二条记录开始读取素数(37)
        FOR j=1 TO SSS                         &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP                                &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  偶数素数                 &&打开保存求解结果的信息表
                APPEND BLANK                        &&增加一条空记录
        REPLACE 大素数 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
                REPLACE 小素数 WITH czss            &&将开方根保存到开方根字段中(开方根值数据栏)
                REPLACE 偶数 WITH 12000000
        ENDIF
        SELECT 偶数参考
        SKIP
ENDDO
CLEAR ALL
这是知道6000000内的素数,用一个素数表判断大素数,如果是就是偶数1200万的素数对,然后添加在表中。
 楼主| 发表于 2019-3-7 11:46 | 显示全部楼层
我用查找函数时,程序运行很慢,那个表中才6,7万各数据,查一遍估计用时不少,就改用了计数函数,把范围缩小在偶数内的三生素数个数一半多的之内,这样小的偶数内三生素数较少,运行速度提高了50倍,可当偶数较大时,其内的素数个数又在增多,统计范围加大,这时我又想到用偶数范围内的个数与它的一半内个数做差,那么是不是在2倍差的个数范围内一定有它的数对组合呢?它的前后两部分的个数差是累计形成的,安说它内的任何一个数的出现绝对不超过它的累计个数范围,况且这是2倍的,我实际验证后在下结论。
 楼主| 发表于 2019-3-7 15:29 | 显示全部楼层
295楼的叙述可能大家看不明白,现在拿偶数100为例,在100以内有25个素数,小于50的素数有15个,在50至100间有10个,它们的差值为5个,那么100的素数对,大数的出现是不是在25-2-i到25-2-i+9之间呢?表示往前推2个,往后推5+2个,共计覆盖9个素数,5=15-10,另外4个为额外加大的范围,从素数2开始为1(即i=1),那么在22到31之间(数字为素数的序号)有没有100-2=98的值呢?22对应着素数79,31对应着素数127,98如果是素数,在其范围内;第6个素数为13,则查找范围为25-2-6=17,到26之间,17对应着素数59,26对应着素数101,而100-13=87,87在素数59与101之间,最后一个为47,在15位上,范围是25-2-15=8,到17之间,8对应着19,17对应着59,而100-47=53,53在素数19与59之间;由此看来,素数一般不会出现在它之前的位置上(之前的位置是总素数个数--本素数的位置),而大部分是出现在它之后,特别是越靠近中心的部分素数(这里的中心是指大小,非素数个数)。
把素数倒置相加,则得到大于范围值的素数对几乎为零,大部分是小于范围值的,而且是降的趋势,个别处有微小起伏,当靠近中心时会发生交叉现象,可已经离偶数很远了。
 楼主| 发表于 2019-3-7 17:11 | 显示全部楼层
现在对9699690内的素数做了分析,如果是采取偶数一半内的素数个数减去后一半内的素数个数做差,得到的数做范围段,提前2个,滞后8,总共另外算加了10个,结果显示有14000多个反例不在区间内,把调整范围在原来的基础上加10%(基础值是指前后区间的素数个数差值,不是另外加10的10%),没有一个反例,不知道谁能证明偶数的素数对一定在前后范围内素数个数的110%范围内(不一定有解,只要值在其内就可以了)。
 楼主| 发表于 2019-3-7 22:26 | 显示全部楼层
本帖最后由 白新岭 于 2019-3-7 14:27 编辑

6分24.42秒1001到10000之间的9000*3=27000个数(计数范围弄错了,int((sssx-sss)*1.1)+10,扩大了10%),实际因为int((2*sss-sssx)*1.1)+10,它表示前后两个区间的三生素数个数的差扩大10%再+10,比起后部分来说要少很多。
CLEAR ALL
SELECT 1
USE e:\用vfp求k生素数数量\三生素数表.DBF ALIAS 三素表
SELECT 2
USE  e:\用vfp求k生素数数量\三生素数合成结果.DBF ALIAS 三生合成结果
    kssj=SECONDS()                      &&取出开始时间
   For N=1001 to 10000
    @ 3,6 say N
         FOR M=4 TO 16 step 6
          @ 4,8 say M
          X=M+N*30
          Y=X/2
                zhz=Y      &&求出偶数的中值
                SELECT  三素表             &&打开三素数表
                LOCATE FOR 三素>=zhz      &&根据三素表,查找最大三素数
                DO CASE
                CASE EOF()          &&如果超出三素数表最后一条记录
                        GO BOTTOM
                CASE 三素>zhz   &&如果找到三的素数中值大,就将记录指针退回一个,保证使用的最大三素数在中值内,小于等于即
                        SKIP -1
                       ENDCASE
                SSS=RECNO()+1   &&记录下最大三素数(中值内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
                LOCATE FOR 三素>=X     &&根据三素表,查找最大三素数
                DO CASE
                CASE EOF()          &&如果超出三素数表最后一条记录
                        GO BOTTOM
                CASE 三素>X   &&如果找到三的素数中值大,就将记录指针退回一个,保证使用的最大三素数在中值内,小于等于即
                        SKIP -1
                       ENDCASE
                SSSX=RECNO()+1   &&记录下最大三素数(中值内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
                  GO 1           &&从第一条记录开始读取三素数
                  FOR J=1 TO SSS      &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                     I=J
                     Z=X-三素 &&以读取的三素数为条件,对X-三素数值进行判断,看一看是否在三生素数表内
                       go SSSX-3-J
                       count next INT((2*SSS-SSSX)*1.1)+10 for Z=三素 to js
                        IF js>0
                         EXIT         
                        ENDIF
                       GO I+1         &&素数表指针向下移动一个
                  ENDFOR
                   IF J>SSS
                   SELECT 三生合成结果             &&打开盛放素数的表
                   APPEND BLANK                    &&增加一条空记录
                   REPLACE 模30的偶数 WITH X       &&将N值付给素数
                   ENDIF
       ENDFOR
     ENDFOR
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")   
    CLEAR ALL
2910个反例
 楼主| 发表于 2019-3-8 12:30 | 显示全部楼层
算到150万时,有4041个反例正确,实际为4043个,因为程序跳过了0和1时的6个偶数,其中有两个反例。
 楼主| 发表于 2019-3-8 21:21 | 显示全部楼层
对三生素数中项的合成今天vfp算到300万共出现反例4242个(实际另外还有2个,因为编程是从外循环2开始,丢了0与1的情况),用时96分多,共计15万个数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-29 08:39 , Processed in 0.062500 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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