数学中国

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

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

  [复制链接]
 楼主| 发表于 2021-6-22 20:57 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数式至23表.DBF ALIAS 素数式23
SELECT 2
USE D:\VFP温习\L30九生素数表q2.DBF ALIAS 九生素数30
SELECT 3
USE D:\VFP温习\L30十生素数表q2.DBF ALIAS 十生素数30
kssj=SECONDS()
For i=1 to 322540
      @ 5,12 say i
SELECT 2
    jlh9=记录号9
    SELECT  1     &&打开盛放素数式的表
    GO jlh9
    jl=recno()
    PUBLIC A
    A=素数式
      FOR j=1 TO 2304
      SELECT  1
      GO jl+j
      PUBLIC B
      B=素数式
      C=B-A
        IF C=7680
         SELECT 3
         APPEND BLANK     &&增加一条空记录
         REPLACE 素式10 WITH A+7680  &&将N值付给素数式
         REPLACE 记录号10 WITH jl+j  &&将N值付给素数式
         exit
         else
        ENDIF
      endfor
      SELECT 2
      skip
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
筛了9次,从36495360个素数式,一路筛除后剩余101088个,素数式表中为101080个,少8个,这是因为后边没有构成循环链条的缘故。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-22 21:59 | 显示全部楼层
CLEAR
SELECT 1
USE D:\vfp温习\L30十生素数表q2.DBF ALIAS 素数式表等比10
SELECT 2
USE D:\vfp温习\s3165万内素数.DBF ALIAS 素数表3165万
SELECT 3
USE D:\vfp温习\等比数列10a30q2.DBF ALIAS 等比数列10

*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
bcz=223092870  &&从2乘到19,即素数19的素数阶乘
kssj=SECONDS()                      &&取出开始时间
FOR i=2 TO 2
@12,10 SAY i
FOR j=1 TO 101080
SELECT 1
sss=素式10
bpz=sss+(i-1)*bcz               &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 2                     &&打开素数表
LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
DO CASE
CASE EOF()                          &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
jlh=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 9                                &&从第二条记录开始读取素数(3)
FOR j=1 TO jlh-8                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                  &&以读取的素数为条件,对被判断值求模
IF MOD(bpz,素数)=0 OR MOD(bpz,素数)=MOD(7680,素数) OR MOD(bpz,素数)=MOD(11520,素数) OR  MOD(bpz,素数)=MOD(13440,素数) OR  MOD(bpz,素数)=MOD(14400,素数) OR  MOD(bpz,素数)=MOD(14880,素数) OR  MOD(bpz,素数)=MOD(15120,素数) OR  MOD(bpz,素数)=MOD(15240,素数) OR  MOD(bpz,素数)=MOD(15300,素数) OR  MOD(bpz,素数)=MOD(15330,素数) &&如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环OR  MOD(bpz,素数)=MOD(14880,素数)
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF j>jlh-8
SELECT 3               &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 素10 WITH bpz && 把bpz赋给素数        
ENDIF
SELECT 1
SKIP
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
获得了一个249306193
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 07:42 | 显示全部楼层
白新岭 发表于 2021-6-22 21:59
CLEAR
SELECT 1
USE D:\vfp温习\L30十生素数表q2.DBF ALIAS 素数式表等比10

上边的程序有错误之处,老是提示已经到了表尾,无论我怎么改,中循环结束,加选择表1,指针调回表头;或者中循环开始前(外循环开始后),选择表1,指针调回表头。都没有改变,指针已到表尾的怪状。现在忽然发现,最内层的循环变量也是j,最外层是i,中层是j,也就是说,中层与内层共用一个变量j,这才是已到表尾的关键所在,这是经常好犯的毛病,应引起高度注意。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 07:44 | 显示全部楼层
CLEAR
SELECT 1
USE D:\vfp温习\L30十生素数表q2.DBF ALIAS 素数式表等比10
SELECT 2
USE D:\vfp温习\s3165万内素数.DBF ALIAS 素数表3165万
SELECT 3
USE D:\vfp温习\等比数列10a30q2.DBF ALIAS 等比数列10

*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
kssj=SECONDS()  &&取出开始时间
bcz=223092870  &&从2乘到19,即素数19的素数阶乘               
FOR i=9 TO 10
@12,10 SAY i
   && SELECT 1 无论如何也解决不了已到表尾这个难题,只好把内循环,改成go j了
   && GO 1
FOR k=1 TO 101080 &&原来这里也是用的j,与主程序筛选等比k生素数冲突
@22,20 SAY k
SELECT 1
GO k
sss=素式10
bpz=sss+(i-1)*bcz               &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 2                     &&打开素数表
LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
DO CASE
CASE EOF()                          &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
jlh=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 9                                &&从第二条记录开始读取素数(3)
FOR j=1 TO jlh-8                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                  &&以读取的素数为条件,对被判断值求模
IF MOD(bpz,素数)=0 OR MOD(bpz,素数)=MOD(7680,素数) OR MOD(bpz,素数)=MOD(11520,素数) OR  MOD(bpz,素数)=MOD(13440,素数) OR  MOD(bpz,素数)=MOD(14400,素数) OR  MOD(bpz,素数)=MOD(14880,素数) OR  MOD(bpz,素数)=MOD(15120,素数) OR  MOD(bpz,素数)=MOD(15240,素数) OR  MOD(bpz,素数)=MOD(15300,素数) OR  MOD(bpz,素数)=MOD(15330,素数) &&如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环OR  MOD(bpz,素数)=MOD(14880,素数)
ENDIF
SELECT 2
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF j>jlh-8
SELECT 3               &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 素10 WITH bpz && 把bpz赋给素数        
ENDIF
  && SELECT 1
  && SKIP
ENDFOR
&& SELECT 1 无论如何也解决不了已到表尾这个难题,只好把内循环,改成go j了
&& GO 1    无论加在外循环开始,还是加在内循环结束,都改变不了已到表尾这个问题               
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个程序才正确。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-23 17:40 | 显示全部楼层
CLEAR
SELECT 1
USE D:\vfp温习\L30十生素数表q2.DBF ALIAS 素数式表等比10
SELECT 2
USE D:\vfp温习\s3165万内素数.DBF ALIAS 素数表3165万
SELECT 3
USE D:\vfp温习\等比数列10a30q2.DBF ALIAS 等比数列10

*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
kssj=SECONDS()  &&取出开始时间
bcz=223092870  &&从2乘到19,即素数19的素数阶乘               
FOR i=21 TO 100
@12,10 SAY i
   && SELECT 1 无论如何也解决不了已到表尾这个难题,只好把内循环,改成go j了
   && GO 1
FOR k=1 TO 101080 &&原来这里也是用的j,与主程序筛选等比k生素数冲突
@22,20 SAY k
SELECT 1
GO k
sss=素式10
bpz=sss+(i-1)*bcz               &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 2                     &&打开素数表
LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
DO CASE
CASE EOF()                          &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
jlh=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 9                                &&从第二条记录开始读取素数(3)
FOR j=1 TO jlh-8                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                  &&以读取的素数为条件,对被判断值求模
IF MOD(bpz,素数)=0 OR MOD(bpz,素数)=MOD(7680,素数) OR MOD(bpz,素数)=MOD(11520,素数) OR  MOD(bpz,素数)=MOD(13440,素数) OR  MOD(bpz,素数)=MOD(14400,素数) OR  MOD(bpz,素数)=MOD(14880,素数) OR  MOD(bpz,素数)=MOD(15120,素数) OR  MOD(bpz,素数)=MOD(15240,素数) OR  MOD(bpz,素数)=MOD(15300,素数) OR  MOD(bpz,素数)=MOD(15330,素数) &&如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环OR  MOD(bpz,素数)=MOD(14880,素数)
ENDIF
SELECT 2
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF j>jlh-8
SELECT 3               &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 素10 WITH bpz && 把bpz赋给素数        
ENDIF
  && SELECT 1
  && SKIP
ENDFOR
&& SELECT 1 无论如何也解决不了已到表尾这个难题,只好把内循环,改成go j了
&& GO 1    无论加在外循环开始,还是加在内循环结束,都改变不了已到表尾这个问题               
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是一个正常运行程序,80个周期,用时513分21.78秒。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-27 17:52 | 显示全部楼层
SELECT 1
USE D:\VFP温习\孪中表.DBF ALIAS 孪中表
SELECT 2
USE D:\VFP温习\孪中模1969为整数.DBF ALIAS 孪中模整
kssj=SECONDS()
For i=1 to 3426326
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=孪中
    bs=A/1969
    ys=MOD(A,1969)
    IF ys=0
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 孪中模1969 WITH A      &&将N值付给素数式
         REPLACE 倍数 WITH bs
    ENDIF
      SELECT 1
      GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
筛选特定数整倍数的孪中数程序。(这里的特定数是1969)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-28 16:12 | 显示全部楼层
SELECT 1
USE D:\VFP温习\孪中表.DBF ALIAS 孪中表
SELECT 2
USE D:\VFP温习\孪中模2021为整数.DBF ALIAS 孪中模整
kssj=SECONDS()
For i=1 to 3426325
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=孪中
    bs=A/2021
    ys=MOD(A,2021)
    IF ys=0
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 孪中模2021 WITH A      &&将N值付给素数式
         REPLACE 倍数 WITH bs
    ENDIF
      SELECT 1
      GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
换汤不换药。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-3 18:44 | 显示全部楼层
SELECT 1
USE D:\素数式系数\素数式.dbf ALIAS 素数式
SELECT 2
USE D:\素数式系数\余数表.dbf ALIAS 余数表
SELECT 3
USE D:\素数式系数\素数表十亿.dbf ALIAS 素数表
kssj=SECONDS()  &&取出开始时间
SELECT 1
  k=RECCOUNT()
  go bottom
  max=素式
SELECT 3
   GO 1
    s=1.0000000000000000
       FOR  j=1 TO 50876327
        SELECT 3
        p=素数
        IF p<=max
           SELECT 2
           DELETE all
            PACK
          SELECT 1
            go 1
           for j=1 to k
           sss=素式
           ys=mod(sss,p)
           SELECT 2
           count all for ys=余数 to js
                    IF js=0
                    SELECT 2
                    APPEND BLANK
                     REPLACE 余数 WITH ys &&改成本次追加记录的字段
                     ENDIF
                SELECT 1
                skip
              endfor
              SELECT 2
               jl=RECCOUNT()
               s=s*p^(k-1)*(p-jl)/(p-1)^k
              
        else
        
        s=s*p^(k-1)*(p-k)/(p-1)^k
        endif
         SELECT 3
               skip
endfor
?s
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
计算k生素数的数量公式中的系数程序。
回复 支持 反对

使用道具 举报

发表于 2021-7-5 07:36 | 显示全部楼层
SELECT 1
USE D:\素数式系数\素数表十亿.dbf ALIAS 素数表
kssj=SECONDS()  &&取出开始时间
s=1.0000000000000000
SELECT 1
  GO 5
  A=素数
  s=s*A*(A-8)/(A-4)^2
  SKIP 1
        FOR  j=1 TO 50876323
        SELECT 1
        B=素数
        s=s*B*(B-8)/(B-4)^2
        SELECT 1  
        SKIP
        ENDFOR

?s
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
求最密4生素数中的一个极限式子值。
回复 支持 反对

使用道具 举报

发表于 2021-7-6 22:46 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数表亿整理.DBF ALIAS 素数表亿整理
SELECT 2
USE D:\VFP温习\L6三生素数24表新.DBF ALIAS 三生素数表
kssj=SECONDS()
SELECT  1
GO 5875437
For i=1 to 45000889
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=素数
    SKIP 1
    PUBLIC B
    B=素数
    SKIP 1
    PUBLIC C
    C=素数
    cj1=B-A  &&求前后两个素数的差值
    cj2=C-B  &&求前后两个素数的差值
    IF cj1=2 AND cj2=4
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 三中24 WITH A+3          &&将N值付给素数式
    ENDIF
      SELECT 1
      GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
完成三生素数的后部分的搜寻工作,把范围扩大10^9时。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 09:23 , Processed in 0.135114 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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