数学中国

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

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

  [复制链接]
 楼主| 发表于 2020-12-1 09:44 | 显示全部楼层
* 以大定小选配素数对
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp温习\不能被等差三生素数的中项合成数.DBF ALIAS 素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\vfp温习\等差三生素数30.DBF  ALIAS 素数表
kssj=SECONDS()
FOR i=1500001  to 2000000
@ 3,6 say i
        X=2*i
          Y=i  
        SELECT 素数表
        LOCATE FOR 三素30>X
         DO CASE
                 CASE EOF()
                         GO Bottom
                 CASE 三素30>X
                         SKIP -1
         ENDCASE
         xjl=1
         djl=RECNO()
         t=.T.
         DO WHILE t
                 dss=三素30
                GO xjl
                 xss=三素30
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                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,"运行时间提示")
这是查找那些不能由等差3生素数d30的中项和合成数程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-1 09:46 | 显示全部楼层
CLEAR ALL
SELECT 1
USE D:\vfp温习\等差三生素元数210.DBF ALIAS 三素元表
    kssj=SECONDS()                      &&取出开始时间
   For N=421 to 2729 STEP 2
     @ 3,6 say N
            bpz=N
                IF  MOD(N,3)=0 OR MOD(N,5)=0 OR MOD(N,7)=0 OR MOD(N,11)=0 OR MOD(N,11)=MOD(210,11) OR MOD(N,11)=MOD(420,11)
                  else
                 SELECT 1      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 三素元 WITH bpz            &&将N值付给素数
              ENDIF
    ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是筛选等差3生素数d210的生成元程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-1 09:51 | 显示全部楼层
CLEAR ALL
SELECT 1
USE D:\vfp温习\参考素数.DBF ALIAS 素数表
SELECT 2
USE D:\vfp温习\等差三生素元数210.DBF ALIAS 三素数元
SELECT 3
USE D:\vfp温习\等差三生素数210.DBF ALIAS 三素表
    kssj=SECONDS()                      &&取出开始时间
   For N=1001 to 10000
     @ 3,6 say N
         SELECT 2
        go 1
         DO WHILE NOT EOF()
            bpz=三素元+(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,素数)
                         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,"运行时间提示")
这是筛选等差3生素数d210的最后一个素数程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-1 09:56 | 显示全部楼层
* 以大定小选配素数对
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=501  to 1000
@ 3,6 say 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,"运行时间提示")
这是寻找不能由等差3生素数d210的中项和合成数程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-1 10:00 | 显示全部楼层
用等差3生素数d210的中项和合成偶数估计不到100万就没有反例了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-2 10:24 | 显示全部楼层
孔子思想,至理名言。学而不思则罔,思而不学则殆。vfp编程也是这样,光看不练永远没有进步。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-2 18:54 | 显示全部楼层
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp温习\等差四生素数2310.DBF  ALIAS 素数表
SELECT 2
USE D:\vfp温习\等差四生素数2310小.DBF  ALIAS 素数表小
kssj=SECONDS()
FOR i=1 to 147090
@ 3,6 say i
        SELECT 素数表
      X=四素-6930
         SELECT 2
         APPEND BLANK
        REPLACE 四素小 WITH X
        SELECT 1
        skip
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
置换等差4生素数d2310中的小素数,即排在头位置上的一类素数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-2 18:56 | 显示全部楼层
* 以大定小选配素数对
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp温习\不能被等差四生素数d2310的小素数合成数.DBF ALIAS 素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\vfp温习\等差四生素数2310小.DBF  ALIAS 素数表
kssj=SECONDS()
FOR i=150 to 10000
@ 3,6 say i
        X=2*i
          Y=i  
        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,"运行时间提示")
这是查找那些不能由等差4生素数d2310中的小素数和合成的偶数程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-3 12:01 | 显示全部楼层
SELECT 1
USE D:\vfp新素数式\素数式2至19.dbf ALIAS 素19
SELECT 2
USE D:\vfp新素数式\k生素数式改进.dbf ALIAS 同距式
kssj=SECONDS() &&取出开始时间
     FOR jj=41  TO  60
       SELECT 2
  go top
  PUBLIC AA
  AE=跨过记录
  js=reCCOUNT()
  FOR Ai=1 TO js
       PUBLIC AD
       AD=跨过记录
       IF AE<AD
       AE=AD
        ENDIF
        SELECT 2
        SKIP
     endfor
FOR I=1 TO 830000
    SELECT 1
    A=式二19
    jl=RECNO() &&返回 记录号
    @ 10,24 say jl
      FOR J=1 TO AE+20
         SELECT 1
         SKIP
         B=式二19
         C=B-A
         IF C>2*jj
         EXIT
         ENDIF
         IF C=2*jj and J>AE
            SELECT 1
            GO jl
            D=式二19
            S=0
            M=0
            FOR E=1 TO J+1  && 跨过记录,比实际的少一次循环,所以+1
            && SELECT 1 这个重复需注销
            && SKIP  这个重复需注销
            F=式二19
            G=F-D
            S=S+G
            M=M+S
            SELECT 1
            SKIP
            ENDFOR
           SELECT 2
           count all for M=二阶累计和 to js
               IF js=0
               SELECT 2
               APPEND BLANK
               REPLACE 开头式值 WITH A
               REPLACE 开头记录 WITH jl
               REPLACE 跨过记录 WITH J
               REPLACE 二次累计和 WITH S
               REPLACE 二阶累计和 WITH M
               REPLACE 跨度总值 WITH C
               endif
          ENDIF
    endfor
    SELECT 1
    GO jl+1
ENDFOR
SELECT 1
GO 1
  endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是终极版本的寻找最密k生素数式的程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-5 11:17 | 显示全部楼层
SELECT 1
USE D:\vfp新素数式\素数5不余4.dbf ALIAS 素数5
SELECT 2
USE D:\vfp新素数式\素数7余4参考.dbf ALIAS 素数7余数
kssj=SECONDS()   &&取出开始时间
SELECT 1               
   FOR i=1 TO 1000
    A=五素4
    jlz=RECNO()  &&记住指针所在位置
    SELECT 2
    jlzs=RECCOUNT()  &&核对表2记录条总数
    IF jlzs=7
    exit
    ENDIF
    ys=MOD(A,7)
    SELECT 2
           count all for ys=余数7 to js
           IF js=0
          SELECT 2
          APPEND BLANK
          REPLACE 余数7 WITH ys &&改成本次追加记录的字段
          REPLACE 记录值 WITH jlz
          ENDIF
          SELECT 1
          skip
   ENDfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是查找素数式中最后出现的余数,它是不符合条件的,要剔除它,与以前的全筛不同。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 06:35 , Processed in 0.066406 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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