标题:用删除法编写一个制作素数表的vfp程序
只看楼主
独木星空
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
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6
把上面这句改成下面这样试试时间的变化

UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,4,6)
2021-10-06 20:17
独木星空
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
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
SCAN FOR RECNO()>8 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,4,6)

        SELECT 2    && 这句可以去掉,也许能省掉一点时间
ENDSCAN
2021-10-06 21:58
独木星空
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
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 1
USE D:\nm抽取m个数\模m余数统计.DBF ALIAS 模m余数统计
kssj=SECONDS()
y0=0
y1=0
y2=0
y3=0
y4=0
y5=0
y6=0
y7=0
y8=0
y9=0
y10=0
x=11*2+1 && m已经作为一个变量存在,所以文件大的没边,形成了1.9亿的记录条
    For i=1 to x
      FOR j=i+1  TO x+1
         FOR h=j+1  TO x+2
         FOR k=h+1  TO x+3
         FOR m=k+1  TO x+4
         FOR u=m+1  TO x+5
         FOR v=u+1  TO x+6
         FOR z1=v+1  TO x+7
         FOR z2=z1+1  TO x+8
         FOR z3=z2+1  TO x+9
         FOR z4=z3+1  TO x+10
             hz=i+j+h+k+m+u+v+z1+z2+z3+z4
             ys=MOD(hz,11)
               DO CASE
                  CASE ys=0
                  y0=y0+1
                  CASE ys=1
                  y1=y1+1
                  CASE ys=2
                  y2=y2+1
                  CASE ys=3
                  y3=y3+1
                  CASE ys=4
                  y4=y4+1
                  CASE ys=5
                  y5=y5+1
                  CASE ys=6
                  y6=y6+1
                  CASE ys=7
                  y7=y7+1
                  CASE ys=8
                  y8=y8+1
                  CASE ys=9
                  y9=y9+1
                  CASE ys=10
                  y10=y10+1
                  ENDCASE
          ENDFOR
          ENDFOR
          ENDFOR
         ENDFOR
         ENDFOR
          ENDFOR
          ENDFOR
         ENDFOR
      ENDFOR
      ENDFOR
   ENDFOR
   SELECT  1   &&打开盛放素数式的表
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 0 &&将B值付给素数式
          REPLACE 统计 WITH y0 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 1 &&将B值付给素数式
          REPLACE 统计 WITH y1 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 2 &&将B值付给素数式
          REPLACE 统计 WITH y2 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 3 &&将B值付给素数式
          REPLACE 统计 WITH y3 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 4 &&将B值付给素数式
          REPLACE 统计 WITH y4 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 5 &&将B值付给素数式
          REPLACE 统计 WITH y5 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 6 &&将B值付给素数式
          REPLACE 统计 WITH y6 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 7 &&将B值付给素数式
          REPLACE 统计 WITH y7 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 8 &&将B值付给素数式
          REPLACE 统计 WITH y8 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 9 &&将B值付给素数式
          REPLACE 统计 WITH y9 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 10 &&将B值付给素数式
          REPLACE 统计 WITH y10 &&将B值付给素数式
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是几抽几组和问题。主要是对for循环语句的运用。

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



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




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

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