数学中国

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

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

  [复制链接]
 楼主| 发表于 2020-12-15 11:44 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至23简表.dbf ALIAS 素数式23
SELECT 2
USE D:\回到本源\素数式至23简表再化简.dbf ALIAS 素数式23简
kssj=SECONDS()                      &&取出开始时间
SELECT 1
GO  7044495
   FOR  j=1 TO 5000000
   @ 5,9 say j
   s23=素23
   SELECT 2
    SKIP -2000
   count rest for 素23简=s23 to js
          IF js=0
          SELECT 2
          APPEND BLANK
          REPLACE 素23简 WITH s23 &&改成本次追加记录的字段
         ENDIF
       SELECT 1
       skip
     endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
筛选符合条件的素数式中相同的记录条(只保留一个(同一个素数式))。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 08:30 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至31简表再化简.dbf ALIAS 素数式31
SELECT 2
USE D:\回到本源\最密生素数类型标本升级.dbf ALIAS 素数式标本
SELECT 3
USE D:\回到本源\素数式至31真77生.dbf ALIAS 素数式31真77生
SELECT 2
kssj=SECONDS()                      &&取出开始时间
SELECT 2
   GO 1
   FOR  i=1 TO 291   && 总记录条26573663 循环次数是素数式表中记录条数---减k生素数式的k值,尽量比k大点
    jlz=记录值 &&先定个橛子,固定住它
          && jlz=RECNO()  返回指针所在记录值,记下指针位置
          SELECT 1
          GO jlz
        FOR j=1  TO 77  && 内循环,它的值比k值大些,因为跨度内可能是小于k的素数式个数,也可能比k值大,需要进一步筛查
         y=素31 &&从0位开始,
          SELECT 3 &&就选择储存表,把该记录的数据,记录下来
          APPEND BLANK
          REPLACE 素式77 WITH y &&改成本次追加记录的字段,这里不该加1,实际上j值就是k生素数式的k
          SELECT 1
          skip
        ENDFOR
         SELECT 2
         skip
    endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
导出符合条件的素数式链条。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 08:31 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至29简表再化简.dbf ALIAS 素数式29
SELECT 2
USE D:\回到本源\最密生素数类型标本.dbf ALIAS 素数式标本
SELECT 3
USE D:\回到本源\素数式至31简表.dbf ALIAS 素数式31
kssj=SECONDS()                      &&取出开始时间
   FOR  j=1 TO 31
   @ 5,9 say j
   SELECT 2
   FOR  k=1 TO  549
    SELECT 2
     kz=k值
     ktjl=开头记录
     IF kz>77
     SELECT 1
     GO ktjl
     FOR i=1  TO  kz
      s29=素29
      y=s29+(j-1)*6469693230
       @ 15,19 say y
        IF mod(y,31)=0
          ELSE
          SELECT 3
          APPEND BLANK
          REPLACE 素31 WITH y &&改成本次追加记录的字段
         ENDIF
         SELECT 1
         SKIp
        ENDFOR
        ENDIF
        SELECT 2
        SKIP
        jlh=RECCOUNT()
         @ 12,20 say jlh
      ENDFOR
      SELECT 2
      GO 1
     endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
素数式升级程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 08:36 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至31简表再化简.dbf ALIAS 素数式31 &&与素数2-19互素的数(或者式子)
SELECT 2
USE D:\回到本源\最密生素数类型标本.dbf ALIAS 素数式标本 &&已经初步筛选出来的数据,作为初步条件,待进一步验证
SELECT 3
USE D:\回到本源\余数参考表.dbf ALIAS 余数表 &&作为过程表,先一个素数一个素数的过关,然后看剩余的素数式个数是否为77个
SELECT 4
USE D:\回到本源\临时k生素数式表.dbf ALIAS 临时k素式表 &&临时存储k生素数式,为最终存储做准备
SELECT 5
USE D:\回到本源\最密生素数类型标本升级.dbf ALIAS 素数式标本升级  &&需要填写真正的k生素数式
SELECT 6
USE D:\回到本源\素数表.dbf ALIAS 素数表  &&需要填写真正的k生素数式
kssj=SECONDS()                      &&取出开始时间
SELECT 2
   GO 1
   FOR  i=1 TO 291   && 总记录条26573663
    x=k值  && jlz=RECNO() && 返回指针所在记录值
    ktjl=开头记录
    ktss=开头素式
     SELECT 4 &&在重新判断下一个k生素数式之前,先清除掉上一次的素数式
    delete all
    pack
    IF x=77
    SELECT 1
    GO ktjl
    s31=素31   && 把“素19”的值赋给素数式19
   FOR j=1  TO 77
   y=素31
   jlz2=RECNO()
   z=y-s31
   SELECT 4
   APPEND BLANK
   REPLACE k式 WITH z &&把与定了橛子的素数式与指针所在位置的素数式,绝对值赋给“k式”,做为接下来的检查表
    SELECT 1
    GO jlz2+1
    ENDFOR
    SELECT 6
    GO 11
       FOR m=1  TO 10
       ss=素数
        SELECT 3  &&在重新判断下一个素数之前要清空余数表
    delete all
    pack
    SELECT 4
    DO WHILE NOT EOF()
    ks=k式
      ys=MOD(ks,ss)
         SELECT 3
        count all for ys=余数 to js
          IF js=0
          SELECT 3
          APPEND BLANK
          REPLACE 余数 WITH ys &&改成本次追加记录的字段
          ENDIF
          SELECT 4
          skip
        ENDDO
        SELECT 3
        zjlts=RECCOUNT()  &&总记录条数
        IF zjlts=ss
        EXIT
        ENDIF
       SELECT 6
       SKIP
       ENDFOR
       IF m>10
       SELECT 5
       APPEND BLANK
       REPLACE k值 WITH 77 &&改成本次追加记录的字段
          REPLACE 记录值 WITH ktjl
          REPLACE 开头素数式 WITH ktss
          REPLACE 跨度值 WITH 420
        ENDIF
        ELSE
        EXIT
        endif
          SELECT 2
          SKIP
   endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
检查是否为真正的最密素数式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 08:40 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至31简表.dbf ALIAS 素数式31
SELECT 2
USE D:\回到本源\素数式至31简表再化简.dbf ALIAS 素数式31简
kssj=SECONDS()                      &&取出开始时间
SELECT 1
GO  50001
   FOR  j=1 TO 120820
   @ 5,9 say j
   s31=素31
   SELECT 2
   SKIP -10000  &&  开始制作垫底时,不需要此语句,制造好参考数据后,要把指针前移。
          count rest for 素31简=s31 to js   &&   count rest for 素31简=s31 to js  
           IF js=0
          SELECT 2
          APPEND BLANK
          REPLACE 素31简 WITH s31 &&改成本次追加记录的字段
         ENDIF
       SELECT 1
       skip
     endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
去掉重复素数式(基于先出为主原则,重复链条长度量上上限可控)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-17 08:42 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至31简表再化简.dbf ALIAS 素数式31
SELECT 2
USE D:\回到本源\最密生素数类型标本.dbf ALIAS 素数式标本
kssj=SECONDS()                      &&取出开始时间
SELECT 1
   GO 1
   FOR  i=1 TO 39470   && 总记录条26573663 循环次数是素数式表中记录条数---减k生素数式的k值,尽量比k大点
    x=素31  &&先定个橛子,固定住它
    jlz=RECNO() && 返回指针所在记录值,记下指针位置
   FOR j=1  TO 100  && 内循环,它的值比k值大些,因为跨度内可能是小于k的素数式个数,也可能比k值大,需要进一步筛查
   y=素31 &&从0位开始,
   jlz1=RECNO()  &&记录下位置,指针文职
   z=y-x  &&离开第一个素数式的距离(相对距离)
        IF z=420 AND j>=77 &&判断素数式个数是否大于等于k,因为开始位置,占一个素数式。跨度必须是420,
        SELECT 1  &&符合条件后,从新计算一阶累计和,二阶累计和,以为后边是否储存做准备,尽量拆除重复数据,以减小储存量
        GO jlz && 返回符合条件的位置,进行一轮循环,目的是计算s(sum),计算ss(二阶累计和)
        c=素31
        SKIP
        s=0  &&先给它赋值,以0开始
        ss=0  &&先给它赋值,以0开始
        FOR k=1 TO j && 循环次数为j,实际上,并非从0开始,而是以第二个的差值,开始,总的是循环k-1次
        d=素31
        e=d-c &&求出离开固定位置的差值,
        s=s+e &&一阶累计和值
        ss=ss+s  &&二阶累计和值
        SELECT 1 &&循环一次移动一下指针,下移一个,好改变e值,进而影响,s,ss
        skip
        ENDFOR  &&结束求和运算
        SELECT 2  &&选择要储存的表
        count all for ss=二阶累计 to js &&把表中已有的记录中,符合条件的记录条个数赋给变量js
          IF js=0 &&如果没有同样的记录
          SELECT 2 &&就选择储存表,把该记录的数据,记录下来
          APPEND BLANK
          REPLACE k值 WITH j &&改成本次追加记录的字段,这里不该加1,实际上j值就是k生素数式的k值
          REPLACE 二阶累计 WITH ss
          REPLACE 开头记录 WITH jlz
          REPLACE 开头素式 WITH x
          REPLACE 总跨度 WITH 420
          ENDIF
        ENDIF
        IF z>420 && 如果跨度已经超过定值,就跳出循环
        EXIT
        ENDIF
       SELECT 1
       GO jlz1+1 &&进行下一个素数式的判断
    ENDFOR
SELECT 1
GO jlz+1
endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
一次性检测一定跨度内最密素数式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-19 08:20 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至31简表再化简.dbf ALIAS 素数式31 &&与素数2-19互素的数(或者式子)
SELECT 2
USE D:\回到本源\最密生素数类型标本.dbf ALIAS 素数式标本 &&已经初步筛选出来的数据,作为初步条件,待进一步验证
SELECT 3
USE D:\回到本源\余数参考表.dbf ALIAS 余数表 &&作为过程表,先一个素数一个素数的过关,然后看剩余的素数式个数是否为77个
SELECT 4
USE D:\回到本源\临时k生素数式表.dbf ALIAS 临时k素式表 &&临时存储k生素数式,为最终存储做准备
SELECT 5
USE D:\回到本源\最密生素数类型标本升级.dbf ALIAS 素数式标本升级  &&需要填写真正的k生素数式
SELECT 6
USE D:\回到本源\素数表.dbf ALIAS 素数表  &&需要填写真正的k生素数式
kssj=SECONDS()                      &&取出开始时间
SELECT 2
   GO 1
   FOR  i=1 TO 291   && 总记录条26573663
    x=k值  && jlz=RECNO() && 返回指针所在记录值
    ktjl=开头记录
    ktss=开头素式
     SELECT 4 &&在重新判断下一个k生素数式之前,先清除掉上一次的素数式
    delete all
    pack
    IF x=77
    SELECT 1
    GO ktjl
    s31=素31   && 把“素19”的值赋给素数式19
   FOR j=1  TO 77
   y=素31
   jlz2=RECNO()
   z=y-s31
   SELECT 4
   APPEND BLANK
   REPLACE k式 WITH z &&把与定了橛子的素数式与指针所在位置的素数式,绝对值赋给“k式”,做为接下来的检查表
    SELECT 1
    GO jlz2+1
    ENDFOR
    SELECT 6
    GO 11
       FOR m=1  TO 10
       ss=素数
        SELECT 3  &&在重新判断下一个素数之前要清空余数表
    delete all
    pack
    SELECT 4
    GO 1
    DO WHILE NOT EOF()
    ks=k式
      ys=MOD(ks,ss)
         SELECT 3
        count all for ys=余数 to js
          IF js=0
          SELECT 3
          APPEND BLANK
          REPLACE 余数 WITH ys &&改成本次追加记录的字段
          ENDIF
          SELECT 4
          skip
        ENDDO
        SELECT 3
        zjlts=RECCOUNT()  &&总记录条数
        IF zjlts=ss
        EXIT
        ENDIF
       SELECT 6
       SKIP
       ENDFOR
       IF m>10
       SELECT 5
       APPEND BLANK
       REPLACE k值 WITH 77 &&改成本次追加记录的字段
          REPLACE 记录值 WITH ktjl
          REPLACE 开头素数式 WITH ktss
          REPLACE 跨度值 WITH 420
        ENDIF
        ELSE
        EXIT
        endif
          SELECT 2
          SKIP
   endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是最后一步验证k生素数式是否为真正的最密k生素数式。截止今日寻找最密k生素数式的程序已经全部编写完成,并得到部分结果(因为程序中有点考虑不周的地方,所以丢掉了一些正确的结果)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-20 11:30 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至29简表再化简.dbf ALIAS 素数式29 &&与素数2-19互素的数(或者式子)
SELECT 2
USE D:\回到本源\最密生素数类型标本.dbf ALIAS 素数式标本 &&已经初步筛选出来的数据,作为初步条件,待进一步验证
SELECT 3
USE D:\回到本源\余数参考表.dbf ALIAS 余数表 &&作为过程表,先一个素数一个素数的过关,然后看剩余的素数式个数是否为77个
SELECT 4
USE D:\回到本源\临时k生素数式表.dbf ALIAS 临时k素式表 &&临时存储k生素数式,为最终存储做准备
SELECT 5
USE D:\回到本源\最密生素数类型标本升级.dbf ALIAS 素数式标本升级  &&需要填写真正的k生素数式
SELECT 6
USE D:\回到本源\素数表.dbf ALIAS 素数表  &&需要填写真正的k生素数式
kssj=SECONDS()                      &&取出开始时间
SELECT 2
   GO 1
   FOR  i=1 TO 679   && 总记录条26573663
    SELECT 2
    x=k值  && jlz=RECNO() && 返回指针所在记录值
    ktjl=开头记录
    ktss=开头素式
     SELECT 4 &&在重新判断下一个k生素数式之前,先清除掉上一次的素数式
    delete all
    pack
    IF x=77
    SELECT 1
    GO ktjl
    s29=素29简   && 把“素19”的值赋给素数式19
   FOR j=1  TO 77
   y=素29简
   jlz2=RECNO()
   z=y-s29
   SELECT 4
   APPEND BLANK
   REPLACE k式 WITH z &&把与定了橛子的素数式与指针所在位置的素数式,绝对值赋给“k式”,做为接下来的检查表
    SELECT 1
    GO jlz2+1
    ENDFOR
    SELECT 6
    GO 10
       FOR m=1  TO 11
       ss=素数
        SELECT 3  &&在重新判断下一个素数之前要清空余数表
    delete all
    pack
    SELECT 4
    GO 1
    DO WHILE NOT EOF()
    ks=k式
      ys=MOD(ks,ss)
         SELECT 3
        count all for ys=余数 to js
          IF js=0
          SELECT 3
          APPEND BLANK
          REPLACE 余数 WITH ys &&改成本次追加记录的字段
          ENDIF
          SELECT 4
          skip
        ENDDO
        SELECT 3
        zjlts=RECCOUNT()  &&总记录条数
        IF zjlts=ss
        EXIT
        ENDIF
       SELECT 6
       SKIP
       ENDFOR
       IF m>11
       SELECT 5
       APPEND BLANK
       REPLACE k值 WITH 77 &&改成本次追加记录的字段
          REPLACE 记录值 WITH ktjl
          REPLACE 开头素数式 WITH ktss
          REPLACE 跨度值 WITH 420
        ENDIF
          && ELSE
          && loop  EXIT 这里不是跳出循环,而是执行下一个。这里即不能用exit跳出循环,也不能用loop执行下一个,条件成立,就执行,否则什么也不做。
        endif
          SELECT 2
          SKIP
   endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是寻找最密k生素数式的最后一步,经过核对,矫正,终于使程序运行正常,并输出最终结果,且正确。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-25 16:38 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式至31简表再化简.dbf ALIAS 素数式31 &&与素数2-19互素的数(或者式子)
SELECT 2
USE D:\回到本源\最密生素数类型标本.dbf ALIAS 素数式标本 &&已经初步筛选出来的数据,作为初步条件,待进一步验证
SELECT 3
USE D:\回到本源\余数参考表.dbf ALIAS 余数表 &&作为过程表,先一个素数一个素数的过关,然后看剩余的素数式个数是否为77个
SELECT 4
USE D:\回到本源\临时k生素数式表.dbf ALIAS 临时k素式表 &&临时存储k生素数式,为最终存储做准备
SELECT 5
USE D:\回到本源\最密生素数类型标本升级.dbf ALIAS 素数式标本升级  &&需要填写真正的k生素数式
SELECT 6
USE D:\回到本源\素数表.dbf ALIAS 素数表  &&需要填写真正的k生素数式
kssj=SECONDS()                      &&取出开始时间
SELECT 2
   GO 1
   FOR  i=1 TO 54   && 总记录条26573663
    x=k值  && jlz=RECNO() && 返回指针所在记录值
    ktjl=开头记录
    ktss=开头素式
     SELECT 4 &&在重新判断下一个k生素数式之前,先清除掉上一次的素数式
    delete all
    pack
    IF x=79
    SELECT 1
    GO ktjl
    s31=素31简   && 把“素19”的值赋给素数式19
   FOR j=1  TO 79
   y=素31简
   jlz2=RECNO()
   z=y-s31
   SELECT 4
   APPEND BLANK
   REPLACE k式 WITH z &&把与定了橛子的素数式与指针所在位置的素数式,绝对值赋给“k式”,做为接下来的检查表
    SELECT 1
    GO jlz2+1
    ENDFOR
    SELECT 6
    GO 11
       FOR m=1  TO 15
       ss=素数
        SELECT 3  &&在重新判断下一个素数之前要清空余数表
    delete all
    pack
    SELECT 4
    GO 1  &&这是后来加的,不知道是否每次从头开始检查
    DO WHILE NOT EOF()
    ks=k式
      ys=MOD(ks,ss)
         SELECT 3
        count all for ys=余数 to js
          IF js=0
          SELECT 3
          APPEND BLANK
          REPLACE 余数 WITH ys &&改成本次追加记录的字段
          ENDIF
          SELECT 4
          skip
        ENDDO
        SELECT 3
        zjlts=RECCOUNT()  &&总记录条数
        IF zjlts=ss
        EXIT
        ENDIF
       SELECT 6
       SKIP
       ENDFOR
       IF m>15
       SELECT 5
       APPEND BLANK
       REPLACE k值 WITH 79 &&改成本次追加记录的字段
          REPLACE 记录值 WITH ktjl
          REPLACE 开头素数式 WITH ktss
          REPLACE 跨度值 WITH 426
        ENDIF
        ELSE
        EXIT
        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-1 11:55 | 显示全部楼层
vfbpgyfk 发表于 2010-5-10 07:48
白新岭:您好!
我看到您的贴子啦。待我分析和理解后,再与您沟通。

vfbpgyfk先生终于登上数学中国网站,上次到现在也不知过了多久了。
祝先生新年快乐。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 02:30 , Processed in 0.090820 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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