数学中国

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

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

  [复制链接]
 楼主| 发表于 2019-3-9 20:12 | 显示全部楼层
运行到600万时vfp程序找到4299个反例
 楼主| 发表于 2019-3-9 20:13 | 显示全部楼层
运行到600万时vfp程序找到4299个反例
 楼主| 发表于 2019-3-9 21:29 | 显示全部楼层
我先找的是四生素数(0,2,4,2)的,数字表示相邻素数的间距,0表示第一个素数的起始位置,即本位。用了模条件-2,表示后置2后不能被素数整除。
 楼主| 发表于 2019-3-9 21:37 | 显示全部楼层
现在找到产生等比数列的方法了,先筛出3生素数(0,2,4)的,接着筛(0,2,4,8),依次加砝码,就得到了k生等比数列,只不过开方值要随之改变。
 楼主| 发表于 2019-3-9 21:49 | 显示全部楼层
用时13分36.78秒
CLEAR ALL
SELECT 1
USE e:\用vfp求k生素数数量\素数62个周期.DBF ALIAS 素数表
SELECT 2
USE e:\用vfp求k生素数数量\三生素数表.DBF ALIAS 三素表
SELECT 3
USE e:\用vfp求k生素数数量\四生素数表.DBF ALIAS 四素表
    kssj=SECONDS()                      &&取出开始时间      
        SELECT 三素表
        go 1
        DO WHILE NOT EOF()
        @ 2,5 say 三素
            bpz=三素
            Kf=INT(SQRT(bpz))       &&求出奇数的开方根
            SELECT  素数表             &&打开素数表
            LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
            DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
            ENDCASE
            SSS=RECNO()-2   &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 3           &&从第一条记录开始读取素数(3)
            FOR j=1 TO SSS       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                IF  mod(-2,素数)=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF j>sss
                SELECT  四素表      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 四素 WITH bpz            &&将N值付给素数
          ENDIF
         SELECT  三素表
        skip
       ENDdo
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
因为被判断值没有加2,以至于有些结果误判,最前边的就有23,47两个数,一个加2是5的平方数,一个是
7的平方数,后边的大数也有这种可能,正好是一个素数的平方,总共判断出5005个四生素数。
 楼主| 发表于 2019-3-9 21:58 | 显示全部楼层
我查了一下k生素数的帖子,四生素数在一亿内大概有4722组,我还想着用另一种三生素数查找合在一起,殊不知一种三生素数就找全了,现在想明白了,任何一种三生素数都可以包含全部四生素数,而反过来不成立。
 楼主| 发表于 2019-3-9 22:06 | 显示全部楼层
现在正在运行查找4生素数(0,4,2,4),它的应该比间距为8的四生素数多一倍,只需建立一个新表,四生素数表10,其它不变,把模条件改成与10同余即可。
 楼主| 发表于 2019-3-9 22:37 | 显示全部楼层
24分5.90秒,一亿左右9767组(0,4,2,4)型四生素数。
CLEAR ALL
SELECT 1
USE e:\用vfp求k生素数数量\素数62个周期.DBF ALIAS 素数表
SELECT 2
USE e:\用vfp求k生素数数量\三生素数表.DBF ALIAS 三素表
SELECT 3
USE e:\用vfp求k生素数数量\四生素数表10.DBF ALIAS 四素表
    kssj=SECONDS()                      &&取出开始时间      
        SELECT 三素表
        go 1
        DO WHILE NOT EOF()
        @ 2,5 say 三素
            bpz=三素
            Kf=INT(SQRT(bpz))       &&求出奇数的开方根
            SELECT  素数表             &&打开素数表
            LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
            DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
            ENDCASE
            SSS=RECNO()-2   &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 3           &&从第一条记录开始读取素数(3)
            FOR j=1 TO SSS       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                IF  mod(10,素数)=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF j>sss
                SELECT  四素表      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 四素 WITH bpz            &&将N值付给素数
          ENDIF
         SELECT  三素表
        skip
       ENDdo
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
 楼主| 发表于 2019-3-9 23:15 | 显示全部楼层
用时 29分30.38秒
CLEAR ALL
SELECT 1
USE e:\用vfp求k生素数数量\素数62个周期.DBF ALIAS 素数表
SELECT 2
USE e:\用vfp求k生素数数量\三生素数表.DBF ALIAS 三素表
SELECT 3
USE e:\用vfp求k生素数数量\四生素数表10.DBF ALIAS 四素表
    kssj=SECONDS()                      &&取出开始时间      
        SELECT 三素表
        go 1
        DO WHILE NOT EOF()
        @ 2,5 say 三素
            bpz=三素+8
            Kf=INT(SQRT(bpz))       &&求出奇数的开方根
            SELECT  素数表             &&打开素数表
            LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
            DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
            ENDCASE
            SSS=RECNO()-2   &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 3           &&从第一条记录开始读取素数(3)
            FOR j=1 TO SSS       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                IF  mod(-8,素数)=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF j>sss
                SELECT  四素表      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 四素 WITH bpz            &&将N值付给素数
          ENDIF
         SELECT  三素表
        skip
       ENDdo
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
只建立了一个四生素数等比表,改了一下开方值。一个也没有找到。
 楼主| 发表于 2019-3-9 23:19 | 显示全部楼层
跑道另一个表中去了,有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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