注册 登录
编程论坛 VFP论坛

用删除法编写一个制作素数表的vfp程序

独木星空 发布于 2021-09-13 21:47, 12492 次点击
标记法主题思路,标记法是把符合条件的标记为假flase,而不符合条件的标记为真,在vfp中是这样实现这个过程的,先用
本轮参与运算的,求出最大开方值,然后查出所在记录条位置,由此记录条作为筛选循环总次数,第一次现由源数据,加周
期值9699690(即2*3*5*7*11*13*17*19=9699690,一次性调入1658880个数据(就这些需要判断是否为素数,其余的已经被排
除掉了)。有了循环次数,有了被筛选数据,进入主要循环体,先调入第一个素数,划掉其倍数,其余的存入数据b(从数据
源先调入数据a),然后调入第二个素数,排查数据b中符合条件的,剩余的存入数据a(当然每次存数据以前,要把数据表先
清空),循环往始,直到调入最后一个素数为止。然后把最后存的数据,抄写到素数结果表。
进入下一批数据调入,即把数据源加一个周期值9699690,先判断开方值,把小于等于开方值的记录条作为本次的素数调入个
数的依据(即本次的排查次数),进入同样的循环,获得结果,抄写到素数结果表。直到全部周期结束为止。
外循环为周期数,内循环为开方值记录条数减去素数19前的个数8,比方开放值以内有1000个素数,则内主体循环次数为:
1000-8=992次,当然随着循环周期的扩大,内循环次数增多。内循环单次,需要判断值逐步减少,例如第一次调入1658880个
值,大概有1658880/23=72125数被去掉,1658880-72125=1586755/29=54715数被筛掉,这样下去,越往后被判断数越少。所以
成倒排三角形数据量。把最后剩余的数据存放在素数结果表中即可。
外循环步长9699690,即一次性可以判断这样的自然数段。
最原始的筛法,一个一个的去判断,筛除,也就是都在重复同一项工作,效率低下;而这种算法是一次性调入一个批次的数据(这个批次是一个自然数段落,一个递增周期),是众数,不是一个一个的来,而是一同进入,然后第一次就排除了,最多的数据(因为小素数先参与排查,根据几率均等原则,它的倍数最多)。
157 回复
#152
独木星空2021-10-24 15:44
介绍孪生素数对的生成元,目的是,把那种方法可以运用到孪生素数筛选,同样是做个自己满义的筛子,然后在处理,这时判断一个数,是否为孪生素数对中的末素数,需要排除两个余数,0和2,即筛选时,把余数是0,或者2,都被筛除掉,只留下那些不是余数0或2的数。
    说白了,无论是几生素数,只要筛除掉所占余数类,剩余不被占用的余数即可。都是做个差不多大的筛子,而不是一个一个的去筛选,判断;都是成批的筛选,一次性,就解决一个外循环内的全部数,是否为素数(孪生素数对中的末素),三生素数(0,2,6)或者(0,4,6),三生素数过每个素数关卡时,都是去掉三类余数(是其中之一就被筛除掉)。
   一直扩展到k生素数,去掉k类余数。
5生素数,去掉5类余数,素数3,素数5如何去(大于素数5的素数能想明白),例如5生素数(0,2,6,8,12),素数的余数0,2被占用,只有余数1可取;对于素数5来说,余数0,2,1,3都被占用,只有余数4可取;素数7,余数0,2,6,1,5被占用,只有余数3或4可取。实际上,做筛子时,这些问题已经解决,一般不用小素数参与,它们已经参与过了,筛子就是它们制作出来的。就说5生素数吧,最大的一个余数是12,所以把筛子做到素数13的阶乘即可(2*3*5*7*11*13=30030),而实际筛子远比它大,或许到223092870(2*3*5*7*11*13*17*19*23),即一次外循环就可以解决2亿多个数,是否为k生素数(只是k生素数的代表值,末素数,不是整个k生素数,例如孪生素数对,用7,13,19,31代表那四组素数对)。
#153
独木星空2021-10-24 15:48
所以说,如果算法,用到数据源表,及素数表时,能稍作变动,就可以制作二生素数,三生素数,四生素数,5生素数,k生素数了,只是把排除一个余数,上升到,排除2类余数,3类余数,4类余数而已。
    所以不用素数表,和数据源表,就不能解决此类问题(制作k生素数表)。
#154
独木星空2021-10-24 15:54
第一点,来到这个网上,其目的就是相互交流,互动,交换意见,和各自的看法。有时,并不是都有时间,我在工作之余,才上网的,上网时大部分精力也是集中在自己想要解决的问题上,或许也顾不上太多,就会出现没有及时回答,网友所存在的疑问。
#155
独木星空2021-10-24 16:00
对于第二点:我在Vb6上发的帖子,目的是看一看vb6的样貌,因为我是不就前,在静夜思管理员给提供的连接中,下载的vb6,对它一窍不通,我可以通过对比(与vfp),尽快的进入其门。变通没有关联。目的就是学习vb6。
#156
独木星空2021-10-24 16:06
在这个问题上:laowan001的算法可行,用四生素数的数据源表,和素数表,把原来的只去掉余数0的条件,改成去掉余数0,2,6,8的条件就获得了,4生素数;改成去掉余数0,2,6的就得到3生素数中的一种3生素数;去掉余数0,2,就可以得到孪生素数对。.....
    各种k生素数的数据源表,只要想用的,在本主题内可以说一下,我压缩后发出。素数表谁都会制作,就免了。
#157
独木星空2021-10-24 16:10
本题总括成一句话,就是用大筛子,筛选各种k生素数。算法要针对一个外循环,成批处理,不要把大筛子中的数,一个一个的去处理,那样很慢,拖泥又带水。筛子的目的,就是提前处理,轻装上阵。
#158
独木星空2021-10-25 05:30
无论你怎么说,只要妨碍不到他人,是没有人吱声的,只有自己,自导自演。
1234