数学中国

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

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

  [复制链接]
 楼主| 发表于 2019-6-11 10:03 | 显示全部楼层
SELECT 1
USE F:\k生素数\素数式至23.dbf ALIAS 素数23
SELECT 2
USE F:\k生素数\k100生素数式.dbf ALIAS k素式
SELECT 3
USE F:\k生素数\k100生素数.dbf ALIAS k素记
kssj=SECONDS()                      &&取出开始时间
FOR I=1 TO 4
@ 5,12 say I
SELECT 3
      A=k100jl
          SELECT  1
          go A
         FOR J=1 TO 100
        D=RECNO()
        C=素数式23
          SELECT 2
          APPEND BLANK
          REPLACE k100式 WITH C
           SELECT  1
           GO D+1
        ENDFOR
        SELECT 3
        SKIP
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
导出k生素数式程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-11 21:09 | 显示全部楼层
运算1462万到1562万外循环用时673分57.73秒+24小时.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-11 21:13 | 显示全部楼层
运算1672万到1762万之间90万个外循环数据用时664分32.83秒+24小时。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-12 09:34 | 显示全部楼层
从1562万到1662万之间100万个外循环数据用时761分34.13秒+24小时。
从1762万到1862万之间100万个外循环值用时48小时-564分4.32秒
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-12 16:30 | 显示全部楼层
计算182476800个数据用时3分5.03秒(只判断是否整除和存储不能整除数据所用的时间)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-14 12:09 | 显示全部楼层
运算1862万到1912万之间50万个外循环数据用时24小时-183分56.64秒;
运算1912万到1962万之间50万个外循环数据用时24小时-11分2.14秒;
运算1962万到2012万之间50万个外循环数据用时24小时-127分8.14秒;
运算2012万到2062万之间50万个外循环数据用时24小时+3分34.29秒;
从运算时间上看,越大区间的用时越多。
运算2-100之间的k生素数最小间距运算24小时-907分5.84秒,(素数式至37部分,有1.66亿个数据)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-14 17:45 | 显示全部楼层
用时51分30.24秒16。
SELECT 1
USE F:\k生素数\素数式至37部分.dbf ALIAS 素数式至37
SELECT 2
USE F:\k生素数\k20家村.dbf ALIAS k家村
kssj=SECONDS()                      &&取出开始时间
FOR I=1 TO 165892975-40+1
&& @ 5,12 say I
SELECT 1
GO I
     FOR J=1 TO 39
        PUBLIC A
        A=素数式37
        skip
        PUBLIC B
        B=素数式37
        N=0
           IF B-A=2
              N=N+1
           ENDIF
     ENDFOR
       IF N=20
          SELECT  1
           go I
         FOR J=1 TO 40
              && D=RECNO()
          C=素数式37
          SELECT 2
          APPEND BLANK
          REPLACE k20家村式 WITH C
          SELECT  1
          SKIP
          ENDFOR
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
最少运算量为66亿次
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-14 17:52 | 显示全部楼层
没有找到20家村素数式(即连续40个素数正好为20对孪生素数)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-15 16:43 | 显示全部楼层
本帖最后由 白新岭 于 2019-6-15 08:45 编辑

CLEAR ALL
SELECT 1
USE f:\visualfoxpro项目\s3165万内素数.DBF ALIAS 素数表
SELECT 2
USE f:\visualfoxpro项目\等差4素.DBF ALIAS 四素表
    kssj=SECONDS()                      &&取出开始时间
        for n=1  to 1953518
        j=n
          SELECT 素数表
                A=素数
                count next 3 for A+6=素数 to js1
                go j
                count next 5 for A+12=素数 to js2
                go j
                count next 7 for A+18=素数 to js3
             IF js1+js2+js3=3
                SELECT  四素表      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 四素 WITH A           &&将N值付给素数
            ENDIf
            SELECT 素数表
            go j+1
       ENDfor
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是从素数表中查找等差4素程序(等差4素P,P+6,P+12,P+18)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-16 12:38 | 显示全部楼层
本帖最后由 白新岭 于 2019-6-16 06:39 编辑

制作1亿内的素数表用时57分13.76秒。网上有用20多秒完成10亿内的素数(是记录素数个数,不知道是否存储素数),更夸张的有想用10秒解决问题。
SELECT 1
USE F:\k生素数\s3165万内素数.DBF ALIAS 素数表
SELECT 2
USE F:\k生素数\素数表1亿.DBF ALIAS 素数表亿
SELECT 3
USE F:\k生素数\素数式至19.DBF ALIAS 生成元
kssj=SECONDS()
    For N=1 to 11
    @ 5,12 say N
        SELECT 3
        go 1
        for m=1 to 1658880
        bpz=素数式19+(N-1)*9699690
        Kf=INT(SQRT(bpz))       &&求出奇数的开方根
        SELECT  1             &&打开素数表
        LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 8           &&从第一条记录开始读取素数(3)
        FOR j=1 TO SSS-7       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
        ENDFOR
        IF j>sss-7     &&这里修改过,原先没有-7,一个素数也未得到,所以加了-7
                SELECT  2      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 素数 WITH bpz            &&将N值付给素数
        ENDIF
        SELECT 3
        skip
        ENDFOR
    endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是用vfp写的程序。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-14 02:53 , Processed in 0.097370 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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