| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10791 人关注过本帖
标题:优化程序或者从新编写求四生素数中项不能合成的偶数
只看楼主 加入收藏
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 40楼 吹水佬
或许吧!对于素数这个大熔炉,它会有好多素材,供人们练习编程。这里有一个问题就是,兴趣是最好的老师。本主题,在对它了解以前,或许也想不到很好的方法。
     撇开与素数有关的不谈,因为一时半会,还真说不清楚。但是此问题作为编程素材,还是可以讲得很清楚的,我上传了四生素数表,可以不去管它,就认为是一种具有某特征的奇数就好,安大小排列,然后就是从中任意取两个数做和,即进行加法运算,比会得到一个确切值,这些值可以分成五大类,合成数,即两个数相加,模210,一定是余数0,30,90,120,180;绝对不会出现模210,余数是60或者150的情况。也就是说,假设以210为周期,这个周期内最多可以合成5个数,其余的不管是不是偶数,都不可能被合成,奇数就不用考虑了。
     那么,现在的问题是把小范围内的反例找出来,即从理论上能被合成的数,实际上并没有解的偶数,预估算,大于43.5亿后不在有反例出现。所以提供了50亿内的四生素数表(说是四生素数表,只是表中每一组四生素数是用最后一个素数代替的,其余素数也不用考虑进去,如果用整个四生素数,是比加大难度和运算量,用代表就可以完成使命)。四生素数,如(11,13,17,19)第一组,表中以19代替本组,中项就是19-4=15,只考虑两个中项和的结果。

素数问题的解决是我学习编程永恒的动力。
2021-10-21 05:47
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
四生素数一般指四胞胎素数。
四胞胎素数是指一组符合以下形式的素数(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

坚守VFP最后的阵地
2021-10-21 06:46
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
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亿区间段,能被合成的偶数,最后在用这些表找到不能合成的偶数即可。

素数问题的解决是我学习编程永恒的动力。
2021-10-21 06:57
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 42楼 sdta
对!把第一组归为四生素数的例外,(5,7,11,13),因为它模30的形式,与其他的不同,属于四生素数的特例,不需要考虑它。
     先生有空把我新发的程序补充完善,是它真正的应用起来,即完成最里边两层循环后,把偶数表进行整理,去重复,留唯一;
    再就是,完成第二层循环后,进行同样处理,把已经处理过的j表(偶数表升序j),再进行一次去重留唯一的处理后,进行保存,每一个外循环值,对着一个处理好的结果表就可以了。
    总共运行50次(i=2 to 51),就完成使命了,最后两步,每个外循环,都得完成25次循环。

素数问题的解决是我学习编程永恒的动力。
2021-10-21 07:09
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
也就是说,这个问题,可以反其道,而为之,即我们不去找反例,而是统计每个偶数可以有多少种合成方法,把这个对立面解决了。那个问题不攻自破。

素数问题的解决是我学习编程永恒的动力。
2021-10-21 07:35
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
设i=2,运行结果出来了,运行时间12分14.47秒,但是所形成的新表不正确,仅有1381个偶数。这个值是不正确的。用前4千多个四生素数中项,做加法运算,一亿范围的散布,不可能就这些偶数,不知道最内两层循环时,没有移动到下一个记录,还是其他原因。
     我点击那个表时,0字节,不能被打开,关闭(vfp)后,才可以打开,有了字节(在关闭后的同时),是丢了数据,还是没有移动指针?我能想到的就这两种情况。
     再就是,新建表如何与第二层的循环值j挂起钩,即j为几,那个处理表就为几(偶数升序表j),是用文本号加&吗?在Excel的公式处理是这样的,需要“=”号吗?

素数问题的解决是我学习编程永恒的动力。
2021-10-21 07:47
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
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个,估计是把只有一条记录的给挑出来了,而不是去掉重复。

素数问题的解决是我学习编程永恒的动力。
2021-10-22 00:57
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 40楼 吹水佬
这个问题,从编程角度考虑不是太难。如果从素数这个知识面来说,也不能说,有多么难,但是对于素数有关的命题来说,就有点难得不像话了,几百年来,哥德巴赫猜想,孪生素数猜想,至今,没有解决,这种纯数学的东西,真的是枯燥无味。没有兴趣,就没有动力。
     说一个类似问题,例如,孪生素数的中项,用两个孪生素数的中项做和,现在考虑的问题,我们把素数对(3,5)去掉,因为它是例外集,不合群,其余的孪生素数对的中项都可以表示成6n的形式,现在问题来了,找那些没有孪生素数对中项和的偶数,它的量比较少,不出1万,就找全了,一共有12个6n类的偶数。不需要分段处理,一次性可完成。
     但是四生素数中项的和,可以合成模210,余数为0,30,90,120,180,这五类偶数,余数60和150,不能被合成,也不需要考虑,只考虑那五类数中的反例,预估算范围在43.5亿后,没有反例,所以我提供了50亿的四生素数表(是用最末的一个素数代表的,如果用中项,让它减4即可),而且安大小顺序排列(升序)。
       如果不划分区间,可能受各方面的限制

素数问题的解决是我学习编程永恒的动力。
2021-10-22 11:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
回复 48楼 独木星空
这些是数学家玩的东东。
在这找几个数玩玩还可以,要得出什么结论就不敢想了。
2021-10-22 12:01
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
所以把那个四生素数表分成了50段,每段的范围都是1个亿,这样就可以分段处理了,任意两端内的四生素数中项相加,其起止范围是2个亿,也就合成数绝对在2亿区间段,比如最外层循环i=2时,是第一个区间+第一个区间,它们的结果是0-2亿内的值,把重复的去掉保存即可;i=3时,是第一个区间+第二个区间间,它们的值是2亿初--3亿末(2亿的区间段);i=4时,一种组合为:第一个区间+第三个区间,起止值3亿初--4亿末(2亿区间段),第二个区间+第二个区间,3亿初--4亿末;......。每完成一次外循环(即第二层循环完毕),整理一次偶数表,去除重复记录条,留下一个代表值即可,存盘(存一个新文件,保存去重后的偶数表),五十次外循环,保存50个dbf表即可,这些表都是能被合成的偶数,与应该能被合成的偶数比对后,就找到了所有反例。如果有那位大神在43.5亿找到反例了,可以给展现出来,验证它有解无解,还是很容易办到的。

素数问题的解决是我学习编程永恒的动力。
2021-10-22 12:29
快速回复:优化程序或者从新编写求四生素数中项不能合成的偶数
数据加载中...
 
   



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

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