数学中国

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

存在任意长度的素数差的等比数列且公比为任意正整数及其倒数

[复制链接]
 楼主| 发表于 2019-3-11 22:14 | 显示全部楼层
用三生素数(0,2,4)产生四生素数(0,2,4,8),第一组为(5,7,11,19)另一种等比数列(5,13,17,19),公比0.5,用,22分24.21秒。共产生6669组(丢了第一组)
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=三素+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(bpz,素数)=0  &&以读取的素数为条件,对被判断值求模 【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-11 22:24 | 显示全部楼层
第一个5生素数等比数列为(17,19,23,31,47),用时3分33.78秒。共计1421组,第二个的最后一个是费马素数257
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=四素+16
            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(bpz,素数)=0  &&以读取的素数为条件,对被判断值求模 【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-11 22:34 | 显示全部楼层
第一个六生素数等比数列(17,19,23,31,47,79),产生了303组,用时
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=五素+32
            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(bpz,素数)=0  &&以读取的素数为条件,对被判断值求模 【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-11 22:40 | 显示全部楼层
用时7.11秒,产生了51组。第一个最后一个素数1733
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=六素+64
            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(bpz,素数)=0  &&以读取的素数为条件,对被判断值求模 【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-11 22:46 | 显示全部楼层
用时1.39秒,产生了10组八生素数等比数列,第一组最后一个素数为1861.(0,2,4,8,16,32,64,128)
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=七素+128
            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(bpz,素数)=0  &&以读取的素数为条件,对被判断值求模 【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-11 22:52 | 显示全部楼层
用时0.21秒,产生了3组,第一个九生素数等比数列的最后一个素数为19937,(0,2,4,8,16,32,64,128,256)
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=八素+256
            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(bpz,素数)=0  &&以读取的素数为条件,对被判断值求模 【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-11 22:59 | 显示全部楼层
在一亿附近没有十生素数的等比数列(0,2,4,8,16,32,64,128,256,512),数字的意义是两个素数的差值,0表是第一个素数的起始位置,即本位,等比数列是指素数差形成的数列为等比数列,非素数本身是等比数列。
 楼主| 发表于 2019-3-12 08:54 | 显示全部楼层
用时70分20.28秒,产生9生素数等比数列生成元。405504个与40320出入太大,不知那里出了问题,没有求余数,有两个条件。
CLEAR ALL
SELECT 1
USE  e:\用vfp求k生素数数量\素数表2.DBF ALIAS 素数表
SELECT 2
USE  e:\用vfp求k生素数数量\九生等比素数生成元.DBF ALIAS 九生元表
    kssj=SECONDS()                      &&取出开始时间
   For N=1 to 7436429
    @ 3,6 say N
        FOR M=521 TO 527 STEP 6
        @ 5,8 say M
         X=M+(N-1)*30
           SELECT 素数表
           go 3
            FOR I=1 TO 6 &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。
            @ 2,5 say  素数   
                IF  X%素数=0 OR X%素数=256%素数 OR X%素数=384%素数 or X%素数=448 OR X%素数=480%素数 OR X%素数=496%素数 or X%素数=504 OR X%素数=508%素数 OR X%素数=510%素数
                  EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF I>6
                SELECT   九生元表        &&打开盛放素数的表
                APPEND BLANK                &&增加一条空记录
                REPLACE 九生元 WITH X     &&将N值付给素数
            ENDIF
        ENDFOR
   ENDFOR
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
 楼主| 发表于 2019-3-12 18:20 | 显示全部楼层
CLEAR ALL
SELECT 1
USE c:\vfp学习\s3165万内素数.DBF ALIAS 素数表
SELECT 2
USE  c:\vfp学习\九生素数等比生成元.DBF ALIAS 九生元表
    kssj=SECONDS()                      &&取出开始时间
   For N=1 to 7436429
    @ 3,6 say N
        FOR M=521 TO 527 STEP 6
        @ 5,8 say M
         X=M+(N-1)*30
           SELECT 素数表
           go 3
            FOR I=1 TO 6 &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。
            @ 2,5 say  素数   
                IF  X%素数=0 OR X%素数=256%素数 OR X%素数=384%素数 or X%素数=448%素数 OR X%素数=480%素数 OR X%素数=496%素数 or X%素数=504%素数 OR X%素数=508%素数 OR X%素数=510%素数
                  EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF I>6
                SELECT   九生元表        &&打开盛放素数的表
                APPEND BLANK                &&增加一条空记录
                REPLACE 九素元 WITH X     &&将N值付给素数
            ENDIF
        ENDFOR
   ENDFOR
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个中发生了一个致命的错误,还把三生元考虑进去了,剩留2个余数类,实际上只有一个,这就是结果中还有5的因子之故。
 楼主| 发表于 2019-3-12 22:53 | 显示全部楼层
CLEAR ALL
SELECT 1
USE e:\用vfp求k生素数数量\素数表2.DBF ALIAS 素数表
SELECT 2
USE e:\用vfp求k生素数数量\九生素数等比生成元新.DBF ALIAS 九生成元
SELECT 3
USE e:\用vfp求k生素数数量\九生等比素数.DBF ALIAS 九生素数
    kssj=SECONDS()                      &&取出开始时间
   For N=0 to 5
    @ 12,15 say  N      
        SELECT 九生成元
        go 1
        DO WHILE NOT EOF()
        @ 14,18 say 九生元
            X=九生元+N*223092870
            Kf=INT(SQRT(X))       &&求出奇数的开方根
            SELECT  素数表             &&打开素数表
            LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
            DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
            ENDCASE
            SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 9          &&从第一条记录开始读取素数(3)
            FOR j=1 TO SSS-8    &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                  &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF    X%素数=0 OR X%素数=256%素数 OR X%素数=384%素数 or X%素数=448 OR X%素数=480%素数 OR X%素数=496%素数 or X%素数=504 OR X%素数=508%素数 OR X%素数=510%素数
                    EXiT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF j>sss-8
                SELECT  九生素数      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 九素 WITH X            &&将N值付给素数
           ENDIF
         SELECT  九生成元
        skip
       ENDdo
   endfor
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
这是用9生素数等比生成元找9生素数等比数列程序,6个周期找到了28组,好像比原来的找的多,不知那一种是正确的(素数表2,如果是万内素数,那就是本次错了)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-24 18:27 , Processed in 0.077542 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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