数学中国

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

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

  [复制链接]
 楼主| 发表于 2019-3-15 13:04 | 显示全部楼层
CLEAR ALL
SELECT 1
USE  c:\vfp学习\逆四生成元7.DBF ALIAS 四生元表  
    kssj=SECONDS()                      &&取出开始时间
   For N=1 to 7
    @ 3,6 say N
    X=13+30*(N-1)
           MZ=X%7  
                IF  MZ=0 OR MZ=2 OR MZ=6     
               else
                 SELECT   四生元表        &&打开盛放素数的表
                 APPEND BLANK                &&增加一条空记录
                 REPLACE 四生元 WITH X     &&将N值付给素
                ENDIF   
    ENDFOR
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是用一个初始值筛选逆10生成元(差为等比数列,公差0.5),每步过一个素数倍周期,开始时我对i
if 条件 then
操作1
else
操作2
end if
这个分支语句还用的不熟悉,没有写过zhen,也没有用上过else,只是在条件成立时,跳出循环,在条件后加了exit,以往分支语句外加着外循环语句,只有循环完,才做相应工作,否则就跳出循环,执行下一个,这回仅一次判断,ture,什么都不做,false,做相应工作,所以加了else这个分支,但是没有去exit,所以刚开始就结束了,因为第一个数据就为真,所以一条记录也没有,我刚想从网上查原因,忽然想到没有去掉exit这个退出循环的命令,去掉后,程序运行正常,看来半路出身,一知半解真不行。
 楼主| 发表于 2019-3-15 13:50 | 显示全部楼层
CLEAR ALL
SELECT 1
USE  c:\vfp学习\逆5生成元11.DBF ALIAS 五生元表  
  SELECT 2
USE  c:\vfp学习\逆四生成元7.DBF ALIAS 四生元表  
    kssj=SECONDS()                      &&取出开始时间
   For N=1 to 11
    @ 3,6 say N
   SELECT 四生元表
    go 1
    for m=1 to 4
     @ 4,8 say 四生元
     X=四生元+210*(N-1)
           MZ=X%11
           Y=11
                IF  MZ=0 OR MZ=2 OR MZ=6  OR MZ=14%Y OR MZ=30%Y OR MZ=62%Y OR MZ=126%Y OR MZ=254%Y OR MZ=510%Y  OR MZ=1022%Y
               else
                 SELECT   五生元表        &&打开盛放素数的表
                 APPEND BLANK                &&增加一条空记录
                 REPLACE 五生元 WITH X     &&将N值付给素
                ENDIF
                SELECT 四生元表
                 SKIP
       endfor
    ENDFOR
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
开始
SELECT 四生元表
                 SKIP
语句在endif前边,执行结果仅得到一个数值2143;应该是4个值才正确,这才把这个语句放在endif之后,
程序运行后提示已到表尾了,这才感觉到,当完成一次内循环后,没有及时把指针恢复到开始位置,即第一条记录,又把go 1加在了内循环开始以前,程序运行正常。
 楼主| 发表于 2019-3-15 15:21 | 显示全部楼层
如果采用分布晋级会快的多,小点的数,眨眼的时间就完成了,初始值定13,周期30;分7,11,13,17,19,23,29,31八步,可以完成制作一个2000亿的大筛子,这样找起10生素数等比数列来就会快很多,它是一个11位的数;如果从周期30直接跨越到29,也得2天的时间。
 楼主| 发表于 2019-3-17 20:54 | 显示全部楼层
USE  e:\用vfp求k生素数数量\升序代数数19.dbf
DO WHILE NOT EOF()
        SELECT 升序代数数19
        PUBLIC B
        B=代数19
    PUBLIC D
    D=recno()
    SKIP 27
    PUBLIC A
    A=代数19
    C=A-B
    REPLACE 间隔16 WITH C
    go D
    skip
ENDDO
这是给[间隔16 字段填数,稍微改一下,在加一个存指针的表,把符合条件的放进表中即可。
 楼主| 发表于 2019-3-18 07:14 | 显示全部楼层
搜“数学爱好者“,标志像一个小苗,那里有连接,可以找到数学在线软件及数学工具。
 楼主| 发表于 2019-3-18 10:17 | 显示全部楼层
CLEAR ALL
SELECT 1
use c:\vfp学习\逆11生成元.dbf ALIAS 十一生元表  &&注意,表开头不允许以数字开头,每次增倍一个素数周期,就把表名结尾的数字改成相符的数(指与新素数相同)
SELECT 2
USE c:\vfp学习\检查排序情况.DBF ALIAS 排序 &&注意,表开头不允许以数字开头,每次增倍一个素数周期,就把表名结尾的数字改成相符的数(指与新素数相同)
kssj=SECONDS()
SELECT  十一生元表
do while not EOF()
     @ 4,8 say  十一元
      Public A
      A=十一元      
       PUBLIC B
    B=recno()
    SKIP 1
    PUBLIC C
    C=十一元
    D=C-A
                IF D>0
                ELSE
                        SELECT  排序
                        APPEND BLANK
                        REPLACE 记录号 WITH B+1
                ENDIF
        SELECT 十一生元表
        go B
        SKIP
ENDDO
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
这是检查一个各段安升序排列表中,那里发生交叉,即有上一段的最大数,变成下一段的最小数的位置,记录号。
 楼主| 发表于 2019-3-18 10:26 | 显示全部楼层
你要单击工具栏上的表——转到记录——记录号——作用范围 这以后会出来四个选项 All ”、“ Next”、“ Record”、“Rest”
默认的“All”指全部记录;“ Next”配合其右边的数字(如8),表示对从当前记录起以下多少个(如8个)记录进行操作;“ Record”配合其右边的数字,作用与上面的“记录号”相同;“Rest” 表示对从当前记录开始,到文件的最后一个记录为止的所有记录进行操作。
 楼主| 发表于 2019-3-18 13:05 | 显示全部楼层
CLEAR ALL
SELECT 1
USE c:\vfp学习\s3165万内素数.DBF ALIAS 素数表
SELECT 2
USE  c:\vfp学习\逆11生成元.DBF ALIAS 十一生元表
SELECT 3
USE  c:\vfp学习\逆10生成元31.DBF ALIAS 十生元表  
    kssj=SECONDS()                      &&取出开始时间
SELECT 十生元表
   go 2242184  &&每次循环开始一定不要忘记把指针移动指定位置,以防止跑空趟(或重复原先的工作),只有把指针移动到上次工作的最后一条记录之下,才能分批次完成任务
   For N=1 to 2000000
    @ 3,6 say 十生元31
    X=十生元31-2046
           SELECT 素数表
           go 3
            FOR I=1 TO 8 &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。
            @ 2,5 say  素数   
                IF  X%素数=0
                  EXIT        
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF I>8  &&一定不要忘记把此值改成排查素数的个数,即内循环次数
                SELECT   十一生元表        &&打开盛放素数的表
                APPEND BLANK                &&增加一条空记录
                REPLACE 十一元 WITH X+2046    &&将N值付给素数
            ENDIF
        SELECT 十生元表
        skip
   ENDFOR
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是用低阶k生素数生成元制作高一阶的生成元程序,它是分批次完成任务,所以每次结束之后,一定要把指针移动到上次执行完最后一条记录之下。
 楼主| 发表于 2019-3-21 07:02 | 显示全部楼层
the hardy-littlewood prime k-tuple conjecture is false
  chun-xuan jiang
 楼主| 发表于 2019-3-25 14:34 | 显示全部楼层
CLEAR ALL
SELECT 1
USE c:\vfp学习\s3165万内素数.DBF ALIAS 素数表
SELECT 2
USE c:\vfp学习\存表指针.DBF ALIAS 指针表
SELECT 3
USE c:\vfp学习\实验表.DBF ALIAS 实验表
    kssj=SECONDS()                      &&取出开始时间
   For N=1 to 3
    && @ 12,15 say  N      
        SELECT 指针表
        jl=记录值
                 SELECT  素数表
                  go jl
                  for m=1 to 10
                  ss=素数
                  SELECT  实验表 &&打开盛放素数的表
                  APPEND BLANK                        &&增加一条空记录
                  REPLACE 新元素 WITH ss          &&将N值付给素数
                  SELECT  素数表
                  skip
               endfor
         SELECT  指针表
        skip
   endfor
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
这是按照事先设计好的,从素数表的某位置起抄录10条记录。在开始时,我把内循环放在选择素数表之前(go jl在选择素数表语句之后),虽然加了选择素数表,并下移一条记录,可实际运行结果,都是重复的10条记录,不是从某一位置起以后的10条记录,这时我明白了,因为有go jl 这条语句,下移多少条记录也没有用,这才把内循环移到选择素数表,go jl 的语句之后,这回得到想要数据。
早上用copy to 语句没有成功,说后边跟的表已经存在,我想到了用替换(或改写记录)没有成功,所以有想到了追加记录这个办法(原来还想写10次重复追加记录,而不用内循环,那样写代码太麻烦了)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-4 21:12 , Processed in 0.072265 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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