注册 登录
编程论坛 VFP论坛

优化程序或者从新编写求四生素数中项不能合成的偶数

独木星空 发布于 2021-10-17 19:31, 13650 次点击
* 以大定小选配素数对
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp温习\L8四生素数尾素不能合成数.DBF ALIAS 素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\vfp温习\L8四生素数真表.DBF  ALIAS 素数表
kssj=SECONDS()
FOR i=23000001  to 24000000
@ 3,6 say i
    n=i
       X=8+(INT((n-INT((n-1)/5)*5)/2)+(n-INT((n-1)/5)*5))*30+INT((n-1)/5)*210 &&这是在给被判偶数置数,思路每5个偶数构成一个循环期,步长210。
          Y=X/2   &&求出偶数的中值(上一条置数语句,除了外步长210,还有内步长30,但是有2个间断点,所以有些复杂。
        SELECT 素数表
        LOCATE FOR 四素>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 四素>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=四素
                GO xjl
                xss=四素
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 素数对
                                APPEND BLANK
                                REPLACE 偶数 WITH X
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是我编写的程序,下一贴把四生素数表(最末的一项代表值,即一组四生素数用最末的一个素数代替),发上来,还有存储表:不能被合成的偶数。
267 回复
#2
独木星空2021-10-17 19:35
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
#3
Bc_Newboy2021-10-17 19:36
#4
独木星空2021-10-17 19:44
* 以大定小选配素数对
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\vfp温习\L8四生素数中项不能合成数.DBF ALIAS 素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\vfp温习\L8四生素数表.DBF  ALIAS 素数表
kssj=SECONDS()
FOR i=31  to 1000
@ 3,6 say i
    n=i
       X=19+(n-INT((n-1)/3)*3-1)*90+INT((n-1)/3)*210 &&这是在筛选四生素数置数,非寻找不能合成的偶数。
          Y=X/2   &&求出偶数的中值
        SELECT 素数表
        LOCATE FOR 四中>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 四中>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=四中
                GO xjl
                xss=四中
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y OR dss>Y                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>=Y OR dss<=Y
        SELECT 素数对
                                APPEND BLANK
                                REPLACE 偶数 WITH X
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个程序运行前,必须把四生素数表的值统一减4,变成四生素数中项才可以,直接用不能完成任务。
在模210之内,只能合成30,180,210,三类数,210m+30,210m+180,210m+210这三类数,其他的皆不能合成。
所设计程序的目的是查找小范围内没有合成方法的偶数(属于它们三类之中的偶数,其余偶数不必考虑)。
#5
独木星空2021-10-17 19:53
如果直接用四生素数表,是合成210m+38,210m+188,210m+218,即主楼的程序;用四楼的程序时,四生素数表需要简单处理,让每个四生素数表中的元素--4(减4),或的其中项值。
     四生素数表,不能被合成的偶数,用到的两个表发在2#
     希望大家勇于参加讨论,和优化程序,或者提供新的算法。大概在43.5亿后不在有反例,小范围出现反例多,大范围时,出现反例明显减少。这两种程序都有点缺陷,小的值会进入无限循环,达不到跳出条件,所以可以从100起步,即210*100=21000,前边的可以不处理,在Excel中容易办到。
#6
sdta2021-10-17 20:37
请楼主先普及一下何谓四生素数 
四生素数中项不能合成的偶数 不知道如何理解
#7
xuminxz2021-10-17 20:51
看样楼主是在研究数论,而不是VFP或VB的某种特定语言。可能要打击你一下了。如果进行数论的研究,你遇到的数会很大,并且溢出。不论用什么语言,现成的算法都会溢出。
需要构造一组计算方法,能进行四则运算及其它需要的运算。这种方法应该是只要计算机的外部存储空间够大,计算就能进行下去。几十上百位甚至更多位的运算都可以进行。
#8
吹水佬2021-10-17 21:03
只能做很有限的必要性,谈不上能做充分性。
#9
吹水佬2021-10-17 21:06
只能做很有限的必要性,谈不上能做充分性。
#10
独木星空2021-10-17 21:56
回复 6楼 sdta
四生素数是指像(11,13,17,19)这样的素数群(国外称四元组),也就是有两组孪生素数对构成的,它们具有统一特征,如果用构成它的四个素数分别减去第一个素数(首素数),则差值固定:(0,2,6,8),我称它为:四生素数的素数式,这是我自己对它的称谓,没有官方认证,也不是现有数学的名词,术语。当一组素数,有四个素数组成一组,头尾素数差值为8时,所组成的素数组中的素数差(皆以第一个素数作为被减数),与我列的素数式相同时,即为最密的4生素数,意思是说,无论你如何安排,在自然数段,跨距为8(首位两个数的差值),长度为9(包括首位数,所占位,也是跨度加1为长度)。
     不知道能否理解。一句话,有两组孪生素数对构成的四元组素数群,这两对孪生素数对的差为6(小的减小的,或者大的减大的,例如(11,13)与(17,19)这两对,17-11=6,或者19-13=6).
用其末项代表这一组四生素数,是19(19为最密四生素数(11,13,17,19)的末素数),同理109(101,103,107,109),我给的四生素数表中的数都是四生素数的末素数。
     现在说一说,程序需要解决的问题:x+y=2N,x,y都是四生素数中的末素数,2N只能取:210m+38,210m+188,210m+218这三类数中的数,其余的偶数不考虑。
     现在找这三类数中的反例,即方程无解的偶数,把没有解组的偶数储存即可。预计43.5亿后,不在有反例存在。是否理解请回复。
#11
独木星空2021-10-17 22:03
回复 7楼 xuminxz
这个限制是无法避免的。指溢出这个现象。就是用函数mod(n.m)也会溢出,计算错误。不过此问题,不会出现,因为,100亿内的四生素数表已经提供,预计在43.5亿后不在有反例,一个加法运算,在允许范围以内,不会出现溢出现象。那个程序我运行过,只是嫌它运行太慢,才有此举。
#12
sdta2021-10-17 22:07
回复 10楼 独木星空
四生素数中项不能合成的偶数 不知道如何理解
#13
独木星空2021-10-17 22:12
回复 8楼 吹水佬
不知此话怎讲?如果说,问题的合理性,那不需要考虑,因为我实际运行过(也证明了它的存在性及合理性)。就是说,那个表存在加法合成元素(即x+y=2N中,x和y的取值),合成结果也已给出:210m+38,210m+188,210m+218(或者用其中项,把表中所有值都减去4,即为中项,此时合成数为210m+30,210m+180,210m+210).
    如果不是命题方面,而是程序上的事情,有就不知道说的是什么了。
必要性何解?充分性又何解?
#14
独木星空2021-10-17 22:23
回复 12楼 sdta
(11,13,17,19)的中项为15,(101,103,107,109)的中项为105,15+105=120,(191,193,197,199)的中项为195;
15+195=210,15+15=30,105+105=210,195+195=390(1*210+180),105+195=300(1*210+90),以上各楼有误:
在210周期内有5类数可以合成:210m+30,210m+38,210m+90,210m+120,210m+180,210m+210这五类偶数,另外210m+60,210m+150这两类偶数不能被合成,也不考虑它们。只查找那5类偶数中无解的。
即x+y=2N,2N是所列的五类数中的偶数。x,y是四生素数的中项值。
#15
独木星空2021-10-17 22:37
回复 9楼 吹水佬
如果对于命题而言,充分性与必然性并存,无懈可击。
如果谈程序优化,就不知道了。
吹水佬版主可以试运行,只不过,那个程序太菜,运行速度极慢,估计的一个月才能运行到43.5亿,如果想推翻它,需要在43.5亿后找到反例才可(即无解偶数)。
#16
独木星空2021-10-18 07:24
希望大家继续参与讨论,其实不需要考虑别的因素,你就知道那个四生素数表中放着x,y可以取值的元素,有小到大排列。程序需要解决任意两个数相加,有那个具体偶数无解即可。偶数是5类偶数中的偶数,其余偶数不需要考虑。
#17
独木星空2021-10-18 19:44
SELECT 1
USE D:\三角递增法\四生素数表.DBF ALIAS 四素表
SELECT 2
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
kssj=SECONDS()
 SELECT  1
 GO 1
 For i=1 to 102949
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    && jl=recno()
    PUBLIC A
    A=四素
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 四中 WITH A-4      &&将N值付给素数式
   SELECT 1
   skip
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是把四生素数表(用末素代替一组四生素数),改写成用四生素数中项代替一组四生素数程序。
#18
独木星空2021-10-18 20:18
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\偶数表.DBF ALIAS 偶数表
kssj=SECONDS()
 SELECT  1
 GO 1
 For i=1 to 2949
      @ 5,12 say i
    SELECT  1     
    jl=recno()
    PUBLIC A
    A=四中
          SELECT  1
          GO 1
          For j=1 to 102949
          @ 15,22 say j
          PUBLIC B
          B=四中
          C=A+B
           SELECT 2
           COUNT all  FOR C=偶数 TO tj
              IF tj=0
              SELECT 2
              APPEND BLANK   
              REPLACE 偶数 WITH C
              ENDIF   
           SELECT 1
           SKIP
           ENDFOR
   SELECT 1
   GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
    &&不成功案例,因为查找是否已有太费时间
本想着制作出一个能合成的偶数表,然后排序后,把间断的偶数挖出来即可。
梦想是美好的 ,现实总是残酷的。事与愿违。
#19
独木星空2021-10-18 20:44
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\偶数表.DBF ALIAS 偶数表
kssj=SECONDS()
 SELECT  1
 GO 1
 For i=1 to 100
      @ 5,12 say i
    SELECT  1     
    jl=recno()
    PUBLIC A
    A=四中
          SELECT  1
          GO 1
          For j=1 to 102949
          @ 15,22 say j
          PUBLIC B
          B=四中
          C=A+B
              SELECT 2
              APPEND BLANK   
              REPLACE 偶数 WITH C   
           SELECT 1
           SKIP
           ENDFOR
   SELECT 1
   GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是直接制作偶数表。不过得1000来个表,最低也得500个表,然后对每个表去重复的,留下唯一值,那么制作出来的偶数表,如何去重,及排序,挑出唯一值呢?
#20
独木星空2021-10-18 21:36
sort to 偶数表升序 on 偶数
对制作出来的偶数表排序,
#21
独木星空2021-10-18 21:37
SELECT 1
USE D:\三角递增法\偶数表升序.DBF ALIAS 偶数表升序
SELECT 2
USE D:\三角递增法\偶数升序表.DBF ALIAS 偶升表
kssj=SECONDS()
 SELECT  1
 GO 1
 oushu=偶数
 SELECT 2
         APPEND BLANK     
         REPLACE 偶升 WITH   oushu
 For i=1 to 10294899
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=偶数
    SKIP
    PUBLIC B
    B=偶数
         IF B-A>0
         SELECT 2
         APPEND BLANK     
         REPLACE 偶升 WITH B
         endif   
   SELECT 1
   GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
整理偶数表,去掉重复数据。
#22
独木星空2021-10-18 22:20
Select A.* Into Table d:\三角递增法\偶数表升序1 From 偶数表 A Inner Join (Select 偶数 From 偶数表 Group By 偶数 Having Count(*)=1) B On A.偶数=B.偶数
这个语句可以把,制作出来的偶数表,重新整理,去重了,不知道是否排列序。
#23
独木星空2021-10-18 23:27
在不指明路径的情况下,新建表是存到VFp的根目录上的。
#24
独木星空2021-10-19 08:36
回复 22楼 独木星空
那个语句同时进行了排序。
#25
独木星空2021-10-19 15:00
四生素数中项差值只有模210余0,30,90,120,180这5种间距,没有模210余60和150的2种间距。对于中项和也是如此。
#26
独木星空2021-10-19 15:43
从148#截止,以后应该没有不能合成的偶数了(有合成方法的偶数),因为在42.21亿到43.302亿之间1.092亿的跨度内没有在出现不能合成的偶数。
前半句可以忽略掉,从因为往后是我发在这里的原因,1个多亿的跨度内没有找到反例,这说明,反例总有断截的地方。
感兴趣的,可以从42.21亿后,运行,找到一个反例,比找到一块金子都难。
#27
独木星空2021-10-19 16:02
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\偶数表.DBF ALIAS 偶数表
kssj=SECONDS()
 SELECT  1
 GO 1101
 For i=1 to 200
      @ 5,12 say i
    SELECT  1     
    jl=recno()
    PUBLIC A
    A=四中
          SELECT  1
          GO 1100+i
          For j=1 to 101850-i
          @ 15,22 say j
          PUBLIC B
          B=四中
          C=A+B
              SELECT 2
              APPEND BLANK   
              REPLACE 偶数 WITH C   
           SELECT 1
           SKIP
           ENDFOR
   SELECT 1
   GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
我计划制作偶数表的方式来找那些不能合成的偶数。
#28
独木星空2021-10-19 17:00
这个问题就是一道数学题:x+y=30N,x,y取四生素数表中的数值,那些数据,由小到大排列,它们在210这个周期内,只能合成0,30,90,120,180这五类偶数,另外的60,150是不能被合成的(所以不考虑这两类数),也就已30递增,7个值,只有5个值可以被合成,另外2个值不能被合成;就是在能被合成的五类数中,在小范围内,存在有限个反例,最大反例出现范围,不超过43.5亿。找43.5亿以前的反例(五类数中的)。
    那个四生素数表提供了100亿内的四生素数,用末素代替的,只需要统一减去4,就得到了四生素数中项值。
#29
独木星空2021-10-19 21:31
1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\四生素数表中分层.DBF ALIAS 四中表分层
kssj=SECONDS()
 SELECT  1
 GO 1
 For i=1 to 102949
      @ 5,12 say i
    SELECT  1   
    && jl=recno()
    PUBLIC A
    A=四中
    B=INT(A/210)
    C=MOD(A,210)
         SELECT 2
         APPEND BLANK     
         REPLACE 整数 WITH B
         REPLACE 余数 WITH C
   SELECT 1
   skip
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
制作四生素数中项的分身
#30
独木星空2021-10-19 21:34
只有本站会员才能查看附件,请 登录

这是上边程序制作的文件。
#31
独木星空2021-10-19 21:49
SELECT 1
USE D:\三角递增法\四生素数表中分层.DBF ALIAS 四中表分层
SELECT 2
USE D:\三角递增法\偶数双表.DBF ALIAS 偶数双表
kssj=SECONDS()
 SELECT  1
 GO 1
 For i=1 to 1000
      @ 5,12 say i
    SELECT  1     
    jl=recno()
    A=整数
    B=余数
          SELECT  1
          GO 1
          For j=1 to 1000
          @ 15,22 say j
          C=整数
          D=余数
          E=A+C+INT((B+D)/210)
          F=MOD(B+D,210)
              SELECT 2
              APPEND BLANK   
              REPLACE 偶整 WITH E  
              REPLACE 偶余 WITH F
           SELECT 1
           SKIP
           ENDFOR
   SELECT 1
   GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
#32
独木星空2021-10-19 22:06
Select A.* Into Table d:\三角递增法\偶数双表简 From 偶数双表 A Inner Join (Select 偶整,偶余 From 偶数双表 Group By 偶整,偶余 Having Count(*)=1) B On A.偶整=B.偶整 AND A.偶余=B.偶余
不知是否正确,在1000*1000个四生素数中,合成了只有512种结果,也太巧合了。512是2的9次方。
#33
独木星空2021-10-19 22:33
回复 22楼 独木星空
此楼语句,产生的结果正确,不知道,同样的语句,产生的结果错误?用前1千个四生素数,进行加法运算,最少也得1000多,却出现512这样的极端错误,不知为何?
#34
独木星空2021-10-20 07:06
假设把四生素数表,分成100份,则100*100=10000份,其中100份为平方项,剩余9900份为交叉项,而交叉项前系数皆为2,所以9900/2=4950项,即,i从1到99,j从i+1到100,有99项,有98项,依此类推,所以共有1+2+3+....+99=(1+99)*99/2=4950项。
把数据散分,或许也是一种不错的思路。
#35
独木星空2021-10-20 08:36
CLOSE DATA
USE d:\三角递增法\偶数双表.dbf && 设源表的名称为“表1”
P=''
FOR K=1 TO FCOUNT()
 P=P+IIF(EMPTY(P),'',',')+FIELDS(K) && 取得表中所有字段名称,放在 P 中
ENDFOR
SELECT *,COUNT(FIELDS(1)) AS 相同记录数 FROM DBF() GROUP BY &P. INTO DBF 相同记录数 && 取得各记录的相同记录数及其各字段值
SELECT * FROM DBF() WHERE 相同记录数>1 && 该查询结果详细列举了表1中各重复记录的 重复数
默认情况下,新建的数据统计表是储存在vfp的根目录中的。
#36
独木星空2021-10-20 12:47
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四生素数中
SELECT 2
USE D:\三角递增法\各段四生素数个数.DBF ALIAS 四生个数
kssj=SECONDS()
SELECT 1
     For j=1 to 50
      @ 3,6 say j
      fw=j*10^8
            SELECT 1
            GO 1
            COUNT ALL FOR fw>四中 TO tj
              SELECT  2  &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 范围 WITH fw
              REPLACE 总个数 WITH tj
     ENDFOR
   
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
打分成五十块数据,分别进行处理。
#37
独木星空2021-10-20 13:20
段落    统计    最小值
200    1    0
300    1    100
400    2    200
500    2    300
600    3    400
700    3    500
800    4    600
900    4    700
1000    5    800
1100    5    900
1200    6    1000
1300    6    1100
1400    7    1200
1500    7    1300
1600    8    1400
1700    8    1500
1800    9    1600
1900    9    1700
2000    10    1800
2100    10    1900
2200    11    2000
2300    11    2100
2400    12    2200
2500    12    2300
2600    13    2400
2700    13    2500
2800    14    2600
2900    14    2700
3000    15    2800
3100    15    2900
3200    16    3000
3300    16    3100
3400    17    3200
3500    17    3300
3600    18    3400
3700    18    3500
3800    19    3600
3900    19    3700
4000    20    3800
4100    20    3900
4200    21    4000
4300    21    4100
4400    22    4200
4500    22    4300
4600    23    4400
4700    23    4500
4800    24    4600
4900    24    4700        
5000    25    4800        
5100    25    4900        
总计算    650    20211020    分成100份    或许更好
把50亿分成50段,每段1亿,共需要排查650块数据;或者分成100块,每段0.5亿。这样会加快处理速度。
#38
独木星空2021-10-20 20:11
只有本站会员才能查看附件,请 登录
这是把50亿内的四生素数表分成50段,每段四生素数的个数表及到此范围内总四生素数的个数,为分块处理做准备。
#39
独木星空2021-10-20 23:15
再也没有人介入此问题,是我最大的失望。如果有人对此问题,进行促膝畅谈,进行算法交流,不胜感激涕零。
#40
吹水佬2021-10-21 04:56
以下是引用独木星空在2021-10-20 23:15:27的发言:

再也没有人介入此问题,是我最大的失望。如果有人对此问题,进行促膝畅谈,进行算法交流,不胜感激涕零。

当年陈景润夠孤独了,但他对素数的探究从未失望过。
素数对很多人来说比较枯燥无味,不感兴趣。
或者先谈一下相关方面的概念、探讨方向和目的,也许会对大家增加点兴趣。
有兴趣才有动力,编程也是这样。


[此贴子已经被作者于2021-10-21 05:13编辑过]

#41
独木星空2021-10-21 05:47
回复 40楼 吹水佬
或许吧!对于素数这个大熔炉,它会有好多素材,供人们练习编程。这里有一个问题就是,兴趣是最好的老师。本主题,在对它了解以前,或许也想不到很好的方法。
     撇开与素数有关的不谈,因为一时半会,还真说不清楚。但是此问题作为编程素材,还是可以讲得很清楚的,我上传了四生素数表,可以不去管它,就认为是一种具有某特征的奇数就好,安大小排列,然后就是从中任意取两个数做和,即进行加法运算,比会得到一个确切值,这些值可以分成五大类,合成数,即两个数相加,模210,一定是余数0,30,90,120,180;绝对不会出现模210,余数是60或者150的情况。也就是说,假设以210为周期,这个周期内最多可以合成5个数,其余的不管是不是偶数,都不可能被合成,奇数就不用考虑了。
     那么,现在的问题是把小范围内的反例找出来,即从理论上能被合成的数,实际上并没有解的偶数,预估算,大于43.5亿后不在有反例出现。所以提供了50亿内的四生素数表(说是四生素数表,只是表中每一组四生素数是用最后一个素数代替的,其余素数也不用考虑进去,如果用整个四生素数,是比加大难度和运算量,用代表就可以完成使命)。四生素数,如(11,13,17,19)第一组,表中以19代替本组,中项就是19-4=15,只考虑两个中项和的结果。
#42
sdta2021-10-21 06:46
四生素数一般指四胞胎素数。
四胞胎素数是指一组符合以下形式的素数(p, p+2, p+6, p+8),比如5、7、11、13和11、13、17、19都是四胞胎素数。
楼主所要求的四生素数还要符合30n + 11, 30n + 13, 30n + 17, 30n + 19的形式,各素数除以30的余数有一定的规则。如:
11、13、17、19
101, 103, 107, 109
191, 193, 197, 199
821, 823, 827, 829
#43
独木星空2021-10-21 06:57
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\各段四生素数个数.DBF ALIAS 四生个数表
SELECT 3
USE D:\三角递增法\偶数表.DBF ALIAS 偶数表
kssj=SECONDS()
 For i=2 to 2
      @ 5,12 say i
      FOR j=1 TO INT(i/2)
      SELECT 3
      DELETE ALL
      PACK
        SELECT  2     
        GO j
        zgs1=总个数
        fgs1=分个数
        SELECT  2
        GO i-j
        zgs2=总个数
        fgs2=分个数
           SELECT 1
           GO zgs1-fgs1+1
               FOR k1=1  TO  fgs1
               A=四中
               jl=recno()
                 SELECT  1
                 GO zgs2-fgs2+1
                 For k2=1 to fgs2
                 @ 15,22 say k2
                 B=四中
                 C=A+B
                 SELECT 3
                 APPEND BLANK   
                 REPLACE 偶数 WITH C   
                 SELECT 1
                 SKIP
                 ENDFOR
               SELECT 1
               GO jl+1
             ENDFOR
             Select A.* Into Table d:\三角递增法\偶数表升序j From 偶数表 A Inner Join (Select 偶数 From 偶数表 Group By 偶数 Having Count(*)=1) B On A.偶数=B.偶数
       ENDFOR
    ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是今天早晨制作的,不完善,不能应用。
原因就是,当内部主体循环完成后(最里的两层循环,主要是完成偶数表,即任意取两段数据进行组合),紧接着的语句是否可以完成使命,在手工操作时,把那条语句写好后,回撤,即可运行,获得一个新表,而且已经去重,每类偶数只留下一个代表。当第二层循环完,需要对新建的j个表,进行同样处理,即去重,留下唯一,完成后存一个结果表就OK了。最外层循环值,每一次循环都会得到一个处理好的表,里边都是单一记录,没有重复,是2亿区间段,能被合成的偶数,最后在用这些表找到不能合成的偶数即可。
#44
独木星空2021-10-21 07:09
回复 42楼 sdta
对!把第一组归为四生素数的例外,(5,7,11,13),因为它模30的形式,与其他的不同,属于四生素数的特例,不需要考虑它。
     先生有空把我新发的程序补充完善,是它真正的应用起来,即完成最里边两层循环后,把偶数表进行整理,去重复,留唯一;
    再就是,完成第二层循环后,进行同样处理,把已经处理过的j表(偶数表升序j),再进行一次去重留唯一的处理后,进行保存,每一个外循环值,对着一个处理好的结果表就可以了。
    总共运行50次(i=2 to 51),就完成使命了,最后两步,每个外循环,都得完成25次循环。
#45
独木星空2021-10-21 07:35
也就是说,这个问题,可以反其道,而为之,即我们不去找反例,而是统计每个偶数可以有多少种合成方法,把这个对立面解决了。那个问题不攻自破。
#46
独木星空2021-10-21 07:47
设i=2,运行结果出来了,运行时间12分14.47秒,但是所形成的新表不正确,仅有1381个偶数。这个值是不正确的。用前4千多个四生素数中项,做加法运算,一亿范围的散布,不可能就这些偶数,不知道最内两层循环时,没有移动到下一个记录,还是其他原因。
     我点击那个表时,0字节,不能被打开,关闭(vfp)后,才可以打开,有了字节(在关闭后的同时),是丢了数据,还是没有移动指针?我能想到的就这两种情况。
     再就是,新建表如何与第二层的循环值j挂起钩,即j为几,那个处理表就为几(偶数升序表j),是用文本号加&吗?在Excel的公式处理是这样的,需要“=”号吗?
#47
独木星空2021-10-22 00:57
SELECT 1
USE D:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE D:\三角递增法\各段四生素数个数.DBF ALIAS 四生个数表
SELECT 3
USE D:\三角递增法\偶数表.DBF ALIAS 偶数表
kssj=SECONDS()
 For i=2 to 2
      @ 5,12 say i
      FOR j=1 TO INT(i/2)
      SELECT 3
      DELETE ALL
      PACK
        SELECT  2     
        GO j
        zgs1=总个数
        fgs1=分个数
        dimension  arr1[fgs1]
        SELECT 1
        GO zgs1-fgs1+1
        FOR l1=1 TO fgs1
        arr1[l1]=四中
        SELECT 1
        SKIP
        ENDFOR
        
        SELECT  2
        GO i-j
        zgs2=总个数
        fgs2=分个数
        dimension  arr2[fgs2]
        SELECT 1
        GO zgs2-fgs2+1
        FOR l2=1 TO fgs2
        arr2[l2]=四中
        SELECT 1
        SKIP
        ENDFOR
        
     
               FOR k1=1  TO  fgs1
                 For k2=1 to fgs2
                 C=arr1[k1]+arr2[k2]
                 SELECT 3
                 APPEND BLANK   
                 REPLACE 偶数 WITH C   
                 ENDFOR
               ENDFOR
            Select A.* Into Table d:\三角递增法\偶数表升序j From 偶数表 A Inner Join (Select 偶数 From 偶数表 Group By 偶数 Having Count(*)=1) B On A.偶数=B.偶数
       ENDFOR
    ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
用数组代替后,用时7分23.75秒,也不快。所得表数据不正确,只有1381个,估计是把只有一条记录的给挑出来了,而不是去掉重复。
#48
独木星空2021-10-22 11:46
回复 40楼 吹水佬
这个问题,从编程角度考虑不是太难。如果从素数这个知识面来说,也不能说,有多么难,但是对于素数有关的命题来说,就有点难得不像话了,几百年来,哥德巴赫猜想,孪生素数猜想,至今,没有解决,这种纯数学的东西,真的是枯燥无味。没有兴趣,就没有动力。
     说一个类似问题,例如,孪生素数的中项,用两个孪生素数的中项做和,现在考虑的问题,我们把素数对(3,5)去掉,因为它是例外集,不合群,其余的孪生素数对的中项都可以表示成6n的形式,现在问题来了,找那些没有孪生素数对中项和的偶数,它的量比较少,不出1万,就找全了,一共有12个6n类的偶数。不需要分段处理,一次性可完成。
     但是四生素数中项的和,可以合成模210,余数为0,30,90,120,180,这五类偶数,余数60和150,不能被合成,也不需要考虑,只考虑那五类数中的反例,预估算范围在43.5亿后,没有反例,所以我提供了50亿的四生素数表(是用最末的一个素数代表的,如果用中项,让它减4即可),而且安大小顺序排列(升序)。
       如果不划分区间,可能受各方面的限制
#49
吹水佬2021-10-22 12:01
回复 48楼 独木星空
这些是数学家玩的东东。
在这找几个数玩玩还可以,要得出什么结论就不敢想了。
#50
独木星空2021-10-22 12:29
所以把那个四生素数表分成了50段,每段的范围都是1个亿,这样就可以分段处理了,任意两端内的四生素数中项相加,其起止范围是2个亿,也就合成数绝对在2亿区间段,比如最外层循环i=2时,是第一个区间+第一个区间,它们的结果是0-2亿内的值,把重复的去掉保存即可;i=3时,是第一个区间+第二个区间间,它们的值是2亿初--3亿末(2亿的区间段);i=4时,一种组合为:第一个区间+第三个区间,起止值3亿初--4亿末(2亿区间段),第二个区间+第二个区间,3亿初--4亿末;......。每完成一次外循环(即第二层循环完毕),整理一次偶数表,去除重复记录条,留下一个代表值即可,存盘(存一个新文件,保存去重后的偶数表),五十次外循环,保存50个dbf表即可,这些表都是能被合成的偶数,与应该能被合成的偶数比对后,就找到了所有反例。如果有那位大神在43.5亿找到反例了,可以给展现出来,验证它有解无解,还是很容易办到的。
#51
独木星空2021-10-22 12:38
回复 49楼 吹水佬
是数学家们玩的东东,不过用它作为一个素材,练练编程,也不是不可以。我把所用到的表已经传了上来,大致思路也说了下,能不能编写出来程序是回事儿,得到,得不到结论是另一回事。
     以吹水佬版主的编程能力来说,编个这个,还是容易办到的。
     希望吹水佬版主,以最后的编写思路,弄出个程序来。把有解的揪出来即可(反其道而行,不找无解的,找至少有一组解的偶数,也就是,每次加法结果,都去重)。
123456