数学中国

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

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

  [复制链接]
 楼主| 发表于 2021-1-22 17:26 | 显示全部楼层
SELECT 1
USE D:\循环链条\素数亿.dbf ALIAS 素数表
SELECT 2
USE D:\循环链条\二生素数数量比对.dbf ALIAS 二生素数量
kssj=SECONDS()    &&取出开始时间
FOR i=6 TO 10
erm=5*2^i
n=INT((erm+3)/6)*2+10
SELECT 1
GO 10000000
        s=0
        FOR  j=1 TO 1000000
        q=素数
        jlz=RECNO()  &&记住指针所在位置
       count NEXT n for 素数-q=erm to js  &&改成将要制作参考表的字段名,即表2中的字段名
       s=s+js
       SELECT 1
       GO jlz+1
       endfor
          SELECT 2
          APPEND BLANK
          REPLACE 二m WITH erm &&改成本次追加记录的字段
          REPLACE 计数 WITH s &&改成本次追加记录的字段
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是验证二生素数(P,P+2^m)的数量是否大概相同程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-23 13:03 | 显示全部楼层
SELECT 1
USE D:\循环链条\素数亿.dbf ALIAS 素数表
SELECT 2
USE D:\循环链条\二生素数加减法比对.dbf ALIAS 二生素数量
kssj=SECONDS()    &&取出开始时间
FOR i=6 TO 10
erm=5*2^i
n=INT((erm+3)/6)*2+10
SELECT 1
     GO 1
        s=0
        count NEXT n for 素数<erm to js1  &&改成将要制作参考表的字段名,即表2中的字段名
        FOR  j=1 TO js1
        q=素数
        jlz=RECNO()  &&记住指针所在位置
       count NEXT n for 素数-q=erm to js2  &&改成将要制作参考表的字段名,即表2中的字段名
       s=s+js2
       SELECT 1
       GO jlz+1
       endfor
          SELECT 2
          APPEND BLANK
          REPLACE 二素 WITH erm &&改成本次追加记录的字段
          REPLACE 计数 WITH s &&改成本次追加记录的字段
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
2倍区间内素数差的组数程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-24 16:40 | 显示全部楼层
SELECT 1
USE D:\循环链条\素数亿.dbf ALIAS 素数表
SELECT 2
USE D:\循环链条\二生等比数列.dbf ALIAS 二生等比
kssj=SECONDS()    &&取出开始时间
FOR i=1 TO 22686416
    SELECT 1
        q=素数
        jlz=RECNO()  &&记住指针所在位置
       count NEXT 10 for 素数-q=30 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 2
           APPEND BLANK
           REPLACE 头素 WITH q &&改成本次追加记录的字段
           REPLACE 记录值 WITH jlz &&改成本次追加记录的字段
           ENDIF
           SELECT 1
           GO jlz+1
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是寻找等比k生素数的开头素数的程序(首项为30,公比为6)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-24 17:35 | 显示全部楼层
SELECT 1
USE D:\循环链条\素数亿.dbf ALIAS 素数表
SELECT 2
USE D:\循环链条\二生等比数列.dbf ALIAS 二生等比
SELECT 3
USE D:\循环链条\三生以上等比数列.dbf ALIAS 三生等比
kssj=SECONDS()    &&取出开始时间
FOR i=1 TO 4261776
  @ 5,9 say i
          SELECT 2
          zzwz=记录值 && zzwz是指针位置
          SELECT 1
          GO zzwz
          q=素数
          jlz=RECNO()  &&记住指针所在位置
          count NEXT 57 for 素数-q=210 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 3
           APPEND BLANK
           REPLACE 头素3 WITH q &&改成本次追加记录的字段
           REPLACE jlzf WITH jlz &&改成本次追加记录的字段
           ENDIF
           SELECT 2
           SKIP
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
继续延伸等比k生素数的k值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-26 14:52 | 显示全部楼层
上边的文件已经损坏,没有办法打开,不过,还好,只是损坏程序文件,已经变成乱码。我从新建了个项目,把损坏中表文件逐个打开,并导出。然后添加到新的项目里,又从新获得了新生。这是不幸中的万幸,因为最大的工作量在基础文件,表文件上,它们没有损坏,就可以从新再来,也不算太费事。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-26 15:05 | 显示全部楼层
SELECT 1
USE D:\循环链条新\素数亿.dbf ALIAS 素数表
SELECT 2
USE D:\循环链条新\五生等比数列.dbf ALIAS 五生等比
SELECT 3
USE D:\循环链条新\六生等比数列.dbf ALIAS 六生等比
kssj=SECONDS()    &&取出开始时间
FOR i=1 TO 41490
  @ 5,9 say i
          SELECT 2
          zzwz=记录值5 && zzwz是指针位置
          SELECT 1
          GO zzwz
          q=素数
          jlz=RECNO()  &&记住指针所在位置
          count NEXT 12440 for 素数-q=46650 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 3
           APPEND BLANK
           REPLACE 头素6 WITH q &&改成本次追加记录的字段
           REPLACE 记录值6 WITH jlz &&改成本次追加记录的字段
           ENDIF
           SELECT 2
           SKIP
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
&&注解,当每升高一个台阶,只需相应的改变一些表名,和搜寻范围,及跨度即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-26 15:34 | 显示全部楼层
SELECT 1
USE D:\循环链条新\素数亿.dbf ALIAS 素数表
SELECT 2
USE D:\循环链条新\七生等比数列.dbf ALIAS 七生等比 &&  可以改成a文件
SELECT 3
USE D:\循环链条新\八生等比数列.dbf ALIAS 八生等比  &&可以改成b文件,为了通用
kssj=SECONDS()    &&取出开始时间
FOR i=1 TO 1565
  @ 5,9 say i
          SELECT 2
          zzwz=记录值7 && zzwz是指针位置
          SELECT 1
          GO zzwz
          q=素数
          jlz=RECNO()  &&记住指针所在位置
          count NEXT 447896 for 素数-q=1679610 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 3
           APPEND BLANK
           REPLACE 头素8 WITH q &&改成本次追加记录的字段
           REPLACE 记录值8 WITH jlz &&改成本次追加记录的字段
           ENDIF
           SELECT 2
           SKIP
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
&&在这个世界里,还真是种瓜得瓜种豆得豆,不足为奇。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-26 16:13 | 显示全部楼层
SELECT 1
USE D:\循环链条新\素数亿.dbf ALIAS 素数表
SELECT 2
USE D:\循环链条新\八生等比数列.dbf ALIAS 八生等比 &&  可以改成a文件
SELECT 3
USE D:\循环链条新\九生等比数列.dbf ALIAS 九生等比  &&可以改成b文件,为了通用
kssj=SECONDS()    &&取出开始时间
FOR i=1 TO 280
  @ 5,9 say i
          SELECT 2
          zzwz=记录值8 && zzwz是指针位置
          SELECT 1
          GO zzwz
          q=素数
          jlz=RECNO()  &&记住指针所在位置
          count NEXT 2687384 for 素数-q=10077690 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 3
           APPEND BLANK
           REPLACE 头素9 WITH q &&改成本次追加记录的字段
           REPLACE 记录值9 WITH jlz &&改成本次追加记录的字段
           ENDIF
           SELECT 2
           SKIP
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
&&上下楼的基本一致。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-27 15:12 | 显示全部楼层
SELECT 1
USE D:\循环链条新\素数百亿.dbf ALIAS 素数表
SELECT 2
USE D:\循环链条新\等比素数a.dbf ALIAS 等比a
kssj=SECONDS()    &&取出开始时间
SELECT 1
GO 1
FOR i=1 TO 842878
  @ 5,9 say i
          q=素数
          jlz=RECNO()  &&记住指针所在位置
          count NEXT 9 for 素数-q=30 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 2
           APPEND BLANK
           REPLACE 素a WITH q+30 &&改成本次追加记录的字段
           ENDIF
           SELECT 1
           go jlz+1
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
&& 在素数表中查找二生素数(P,P+30)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-27 16:06 | 显示全部楼层
SELECT 1
USE D:\循环链条新\等比素数a.dbf ALIAS 素数a  &&比制作表的素数值小(即下表)        原表在条件为真时
SELECT 2
USE D:\循环链条新\等比素数b.dbf ALIAS 素数b  &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同   在条件为真时制造表,即新表
SELECT 3
USE D:\循环链条新\素数亿.dbf ALIAS 素数表 &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同
kssj=SECONDS()   &&取出开始时间
FOR n=1 TO 3
@ 5,9 say n

IF MOD(n,2)=1 &&条件为真时,由a表制作b表,a表用一个,b表用2个,a表,为1和2,1表为主;b表为3和4,3表为主表
    SELECT 2
    DELETE ALL
    PACK
SELECT 1
        go 1
        do while not eof()
        bpz=素a+30*6^n
        Kf=INT(SQRT(bpz))       &&求出奇数的开方根
        SELECT  3             &&打开素数表
        LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 1          &&从第一条记录开始读取素数(3)
        FOR j=1 TO SSS      &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  2      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 素b WITH bpz            &&将N值付给素数
        ENDIF
        SELECT 1
        skip
       enddo
   
ELSE  &&条件为假时,由b表制作a表,b表用一个,a表用2个  (a表,为1和2,1表为主;b表为3和4,3表为主

SELECT 1
    DELETE ALL
    PACk
        SELECT 2
        go 1
        do while not eof()
        bpz=素b+30*6^n
        Kf=INT(SQRT(bpz))       &&求出奇数的开方根
        SELECT  3             &&打开素数表
        LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 1          &&从第一条记录开始读取素数(3)
        FOR j=1 TO SSS      &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  1      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 素a WITH bpz            &&将N值付给素数
        ENDIF
        SELECT 2
        skip
       enddo
       endif
      
   endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
&& 这是用递归算法(或者称谓:金字塔算法)来寻找素数一阶差分等比数列程序,它比寻找最密素数式程序要简单些。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 09:01 , Processed in 0.097092 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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