数学中国

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

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

  [复制链接]
发表于 2021-7-17 19:00 | 显示全部楼层
SELECT 1
USE D:\VFP温习\L8四生素数真表.DBF ALIAS 四生素数表
SELECT 2
USE D:\VFP温习\二连体4生素数.DBF ALIAS 二连体4生素数
kssj=SECONDS()
For i=1 to 101275
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=四素
    SKIP 1
    PUBLIC B
    B=四素
    cj=B-A  && 差距
    IF cj=30
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 二连4生 WITH A+15       &&将N值付给素数式
    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-17 19:01 | 显示全部楼层
SELECT 1
USE D:\vfp温习\二连体4生素数.DBF ALIAS 二连体4生素数
SELECT 2
USE D:\vfp温习\二生素数的数量统计.DBF ALIAS 二生统计

kssj=SECONDS()
  SELECT 1
  For i=1 to 9 && 这个循环13次,是因为累计2的分布值有13条记录,代表13种素数式的排列(2-5生)
    @ 3,6 say i
     fw=10^i
            && jlh1=RECNO()
            SELECT 1
            GO 1
            COUNT ALL FOR fw>二连4生 TO tj
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 范围 WITH fw
              REPLACE 跨度 WITH 38
              REPLACE 统计 WITH tj
              REPLACE k生 WITH 8
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

发表于 2021-7-18 06:29 | 显示全部楼层
SELECT 1
USE D:\素数式裂解\素数式5横.DBF ALIAS 素数式5
kssj=SECONDS()
x=5 && m已经作为一个变量存在,所以文件大的没边,形成了1.9亿的记录条
    For i=1 to 5
      FOR j=i+1  TO 6
         FOR h=j+1  TO 7
         FOR k=h+1  TO 8
         FOR m=k+1  TO 9
          ss1=i-1
          ss2=j-1
          ss3=h-1
          ss4=k-1
          ss5=m-1
          SELECT  1   &&打开盛放素数式的表
          APPEND BLANK     &&增加一条空记录
          REPLACE 素1 WITH ss1 &&将B值付给素数式
          REPLACE 素2 WITH ss2 &&将B值付给素数式
          REPLACE 素3 WITH ss3 &&将B值付给素数式
          REPLACE 素4 WITH ss4 &&将B值付给素数式
          REPLACE 素5 WITH ss5 &&将B值付给素数式
          ENDFOR
          ENDFOR
         ENDFOR
      endfor
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
直接产生数字9的抽5组合
回复 支持 反对

使用道具 举报

发表于 2021-7-18 10:17 | 显示全部楼层
SELECT 1
USE D:\vfp温习\四生素数生成元.DBF  ALIAS 四生成元
SELECT 2
USE D:\vfp温习\s3165万内素数.DBF ALIAS 新制素数
kssj=SECONDS()                      &&取出开始时间
    FOR i=1 TO 3187041
     @22,20 SAY i
     n=i
     bpz=19+(n-INT((n-1)/3)*3-1)*90+INT((n-1)/3)*210&&给被判断值置数,以循环值做变量。
        SELECT 新制素数
        GO 4                                &&从第二条记录开始读取素数(3)
        FOR j=1 TO 5                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
        qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
        IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 &&如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
        EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
        ENDIF
        SKIP                                &&素数表指针向下移动一个
        ENDFOR
        IF j>5
        SELECT 1              &&打开保存求解结果的信息表
        APPEND BLANK                        &&增加一条空记录
        REPLACE 四生元 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
用制作四生素数的程序,简单改造,变成了制作四生素数的生成元程序,周期T=223092870,留下生成元700245个。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-18 15:48 | 显示全部楼层
SELECT 1
USE D:\vfp温习\四生素数生成元.DBF  ALIAS 四生成元
SELECT 2
USE D:\vfp温习\s3165万内素数.DBF ALIAS 新制素数
SELECT 3
USE D:\vfp温习\L8四生素数真表.DBF  ALIAS 四胞胎素数
kssj=SECONDS()                      &&取出开始时间
    FOR i=27 TO 30
     @22,20 SAY i
     n=i
     SELECT 1
     GO 1
     FOR k=1 TO 700245
     ssy=四生元
     bpz=ssy+223092870*(i-1)
     Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
        SELECT 新制素数                      &&打开素数表
        LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
        DO CASE
        CASE EOF()                          &&如果超出素数表最后一条记录
        GO BOTTOM
        CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
        SKIP -1
        ENDCASE
        SSS=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 9                               &&从第二条记录开始读取素数(3)
        FOR j=9 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
        SELECT 1
        SKIP
        ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
用四生素数的生成元筛选四生素数,程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-19 10:40 | 显示全部楼层
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  i=1 TO 12  &&又遇到以前类似事情,外循环变量用了j与下面的内循环变量一致,所以提示0不能做除数。
        @ 5,12 say i
        SELECT 3
        p=素数
        @ 15,22 say p
        jl=recno()
        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
               jlt=RECCOUNT()  &&以前是jl变量,与素数表的jl(第几条记录的变量一致,这种低级错误已经不知道犯了几次了)
               s=s*p^(k-1)*(p-jlt)/(p-1)^k
              
        else
        
        s=s*p^(k-1)*(p-k)/(p-1)^k
        endif
         SELECT 3
            GO jl+1
endfor
?s
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
真是闹乌龙了,已经好多次把不同变量用同一个变量名称了,所以程序出来的结果让人无奈,本来是自己的错,却怪罪在程序上。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-19 11:29 | 显示全部楼层
SELECT 1
USE D:\素数式系数\素数式.dbf ALIAS 素数式
SELECT 2
USE D:\素数式系数\余数表.dbf ALIAS 余数表
SELECT 3
USE D:\素数式系数\素数表十亿.dbf ALIAS 素数表
SELECT 4
USE D:\素数式系数\素数式记录值.dbf ALIAS 素数式单值
kssj=SECONDS()  &&取出开始时间
SELECT 1
  k=RECCOUNT()
  go bottom
  max=素式
SELECT 3
   GO 1
    s=1.0000000000000000
       FOR  i=1 TO 12  &&又遇到以前类似事情,外循环变量用了j与下面的内循环变量一致,所以提示0不能做除数。
        @ 5,12 say i
        SELECT 3
        p=素数
        @ 15,22 say p
        jl=recno()
        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
               jlt=RECCOUNT()  &&原来jl与素数表的jl犯冲突,分辨不清,谁是真身。
               s=s*p^(k-1)*(p-jlt)/(p-1)^k &&这里忘了改了,还是jl,而非 jlt
               ssz=p^(k-1)*(p-jlt)/(p-1)^k
               SELECT 4
               APPEND BLANK     &&增加一条空记录
               REPLACE 参素数 WITH p
               REPLACE 素式值 WITH ssz
               REPLACE 每步s WITH s
        else
        
        s=s*p^(k-1)*(p-k)/(p-1)^k
        endif
         SELECT 3
            GO jl+1
endfor
?s
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
用这个辅助程序,总算找到问题的症结。
回复 支持 反对

使用道具 举报

发表于 2021-7-25 07:16 | 显示全部楼层
SELECT 1
USE D:\素数式裂解\素数式8横.DBF ALIAS 素数式8
kssj=SECONDS()
x=5 && m已经作为一个变量存在,所以文件大的没边,形成了1.9亿的记录条
    For i=1 to 8
      FOR j=i+1  TO 9
         FOR h=j+1  TO 10
         FOR k=h+1  TO 11
         FOR m=k+1  TO 12
         FOR n=m+1  TO 13
         FOR o=n+1  TO 14
         FOR p=o+1  TO 15
          ss1=i
          ss2=j
          ss3=h
          ss4=k
          ss5=m
          ss6=n
          ss7=o
          ss8=p
          SELECT  1   &&打开盛放素数式的表
          APPEND BLANK     &&增加一条空记录
          REPLACE 素1 WITH ss1
          REPLACE 素2 WITH ss2
          REPLACE 素3 WITH ss3
          REPLACE 素4 WITH ss4
          REPLACE 素5 WITH ss5
          REPLACE 素6 WITH ss6
          REPLACE 素7 WITH ss7
          REPLACE 素8 WITH ss8
          ENDFOR
          ENDFOR
          ENDFOR
          ENDFOR
          ENDFOR
          ENDFOR
       ENDFOR
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是数字15抽取8个数的组合数组成程序。有记录条=\(C_{15}^8\)=\(C_{15}^7\)=6435条记录。
回复 支持 反对

使用道具 举报

发表于 2021-7-26 12:28 | 显示全部楼层
SELECT 1
USE D:\素数式裂解\素数式7横.DBF ALIAS 素数式7
kssj=SECONDS()
x=5 && m已经作为一个变量存在,所以文件大的没边,形成了1.9亿的记录条
    For i=1 to 7
      FOR j=i+1  TO 8
         FOR h=j+1  TO 9
         FOR k=h+1  TO 10
         FOR m=k+1  TO 11
         FOR n=m+1  TO 12
         FOR o=n+1  TO 13
          ss1=i
          ss2=j
          ss3=h
          ss4=k
          ss5=m
          ss6=n
          ss7=o
          SELECT  1   &&打开盛放素数式的表
          APPEND BLANK     &&增加一条空记录
          REPLACE 素1 WITH ss1
          REPLACE 素2 WITH ss2
          REPLACE 素3 WITH ss3
          REPLACE 素4 WITH ss4
          REPLACE 素5 WITH ss5
          REPLACE 素6 WITH ss6
          REPLACE 素7 WITH ss7
          ENDFOR
          ENDFOR
          ENDFOR
          ENDFOR
          ENDFOR
       ENDFOR
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
直接从13中抽取7个数字,进行组合成记录条(用vfp程序按成13抽7组合实例)
回复 支持 反对

使用道具 举报

发表于 2021-7-26 12:29 | 显示全部楼层
SELECT 1
USE D:\素数式裂解\素数式6横.DBF ALIAS 素数式6
kssj=SECONDS()
x=5 && m已经作为一个变量存在,所以文件大的没边,形成了1.9亿的记录条
    For i=1 to 6
      FOR j=i+1  TO 7
         FOR h=j+1  TO 8
         FOR k=h+1  TO 9
         FOR m=k+1  TO 10
         FOR n=m+1  TO 11
          ss1=i
          ss2=j
          ss3=h
          ss4=k
          ss5=m
          ss6=n
          SELECT  1   &&打开盛放素数式的表
          APPEND BLANK     &&增加一条空记录
          REPLACE 素1 WITH ss1
          REPLACE 素2 WITH ss2
          REPLACE 素3 WITH ss3
          REPLACE 素4 WITH ss4
          REPLACE 素5 WITH ss5
          REPLACE 素6 WITH ss6
          ENDFOR
          ENDFOR
          ENDFOR
          ENDFOR
       ENDFOR
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
直接从11中抽取6个数字,进行组合成记录条(用vfp程序按成11抽6组合实例)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 04:30 , Processed in 0.088453 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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