数学中国

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

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

  [复制链接]
 楼主| 发表于 2021-5-1 12:12 | 显示全部楼层
SELECT 1
USE D:\二生素数分解\素数式17.DBF ALIAS 素数式17
SELECT 2
USE D:\二生素数分解\标记跨度为14的素数式并2次累计.DBF ALIAS 标记素数式及累计2次
kssj=SECONDS()
    For i=1 to 92160
    @ 3,6 say i
     SELECT 1
     ss17=素式17
     jlh1=RECNO()
        FOR j=1 TO 7
        ss17b=素式17
        jlh2=RECNO()  && 记录指针位置
              IF ss17b-ss17=16
                 SELECT 1
                 GO jlh1
                 ss17l=素式17 && ss11l是素式11累计的缩写
                 s=0
                 m=0
                 FOR k=1 TO j
                 ss17lb=素式17
                 jlh3=RECNO()  
                 zl=ss17lb-ss17l
                 s=s+zl
                 m=m+s
                  SELECT 1
                  GO jlh3+1
                  endfor
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 记录号 with jlh1  &&将B值付给素数式
              REPLACE 跨度 WITH 16
              REPLACE 素数 WITH 17
              REPLACE 素式量 WITH j
              REPLACE 累计2 WITH m
              ENDIF
        SELECT 1
        GO jlh2+1
        ENDFOR
      SELECT 1
      GO jlh1+1
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这三个程序是一个模子刻出来的,仅仅改变了筛查对象而已。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-5 15:43 | 显示全部楼层
[watermark]'; 文件名:  筛法求质数
'; 求 10 000 000 以内的素数
Private Sub form_Click()
Open "s.txt" For Output As 1       ’生成的素数表文件名
n = 10000000                       ’搜寻一千万以内的素数
Dim a(5000000)                    '; 不允许定义成 a(n/2)         
n2 = n / 2: n4 = Int(Sqr(n))
For i = 2 To n2: a(i) = 2 * i - 1: Next ';被筛选的数是大于等于 3 的奇数
For k = 2 To n4    ';先用质数 a(2)=3 筛,再用后续质数筛
If a(k) = 0 Then GoTo 10  ';若 a(k)=0表示已被筛掉,不是素数,不能做为筛子
For i = 3 * k - 1 To n2 Step a(k): a(i) = 0: Next   ’用某素数筛一遍
10:   Next k
a(1) = 2: m = 0
For i = 1 To n2
If a(i) = 0 Then GoTo 20
m = m + 1: a(m) = a(i)    ';整理 a 数组,把第 m 个素数存在 a(m) 中
20:   Next   
Print "m="; m             ';显示不超过 n 的素数的个数
For i = 1 To m   ';以下按指定格式将 m 个素数显示出来,并存入 s.txt 文件中
aa$ = Str$(a(i)) ';将第 i 个素数转换为字符串
L = Len(Str$(n)) ’测量一下 n 的长度
kk$ = Space$(L - Len(aa$)) + aa$ + ",":    ';结果的显示格式
Print kk$; " ";                            ’显示结果
Print #1, kk$; " ";                        ’并将结果写入文件
t = t + 1
If t = 10 Then t = 0: Print:   ';每显示 10 个素数之后,换行显示
If t = 0 Then Print #1, "  "   ';在文件中每输入 10 个素数之后,换行输入
Next
Close #1                     ’关闭文件语句不要省
     
End Sub
这是从天山草先生的帖子中复制过来的,VB程序,有时间研究一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-5 17:01 | 显示全部楼层
白新岭 发表于 2021-5-5 15:43
[watermark]'; 文件名:  筛法求质数
'; 求 10 000 000 以内的素数
Private Sub form_Click()

vb程序实际上在Excel中右击工作表位置,在菜单中,选择代码,就可以学习里面的知识了,相当于帮助文件夹。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-7 21:28 | 显示全部楼层
SELECT 1
USE D:\二生素数分解\素数式11.DBF ALIAS 素数式11
SELECT 2
USE D:\二生素数分解\标记跨度为14的素数式并2次累计.DBF ALIAS 标记素数式及累计2次
kssj=SECONDS()
    For i=1 to 480
    @ 3,6 say i
     SELECT 1
     ss11=素式11
     jlh1=RECNO()
        FOR j=1 TO 7
        ss11b=素式11
        jlh2=RECNO()  && 记录指针位置
              IF ss11b-ss11=12
                 SELECT 1
                 GO jlh1
                 ss11l=素式11 && ss11l是素式11累计的缩写
                 s=0
                 m=0
                 m1=0
                 FOR k=1 TO j
                 ss11lb=素式11
                 jlh3=RECNO()  
                 zl=ss11lb-ss11l
                 s=s+zl
                 m=m+s
                 m1=m1+m
                  SELECT 1
                  GO jlh3+1
                  endfor
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 记录号 with jlh1  &&将B值付给素数式
              REPLACE 跨度 WITH 12
              REPLACE 素数 WITH 11
              REPLACE 素式量 WITH j
              REPLACE 累计2 WITH m1
              ENDIF
        SELECT 1
        GO jlh2+1
        ENDFOR
      SELECT 1
      GO jlh1+1
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是跨度12的在至素数11的分布表(不同类型的k生素数式的明细分布)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-7 21:38 | 显示全部楼层
SELECT 1
USE D:\二生素数分解\素数式13.DBF ALIAS 素数式13
SELECT 2
USE D:\二生素数分解\标记跨度为14的素数式并2次累计.DBF ALIAS 标记素数式及累计2次
kssj=SECONDS()
    For i=1 to 5760
    @ 3,6 say i
     SELECT 1
     ss13=素式13
     jlh1=RECNO()
        FOR j=1 TO 7
        ss13b=素式13
        jlh2=RECNO()  && 记录指针位置
              IF ss13b-ss13=12
                 SELECT 1
                 GO jlh1
                 ss13l=素式13 && ss11l是素式11累计的缩写
                 s=0
                 m=0
                 m1=0
                 FOR k=1 TO j
                 ss13lb=素式13
                 jlh3=RECNO()  
                 zl=ss13lb-ss13l
                 s=s+zl
                 m=m+s
                 m1=m1+m
                  SELECT 1
                  GO jlh3+1
                  endfor
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 记录号 with jlh1  &&将B值付给素数式
              REPLACE 跨度 WITH 12
              REPLACE 素数 WITH 13
              REPLACE 素式量 WITH j
              REPLACE 累计2 WITH m1
              ENDIF
        SELECT 1
        GO jlh2+1
        ENDFOR
      SELECT 1
      GO jlh1+1
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是跨度12的在至素数13的分布表(不同类型的k生素数式的明细分布)。
已经验证了分析结果(在至素数11和至素数13的素数式中的数量正确)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-8 08:01 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数表亿新.DBF ALIAS 素数表亿
SELECT 2
USE D:\VFP温习\二生素数14.DBF ALIAS 二生素数表
kssj=SECONDS()
For i=1 to 5761456
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=素数
    SKIP 1
    PUBLIC B
    B=素数
    cj=B-A  && 差距
    IF cj=12
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 二素14 WITH A         &&将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-5-9 16:34 | 显示全部楼层
SELECT 1
USE D:\二生素数分解\素数式13.DBF ALIAS 素数式13
SELECT 2
USE D:\二生素数分解\标记跨度为14的素数式并2次累计.DBF ALIAS 标记素数式及累计2次
kssj=SECONDS()
    For i=1 to 5760
    @ 3,6 say i
     SELECT 1
     ss13=素式13
     jlh1=RECNO()
        FOR j=1 TO 7
        ss13b=素式13
        jlh2=RECNO()  && 记录指针位置
              IF ss13b-ss13=18
                 SELECT 1
                 GO jlh1
                 ss13l=素式13 && ss11l是素式11累计的缩写
                 s=0
                 m=0
                 m1=0
                 FOR k=1 TO j
                 ss13lb=素式13
                 jlh3=RECNO()  
                 zl=ss13lb-ss13l
                 s=s+zl
                 m=m+s
                 m1=m1+m
                  SELECT 1
                  GO jlh3+1
                  endfor
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 记录号 with jlh1  &&将B值付给素数式
              REPLACE 跨度 WITH 18
              REPLACE 素数 WITH 13
              REPLACE 素式量 WITH j
              REPLACE 累计2 WITH m1
              ENDIF
        SELECT 1
        GO jlh2+1
        ENDFOR
      SELECT 1
      GO jlh1+1
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
跨度18的在至素数13时的分布情况(最后统计少4种4生素数式,不知何原因)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-9 17:24 | 显示全部楼层
SELECT 1
USE D:\二生素数分解\素数式17.DBF ALIAS 素数式17
SELECT 2
USE D:\二生素数分解\标记跨度为14的素数式并2次累计.DBF ALIAS 标记素数式及累计2次
kssj=SECONDS()
    For i=1 to 92160
    @ 3,6 say i
     SELECT 1
     ss17=素式17
     jlh1=RECNO()
        FOR j=1 TO 7
        ss17b=素式17
        jlh2=RECNO()  && 记录指针位置
              IF ss17b-ss17=18
                 SELECT 1
                 GO jlh1
                 ss17l=素式17 && ss11l是素式11累计的缩写
                 s=0
                 m=0
                 m1=0
                 m2=0
                 FOR k=1 TO j
                 ss17lb=素式17
                 jlh3=RECNO()  
                 zl=ss17lb-ss17l
                 s=s+zl
                 m=m+s
                 m1=m1+m
                 m2=m2+m1
                  SELECT 1
                  GO jlh3+1
                  endfor
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 记录号 with jlh1  &&将B值付给素数式
              REPLACE 跨度 WITH 18
              REPLACE 素数 WITH 17
              REPLACE 素式量 WITH j
              REPLACE 累计2 WITH m2
              ENDIF
        SELECT 1
        GO jlh2+1
        ENDFOR
      SELECT 1
      GO jlh1+1
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
达到4次累计才把各种素数式分开,在三次时,4生素数与统计出来的差4种类型,没有办法又把m1累加了一次,总算有了结果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-11 11:06 | 显示全部楼层
决定试着编一个裂解素数式程序,即把0,2,4,...,2n这些数随意组和起来,看一看有多少过素数的关卡,当然,任何一组,先包含2个元素,即0和2n,他两是必须入席的,没有他两儿不成席。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-11 16:14 | 显示全部楼层
本帖最后由 白新岭 于 2021-5-11 16:17 编辑

SELECT 1
USE D:\素数式裂解\素数式.DBF ALIAS 素数式
kssj=SECONDS()
    For i=1 to 13
        FOR j=i+1  TO 14
        ss1=2*i
        ss2=2*j
       SELECT  1   &&打开盛放素数式的表
       APPEND BLANK     &&增加一条空记录
       REPLACE 素式0 WITH ss1 &&将B值付给素数式
       APPEND BLANK     &&增加一条空记录
       REPLACE 素式0 WITH ss2 &&将B值付给素数式
       endfor
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是从2至28中,选择2个元素的组和式,即\(C_{14}^2\)=91种组和。
我想用程序制作同跨度的素数式种类。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 20:57 , Processed in 0.093895 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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