标题:用删除法编写一个制作素数表的vfp程序
取消只看楼主
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CREATE CURSOR tt(bol L,num I)
仅这个语句就解释了一堆:
create cursor 创建光标
alias_name(alias是别名之意) [codepage(代码页)=nCodepage]
      (fname1  type(类型) [(precision(精确度)[,scale])
 scale n.(相对的)大小,规模,范围;尺度;标度;等级表;级别表;比例;比例尺;音阶;鳞;
 标准;级别;标尺;刻度尺;(测试心智发展等的)量表;(鳞翅目昆虫的)翅瓣;(皮肤的)鳞屑;
 鳞片;铁鳞;(金属在高温下形成的)氧化层,氧化皮;梯子;楼梯;
 [null | not null ][check IExpvession (检查报告)[ERROR cMessageText]]   错误信息传送
null  零.(我原来认为是空值之意,即单元格为空白,没有填写内容的单元格)
 adj.无法律效力的;无效的;无价值的;无用的;无意义的;无特色的;无特点的;不存在的;一无所有的;
 数量为零的;零的;空的;极限为零的;(测量仪器)零读数的,读数为零的;
 [Autoinc [Nextvalue  Nextvalue[stepValue ]]]
汽车工业?  下一个值             阶梯值
[Default,eExpression] [unique [collate cCollate Sequence]]
违约       表达式      独特的
adj.唯一的;独一无二的;独特的;无与伦比的;无可匹敌的;独有的;特有的;唯一(结果)的;唯一(值)的;
 collate 核对
 vt.校对;核对;对照;(图书馆工作中)核对,检查(书籍页码及其顺序);检验(印张顺序);
 授予(教区牧师)有俸职位;
 序列 Sequence
 [nocptrans][,fname2....]) |From array arrayName
  在线翻译还是原字母              数组
这是在线翻译获得的意思,形而上学的用是用了,真不知所以然。

素数问题的解决是我学习编程永恒的动力。
2021-10-02 19:43
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
DIMENSION Fib[20]
Fib[1]=1
Fib[2]=1
FOR i=3 TO 20
    n=i
   Fib[n]=Fib[n-1]+Fib[n-2]
   ?Fib[n]
 ENDFOR
今天简单的学习了下,数组的运用。上边的小程序,输出了从3到20的斐波那契数列的值(Fibonacci)

素数问题的解决是我学习编程永恒的动力。
2021-10-03 15:56
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CLEAR
SELECT 1
USE D:\标记法\数据源表.DBF ALIAS 数据源
SELECT 2
USE D:\标记法\素数表5万.DBF ALIAS 素数表参
SELECT 5
USE D:\标记法\素数表结果.DBF ALIAS 素数表果
kssj=SECONDS()                     
FOR i=5 TO 6
@12,10 SAY i
dimension  arr[1658880]
SELECT 1
GO 1
    FOR j=1 TO 1658880
    arr[j]=素数式+(i-1)*9699690
    SELECT 1
    SKIP
    ENDFOR
      bpz=i*9699690
      Kf=INT(SQRT(bpz))
      SELECT 2
      GO 1
      COUNT ALL FOR 素参<=kf TO jlh  && jlh=RECNO()
      xhcs=jlh-8 &&xhcs是循环次数的简写(第一个字母代替)
      SELECT 2   
      GO 9
      FOR k=1 TO xhcs
       sc=素参
            FOR h=1 TO 1658880
                IF arr[h]>0
                  if MOD(arr[h],sc)=0
                   arr[h]=0
                   endif
                 ENDIF
             ENDFOR
       SELECT 2
       skip
       ENDFOR
           FOR l=1 TO 1658880
           IF  arr[l]>0
           SELECT 5
           APPEND BLANK
           REPLACE 素数 WITH arr[l]
           ENDIF
           ENDFOR
 ENDFOR
 =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是用数组代替,数据表a和数据表b后的程序。运行时间:17分49.91秒。
比起最开始用3和4表时,50分16.70秒快了不少,比起laowan001的程序1026秒还是稍微慢点,如果按吹水佬版主的建议,把查询最大素数记录条的语句改成乘法运算,或许比开方运算快点,不过一个外循环只判断一次,估计提高不了多少。
在用到数据源及素数表的情况下,不知道是否还可以进一步优化?
当然在这个问题处理上,吹水佬版主的程序运行最快,包括后来给的dll文件,更是一流,美中不足之处,就是不能嫁接移植到别的程序中去,因为没有用到数据源及素数表(前提条件,单纯的制作素数用处有点窄)。

素数问题的解决是我学习编程永恒的动力。
2021-10-04 10:13
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 1
USE D:\素数式系数\素数表万.dbf ALIAS 素数表
SELECT 2
USE D:\素数式系数\k6生素数系数表1.dbf ALIAS 系数表
kssj=SECONDS()  &&取出开始时间
FOR n=1 TO 999
m=30*INT((n-1)/3)+iif(MOD(n,3)=1,6,iif(MOD(n,3)=2,24,30))
    @ 5,12 say n
    s=1.0000000000000000
         IF MOD(m,5)=0
          s=s*2
          ELSE
          s=s*1
         ENDIF
         IF MOD(m,7)=0
          s=s*2
          ELSE
          s=s*1
         ENDIF        
    SELECT 1
    GO 5
    pdz=.F.
     DO WHILE NOT pdz
           SELECT 1
           P=素数
           IF 2*P>m+6
           pdz=.T.
           endif
           DO case
           CASE  MOD(m,P)=0
           s=s*(P-3)/(P-6)
           CASE  MOD(m,P)=MOD(-2,P)
           s=s*(P-5)/(P-6)
           CASE  MOD(m,P)=MOD(2,P)
           s=s*(P-5)/(P-6)
           CASE  MOD(m,P)=MOD(-4,P)
           s=s*(P-5)/(P-6)
           CASE  MOD(m,P)=MOD(4,P)
           s=s*(P-5)/(P-6)
           CASE  MOD(m,P)=MOD(-6,P)
           s=s*(P-5)/(P-6)
           CASE  MOD(m,P)=MOD(6,P)
           s=s*(P-5)/(P-6)
           otherwise
           s=s*1
           ENDCASE
       SELECT 1
       SKIP
       enddo
         
           SELECT 2
           APPEND BLANK     &&增加一条空记录
           REPLACE k生 WITH 6 &&将B值付给素数式
           REPLACE 三kd WITH m &&将B值付给素数式
           REPLACE 系数 WITH 34.5972246684609*s &&将B值付给素数式
  ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
一个求两组最密3生素数中项差(或和)的(公式)系数程序。

素数问题的解决是我学习编程永恒的动力。
2021-10-05 09:09
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式至19.DBF ALIAS 素数式19
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数新.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=711 TO 720
@12,10 SAY i
    SELECT 式19+(i-1)*9699690 数据1,CAST(1 as INT) 数据mod FROM 素数式19 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>8 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6

        SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6
   
 ENDFOR
 USE IN 数据a
 
 MESSAGEBOX( DATETIME()-kssj)
这是把laowan001先生的,稍微改了下,求最密三生素数程序

素数问题的解决是我学习编程永恒的动力。
2021-10-06 16:11
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 113楼 laowan001
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式至19.DBF ALIAS 素数式19
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数新.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=721 TO 722
@12,10 SAY i
    SELECT 式19+(i-1)*9699690 数据1,CAST(1 as INT) 数据mod FROM 素数式19 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>8 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,4,6)

        SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,4,6)
   
 ENDFOR
 USE IN 数据a
 
 MESSAGEBOX( DATETIME()-kssj)
做了一个实验(测试),结果是,原来的程序用时495秒;改变后,用时446秒;相差49秒,是一个不小的进步。

素数问题的解决是我学习编程永恒的动力。
2021-10-06 21:46
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 115楼 laowan001
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式至19.DBF ALIAS 素数式19
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数新.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=721 TO 722
@12,10 SAY i
    SELECT 式19+(i-1)*9699690 数据1,CAST(1 as INT) 数据mod FROM 素数式19 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>8 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,4,6)

        && SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,4,6)
   
 ENDFOR
 USE IN 数据a
 
 MESSAGEBOX( DATETIME()-kssj)
几乎不受影响,用时443秒。

素数问题的解决是我学习编程永恒的动力。
2021-10-07 07:23
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 115楼 laowan001
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式至19.DBF ALIAS 素数式19
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数新.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=721 TO 722
@12,10 SAY i
    SELECT 式19+(i-1)*9699690 数据1,CAST(1 as INT) 数据mod FROM 素数式19 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    sj1=数据1

    SELECT 2
   
    SCAN FOR RECNO()>8 AND 素数*素数<=sj1
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,4,6)

        && SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,4,6)
   
 ENDFOR
 USE IN 数据a
 
 MESSAGEBOX( DATETIME()-kssj)
我自己私自改动了一下,运算不但没有提速,还多用了几秒,想想也是,原来直接判断大小即可,现在每次还得算一次乘法,这不是得拨摆人吗?  用时451秒。

素数问题的解决是我学习编程永恒的动力。
2021-10-07 07:47
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 1
USE D:\标记法\四生素数生成元.DBF  ALIAS 四生成元
SELECT 2
USE D:\标记法\素数表5万.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 5                                &&从第二条记录开始读取素数(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,"运行时间提示")
这是产生四生素数生成元程序,到了素数23,自然数跨度223092870.
制作了700245个种子。

素数问题的解决是我学习编程永恒的动力。
2021-10-07 08:23
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 113楼 laowan001
CLOSE DATABASES
SELECT 1
USE d:\标记法\四生素数生成元.DBF ALIAS 生成元23
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\四生素数.DBF ALIAS 四素表

SELECT 四素 数据1 FROM 四素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=1 TO 2
@12,10 SAY i
    SELECT 四生元+(i-1)*223092870 数据1,CAST(1 as INT) 数据mod FROM 生成元23 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>9 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,2,6,8)

        SELECT 2
    ENDSCAN
   
    INSERT INTO 四素表 (四素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,2,6,8)
   
 ENDFOR
 USE IN 数据a
 
 MESSAGEBOX( DATETIME()-kssj)
这是仿照laowan001先生的程序改造出来的,制作最密四生素数表程序,用时576秒。只是丢了最开始的12个四生素数,这点是预料之中的事。
运行第3,4周,用时837秒,比头1,2周增时,原因是它们循环次数增多,导致的。

[此贴子已经被作者于2021-10-7 10:14编辑过]


素数问题的解决是我学习编程永恒的动力。
2021-10-07 09:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506838-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.483642 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved