数学中国

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

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

  [复制链接]
发表于 2021-10-13 08:47 | 显示全部楼层
SELECT 1
USE D:\问题x+2y的素数解\素数表.DBF ALIAS 素数表
SELECT 2
USE D:\问题x+2y的素数解\余数表.DBF ALIAS 余数表
kssj=SECONDS()
FOR k=1  TO 10
SELECT 1
GO k
ds=素数 &&ds对素之意
DIMENSION yy[ds]    && yy数组取代变量y0~y10
FOR i=1 TO alen(yy)
    yy[i] = 0
ENDFOR
SELECT 1
GO 1
FOR j=1 TO 32767
ss=素数
ys=MOD(ss,ds)
yy[ys+1] = yy[ys+1] + 1
SELECT 1
SKIP
endfor
    FOR h=1 TO alen(yy)
    INSERT INTO 余数表 (对素,余数,统计) VALUES (ds,h-1,yy[h])
    ENDFOR
endfor        
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个主题是没有那么多的程序要发表的,时间有限,只能慢慢的加填瓦块,砖石。
这是一个素数打分程序,在\(P_i+mP_j\)=2N+mod(m-1,2)中有重要应用。
回复 支持 反对

使用道具 举报

发表于 2021-10-13 11:32 | 显示全部楼层
SELECT 1
USE D:\问题x+2y的素数解\素数表亿.DBF ALIAS 素数表亿
SELECT 2
USE D:\问题x+2y的素数解\余数表.DBF ALIAS 余数表
kssj=SECONDS()
FOR k=1  TO 10
SELECT 1
GO k
ds=素数 &&ds对素之意
DIMENSION yy[ds]    && yy数组取代变量y0~y10
FOR i=1 TO alen(yy)
    yy[i] = 0
ENDFOR
SELECT 1
GO 1
FOR j=1 TO 5761454
ss=素数
ys=MOD(ss,ds)
yy[ys+1] = yy[ys+1] + 1
SELECT 1
SKIP
endfor
    FOR h=1 TO alen(yy)
    INSERT INTO 余数表 (对素,余数,统计) VALUES (ds,h-1,yy[h])
    ENDFOR
endfor        
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
运行时间:0分59.54秒,不到1分钟,而那个32767的运行0.36秒。
回复 支持 反对

使用道具 举报

发表于 2021-10-15 21:51 | 显示全部楼层
SELECT 1
USE D:\方程p减2的n次方\素数表.DBF ALIAS 素数表
SELECT 2
USE D:\方程p减2的n次方\奇数表.DBF ALIAS 奇数表
kssj=SECONDS()                      &&取出开始时间
FOR i=99 TO 9999 STEP 2
@12,10 SAY i
zs=INT(LOG(i)/LOG(2))
FOR j=1 TO zs
@22,20 SAY j
bpz=i-2^j           &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 1                    &&打开素数表
LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
DO CASE
CASE EOF()                          &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
jlh=RECNO()
SELECT 1 &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 1                                &&从第二条记录开始读取素数(3)
FOR k=1 TO jlh                    &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
IF qmz=0 && OR qmz=2 OR qmz=6 OR qmz=8  如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF k>jlh
exit
ENDIF
ENDFOR
IF j>zs
SELECT 2              &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 奇数 WITH i && 把bpz赋给素数        
endif
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是寻找那些不能表示成一个素数+2^n的奇数程序。
回复 支持 反对

使用道具 举报

发表于 2021-10-15 21:53 | 显示全部楼层
SELECT 1
USE D:\方程p减2的n次方\素数表.DBF ALIAS 素数表
SELECT 2
USE D:\方程p减2的n次方\奇素数表.DBF ALIAS 奇素数表
kssj=SECONDS()                      &&取出开始时间
FOR i=99 TO 9999 STEP 2
@12,10 SAY i
zs=INT(LOG(i)/LOG(2))
FOR j=1 TO zs
@22,20 SAY j
bpz=i-2^j           &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 1                    &&打开素数表
LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
DO CASE
CASE EOF()                          &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
jlh=RECNO()
SELECT 1 &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 1                                &&从第二条记录开始读取素数(3)
FOR k=1 TO jlh                    &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
IF qmz=0 && OR qmz=2 OR qmz=6 OR qmz=8  如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF k>jlh
SELECT 2              &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 奇数 WITH i && 把bpz赋给素数   
REPLACE 参素 WITH bpz && 把bpz赋给素数
ENDIF
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
制作奇数可表成一个素数+2^n程序,与上楼相反。
回复 支持 反对

使用道具 举报

发表于 2021-10-16 12:21 | 显示全部楼层
SELECT 1
USE D:\方程p减2的n次方\素数表万.DBF ALIAS 素数表万
SELECT 2
USE D:\方程p减2的n次方\一加m表.DBF ALIAS 一加m表
kssj=SECONDS()                      &&取出开始时间
FOR i=3 TO 9 STEP 2
@12,10 SAY i
&& zs=INT(LOG(i)/LOG(2))
FOR j=10 TO 3000 STEP 2
@22,20 SAY j
  IF MOD(j,i)=0
  LOOP
endif
  SELECT 1
  GO 1
  COUNT ALL FOR 素数<=j/i TO tj
  SELECT 1
  GO 1
        FOR k=1 TO tj
        SELECT 1
        ss=素数
        jl=recno()
        pdz=j-i*ss
           SELECT 1
           GO 1
           COUNT NEXT i*tj+10 FOR 素数=pdz TO tj1  
           IF tj1=1
           EXIT
           ENDIF
         SELECT 1
        GO jl+1
        ENDFOR
   IF k>tj
   SELECT 2  
   APPEND BLANK            
   REPLACE m值 WITH i
   REPLACE n值 WITH j
   ENDIF
  ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
寻找“1+m”中的反例,还是没有避开m大于2的因子。
回复 支持 反对

使用道具 举报

发表于 2021-10-16 14:44 | 显示全部楼层
SELECT 1
USE D:\方程p减2的n次方\素数表万.DBF ALIAS 素数表万
SELECT 2
USE D:\方程p减2的n次方\一加m表.DBF ALIAS 一加m表
kssj=SECONDS()                      &&取出开始时间
FOR i=11 TO 99 STEP 2
@12,10 SAY i
&& zs=INT(LOG(i)/LOG(2))
FOR j=10 TO 3000 STEP 2
@22,20 SAY j
  IF MOD(j,i)=0
  LOOP
endif
  SELECT 1
  GO 1
  COUNT ALL FOR 素数<=j/i TO tj
  SELECT 1
  GO 1
        FOR k=1 TO tj
        SELECT 1
        ss=素数
        jl=recno()
        pdz=j-i*ss
           SELECT 1
           GO 1
           COUNT NEXT i*tj+10 FOR 素数=pdz TO tj1  
           IF tj1=1
           EXIT
           ENDIF
         SELECT 1
        GO jl+1
        ENDFOR
   IF k>tj
   SELECT 2  
   APPEND BLANK            
   REPLACE m值 WITH i
   REPLACE n值 WITH j
   ENDIF
  ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是一个不算成熟的查找程序,还没有排除掉含m大于2的因子合成数(因为它们不被合成,无需检验)
回复 支持 反对

使用道具 举报

发表于 2021-10-16 15:34 | 显示全部楼层
本帖最后由 独木星空谁 于 2021-10-16 15:35 编辑

SELECT 1
USE D:\方程p减2的n次方\素数表万.DBF ALIAS 素数表万
SELECT 2
USE D:\方程p减2的n次方\一加m表.DBF ALIAS 一加m表
kssj=SECONDS()                      &&取出开始时间
FOR i=3 TO 99 STEP 2
@12,10 SAY i
IF MOD(i,3)=0
s=3
ELSE
s=1
ENDIF
IF MOD(i,5)=0
w=5
ELSE
w=1
ENDIF
IF MOD(i,7)=0
q=7
ELSE
q=1
ENDIF
FOR j=10 TO 3000 STEP 2
@22,20 SAY j
  IF MOD(j,s)=0 AND s>1
  LOOP
ENDIF
IF MOD(j,w)=0 AND w>1
  LOOP
ENDIF
  IF MOD(j,q)=0 AND q>1
  LOOP
endif
  SELECT 1
  GO 1
  COUNT ALL FOR 素数<=j/i TO tj
  SELECT 1
  GO 1
        FOR k=1 TO tj
        SELECT 1
        ss=素数
        jl=recno()
        pdz=j-i*ss
           SELECT 1
           GO 1
           COUNT NEXT i*tj+10 FOR 素数=pdz TO tj1  
           IF tj1=1
           EXIT
           ENDIF
         SELECT 1
        GO jl+1
        ENDFOR
   IF k>tj
   SELECT 2  
   APPEND BLANK            
   REPLACE m值 WITH i
   REPLACE n值 WITH j
   ENDIF
  ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
虽然把含m大于2的因子合数去除了,好像把合理的取值也给排除了。
条件加的位置不对。
回复 支持 反对

使用道具 举报

发表于 2021-10-16 15:50 | 显示全部楼层
上边的程序有一个最大问题,把含m因子的合数去掉了,没有去掉m本身的倍数,所以治聋治哑了。
回复 支持 反对

使用道具 举报

发表于 2021-10-16 15:56 | 显示全部楼层
m值        n值
3        10
5        12
5        14
5        16
5        24
7        10
7        12
7        16
7        18
7        20
7        22
7        30
7        36
9        10
9        14
9        16
9        20
9        22
9        26
9        28
11        10
11        12
11        14
11        16
11        18
11        20
11        24
11        26
11        28
11        30
11        32
11        34
11        42
11        48
11        54
13        10
13        12
13        14
13        16
13        18
13        20
13        22
13        24
13        28
13        30
13        32
13        34
13        36
13        38
13        40
13        48
13        54
13        60
13        64
13        66
13        74
13        90
13        116
15        14
15        16
15        22
15        26
15        28
15        32
15        34
15        38
15        44
15        46
17        10
17        12
17        14
17        16
17        18
17        20
17        22
17        24
17        26
17        28
17        30
17        32
17        36
17        38
17        40
17        42
17        44
17        46
17        48
17        50
17        52
17        60
17        66
17        72
17        76
17        78
17        84
17        86
17        100
17        106
17        120
17        176
17        184
17        196
17        526
19        10
19        12
19        14
19        16
19        18
19        20
19        22
19        24
19        26
19        28
19        30
19        32
19        34
19        36
19        40
19        42
19        44
19        46
19        48
19        50
19        52
19        54
19        56
19        58
19        66
19        72
19        78
19        82
19        84
19        90
19        92
19        96
19        120
19        122
19        134
19        172
19        182
19        210
19        218
19        302
19        452
回复 支持 反对

使用道具 举报

发表于 2021-10-16 15:59 | 显示全部楼层
SELECT 1
USE D:\方程p减2的n次方\素数表万.DBF ALIAS 素数表万
SELECT 2
USE D:\方程p减2的n次方\一加m表.DBF ALIAS 一加m表
kssj=SECONDS()                      &&取出开始时间
FOR i=3 TO 99 STEP 2
@12,10 SAY i
IF MOD(i,3)=0
s=3
ELSE
s=1
ENDIF
IF MOD(i,5)=0
w=5
ELSE
w=1
ENDIF
IF MOD(i,7)=0
q=7
ELSE
q=1
ENDIF
FOR j=10 TO 3000 STEP 2
@22,20 SAY j
   IF MOD(j,i)=0
   LOOP
   ENDIF
  IF MOD(j,s)=0 AND s>1
  LOOP
ENDIF
IF MOD(j,w)=0 AND w>1
  LOOP
ENDIF
  IF MOD(j,q)=0 AND q>1
  LOOP
endif
  SELECT 1
  GO 1
  COUNT ALL FOR 素数<=j/i TO tj
  SELECT 1
  GO 1
        FOR k=1 TO tj
        SELECT 1
        ss=素数
        jl=recno()
        pdz=j-i*ss
           SELECT 1
           GO 1
           COUNT NEXT i*tj+10 FOR 素数=pdz TO tj1  
           IF tj1=1
           EXIT
           ENDIF
         SELECT 1
        GO jl+1
        ENDFOR
   IF k>tj
   SELECT 2  
   APPEND BLANK            
   REPLACE m值 WITH i
   REPLACE n值 WITH j
   ENDIF
  ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 17:51 , Processed in 0.103935 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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