数学中国

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

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

  [复制链接]
发表于 2020-10-22 11:18 | 显示全部楼层
CLEAR
SELECT 1
USE D:\vfp温习\L8四生素数真表.DBF  ALIAS 四胞胎素数
SELECT 2
USE D:\vfp温习\s3165万内素数.DBF ALIAS 新制素数
kssj=SECONDS()                      &&取出开始时间
    FOR i=1800001 TO 18000000
     @22,20 SAY i
     n=i
     bpz=19+(n-INT((n-1)/3)*3-1)*90+INT((n-1)/3)*210&&给被判断值置数,以循环值做变量。
     Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
        SELECT 新制素数                      &&打开素数表
        LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
        DO CASE
        CASE EOF()                          &&如果超出素数表最后一条记录
        GO BOTTOM
        CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
        SKIP -1
        ENDCASE
        SSS=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 4                                &&从第二条记录开始读取素数(3)
        FOR j=4 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 bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
SELECT 四胞胎素数
BROWSE
CLEAR ALL
这是筛选最密四生素数群最后一个素数的程序,运行的不算快,4个小时才筛选了12亿以内的四生素数。
回复 支持 反对

使用道具 举报

发表于 2020-10-24 11:16 | 显示全部楼层
* 以大定小选配素数对
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp温习1\最密4生素数四素不能合成数.DBF ALIAS 素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\vfp温习1\L8四生素数真表.DBF  ALIAS 素数表
kssj=SECONDS()
FOR i=10  to 1000
@ 3,6 say i
    n=i
       X=8+(INT((n-INT((n-1)/5)*5)/2)+(n-INT((n-1)/5)*5))*30+INT((n-1)/5)*210 &&这是在给被判偶数置数,思路每5个偶数构成一个循环期,步长210。
          Y=X/2   &&求出偶数的中值(上一条置数语句,除了外步长210,还有内步长30,但是有2个间断点,所以有些复杂。
        SELECT 素数表
        LOCATE FOR 四素>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 四素>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=四素
                GO xjl
                xss=四素
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 素数对
                                APPEND BLANK
                                REPLACE 偶数 WITH X
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是改动后的:筛选四生素数的尾素不能合成的数,只做了稍微的改变,一个是结束循环条件由原来 IF xss<Y OR dss>Y  改为  IF xss<Y+1 OR dss>Y-1   ,即在中值时是条件真;与条件关联的是 :IF xss>=Y OR dss<=Y改为 IF xss>Y OR dss<Y,即把等号去除(是等号时,不需要输出保存)。这样得到的偶数都是没有四素尾素的和之结果,排除了伪偶数(它们有一组解正好是尾素或中项的二倍)。
回复 支持 反对

使用道具 举报

发表于 2020-10-29 13:18 | 显示全部楼层
* 以大定小选配素数对
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp温习1\最密4生素数四素不能合成数.DBF ALIAS 素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\vfp温习1\L8四生素数真表.DBF  ALIAS 素数表
kssj=SECONDS()
FOR i=40500001  to 41200000
@ 3,6 say i
    n=i
       X=8+(INT((n-INT((n-1)/5)*5)/2)+(n-INT((n-1)/5)*5))*30+INT((n-1)/5)*210 &&这是在给被判偶数置数,思路每5个偶数构成一个循环期,步长210。
          Y=X/2   &&求出偶数的中值(上一条置数语句,除了外步长210,还有内步长30,但是有2个间断点,所以有些复杂。
        SELECT 素数表
        LOCATE FOR 四素>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 四素>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=四素
                GO xjl
                xss=四素
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 素数对
                                APPEND BLANK
                                REPLACE 偶数 WITH X
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-15 09:44 | 显示全部楼层
CLEAR ALL
SELECT 1
USE D:\vfp温习\参考素数.DBF ALIAS 素数表
SELECT 2
USE D:\vfp温习\等差四生素数式至11.DBF ALIAS 四生成元
SELECT 3
USE D:\vfp温习\等差四生素数210.DBF ALIAS 四素表
    kssj=SECONDS()                      &&取出开始时间
   For N=10001 to 1000000
     @ 3,6 say N
         SELECT 四生成元
        go 1
         DO WHILE NOT EOF()
         && 注销@ 2,5 say  素数式11
            bpz=素数式11+(N-1)*2310
             Kf=INT(SQRT(bpz))       &&求出奇数的开方根
            SELECT  素数表             &&打开素数表
            LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
            DO CASE
                 CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                 CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
             ENDCASE
             SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 5          &&从第一条记录开始读取素数(3)
              FOR j=1 TO SSS-4     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                MZ=MOD(bpz,素数)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF MZ=0 OR MZ=MOD(210,素数) OR MZ=MOD(420,素数) OR MZ=MOD(630,素数)
                         EXIT         
                 ENDIF
                 SKIP            &&素数表指针向下移动一个
             ENDFOR
              IF j>sss-4
                 SELECT  四素表      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 四素210 WITH bpz            &&将N值付给素数
            ENDIF
          SELECT  四生成元
        skip
        ENDDO
    endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是产生等差4生素数d210的程序,已经运行了三夜两天,却被我的家人给毁掉了,她开了电源又关了电源。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-22 07:48 | 显示全部楼层
今天想到了一种寻找最密k生素数的方法,用数列0,2,6,8,12,.....或者0,4,6,10,12,.....,把数列长度,定为素数p的2倍(指数列的元素个数),然后以6的跨度递增,用程序记录,起始值,剩余元素的个数,前后两个元素的差值,然后比较那组剩余的元素个数最多,而且距离最短。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 07:32 | 显示全部楼层
今天进一步想了一下素数式问题。0,2,6构成了不被2和3整除的素数式,我们可以找到不被2,3,5,7,11整除的素数式,然后以2为步长,一直增到2310为平方盾为止,大概4,5亿的范围内,而且一定是480的平方个素数式,这是过11前的循环素数式,此方法是根据数论中的定理获得。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 19:15 | 显示全部楼层
CLEAR ALL
SELECT 1
USE D:\vfp温习\参考素数.DBF ALIAS 素数表
SELECT 2
USE D:\vfp温习\等差四生素数式至11.DBF ALIAS 四生成元
SELECT 3
USE D:\vfp温习\等差四生素数210.DBF ALIAS 四素表
    kssj=SECONDS()                      &&取出开始时间
   For N=950001 to 1000000
     @ 3,6 say N
         SELECT 四生成元
        go 1
         DO WHILE NOT EOF()
         && 注销@ 2,5 say  素数式11
            bpz=素数式11+(N-1)*2310
             Kf=INT(SQRT(bpz))       &&求出奇数的开方根
            SELECT  素数表             &&打开素数表
            LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
            DO CASE
                 CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                 CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
             ENDCASE
             SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 5          &&从第一条记录开始读取素数(3)
              FOR j=1 TO SSS-4     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                MZ=MOD(bpz,素数)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF MZ=0 OR MZ=MOD(210,素数) OR MZ=MOD(420,素数) OR MZ=MOD(630,素数)
                         EXIT         
                 ENDIF
                 SKIP            &&素数表指针向下移动一个
             ENDFOR
              IF j>sss-4
                 SELECT  四素表      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 四素210 WITH bpz            &&将N值付给素数
            ENDIF
          SELECT  四生成元
        skip
        ENDDO
    endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是产生等差4生素数d210的程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 19:16 | 显示全部楼层
* 以大定小选配素数对
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp等差四生\四素d210不能合成数.DBF ALIAS 素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\vfp等差四生\四素210.DBF  ALIAS 素数表
kssj=SECONDS()
FOR i=29000001  to 31000000
@ 3,6 say i
     n=i
        X=2*i
          Y=i   
        SELECT 素数表
        LOCATE FOR 四素210>X
         DO CASE
                 CASE EOF()
                         GO Bottom
                 CASE 四素210>X
                         SKIP -1
         ENDCASE
         xjl=1
         djl=RECNO()
         t=.T.
         DO WHILE t
                 dss=四素210
                GO xjl
                 xss=四素210
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                           ELSE
                           t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                         CASE xss+dss>X
                                 GO djl
                                 SKIP -1
                                 djl=RECNO()
                         CASE xss+dss=X
                                 EXIT
                         CASE xss+dss<X
                                 GO xjl
                                 SKIP
                                 xjl=RECNO()
                                 GO djl
                 ENDCASE
         ENDDO
         IF xss>Y OR dss<Y
         SELECT 素数对
                                APPEND BLANK
                                 REPLACE 偶数 WITH X
         ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是查找不能有等差4生素数d210的中项和合成数程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 19:28 | 显示全部楼层
SELECT 1
USE D:\vfp寻找素数式\素数式13.dbf ALIAS 素数13
SELECT 2
USE D:\vfp寻找素数式\过2和3素数式.dbf ALIAS 素数2并3
kssj=SECONDS()                      &&取出开始时间
FOR i=1 TO 15015
   y=2*(i-1)
        IF mod(y,3)=2 OR  mod(y,5)=4 OR  mod(y,7)=6 OR mod(y,11)=10 OR mod(y,13)=12
          ELSE
          SELECT 1
          APPEND BLANK
          REPLACE 式13 WITH y &&改成本次追加记录的字段
         ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是产生至素数13的素数式程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 19:30 | 显示全部楼层
SELECT 1
USE D:\vfp寻找素数式\素数式43.dbf ALIAS 素数43
SELECT 2
USE D:\vfp寻找素数式\素数式13.dbf ALIAS 素数13
kssj=SECONDS()                      &&取出开始时间
FOR i=5761 TO 30030
SELECT 2
go top
   FOR  j=1 to 5760
  x=式13
   y=x+30030*(i-1)
        IF mod(y,17)=16 OR  mod(y,19)=18 OR  mod(y,23)=22 OR mod(y,29)=28 OR mod(y,31)=30 or mod(y,37)=36 OR  mod(y,41)=40 OR  mod(y,43)=42
          ELSE
          SELECT 1
          APPEND BLANK
          REPLACE 式43 WITH y &&改成本次追加记录的字段
          ENDIF
          SELECT 2
          SKIP
   ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是产生30030*30030的,至素数43的程序。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 03:52 , Processed in 0.065430 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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