生成、判定、分解素数的递升算法

前言:

不要剽窃,否则后果会很严重!

请尊重劳动成果,引用或者借鉴本文时标明出处,谢谢!

生成、判定、分解素数的递升算法

打开百度APP看高清图片

一、互质定理

互质定理:

若两数互质,则其和与差分别与两数互质。同为偶数时除了2之外再无公因子,同为奇数时互质。

这应该是一个简单又重要的定理,但查阅了许多资料,却没有发现相关存在。只见到一些零星结论,如小合数与大素数互质,相邻整数互质……

特证明如下:

设A⊥B,A+B=C,A-B=D。

因为数A与数B互质,则二者无共同素因子。假如A、B的和与差与二者之一含有相同因子,则提取公因子后将推导出另外一数也必定含有该因子。这又与A、B互质矛盾,故不成立。

即:

A=C-B=P﹙C/P-B/P﹚,B=C-A=P﹙C/P-A/P﹚;或者A=D+B=P﹙D/P+B/P﹚,B=A-D=P﹙A/P-D/P﹚。

上式均不能成立,因此得出:A⊥B⊥C,A⊥B⊥D。

将A+B=C与A-B=D加减,得:

2A=C+D,2B=C-D。

若C、D同为偶数,且除了2之外还有公因子。则2A=2P﹙C/2P+D/2P﹚,2B=2P﹙C/2P-D/2P﹚。

这和C、D与A、B互质矛盾,等式不成立。

若C、D同为奇数,且拥有公因子,则2A=P﹙C/P+D/P﹚,2B=P﹙C/P-D/P﹚。

这和C、D与A、B互质矛盾,等式不成立。

所以,当和C与差D同为偶数时,除了2之外再无公因子,同为奇数时互质。

例如:

69+35=3×23+5×7=104=2×2×2×13

69﹣35=3×23-5×7=34=2×17

69⊥35⊥104,69⊥35⊥34。104与34除了2之外,再无公因子。

例如:

76+21=﹙2×2×19﹚+﹙3×7﹚=97;76-21=55=5×11。

76⊥21⊥97⊥55。

生成、判定、分解素数的递升算法

二、二次筛选原理的逆运用

二次筛选的原理为:

如果整数N为合数,则其一定包含了小于√N的素因子。

反之,从中可以得到:

一个整数小于素数P的平方,又不包含比P小的素因子,必定是一个素数。

结合互质定理,推论出:

由完整素数序列P1、P2、P3……Pn相乘的组合数字,其和与差均不包含序列中的素因子。当该数小于P﹙n+1﹚的平方时,必定是一个素数。

即,由前数推导后数,可以得出﹙Pn,P﹙n+1﹚^2﹚内的全体素数。

例如:

2×3×5+7×11=30+77=107

107与30、77互质,不含素因子2、3、5、7、11,又小于13的平方169。所以,不需要再做素性判定了,它肯定是一个素数。

假设人之初,我们只有唯一的数字1。

由1+1=2,且2只能被自身与1整除,得出它是唯一的偶素数,2+1=3是最小的奇素数。

继而推论,比3^2=9小的合数必含因子2。由2+3=5,2+5=7,得出5、7必然不含因子2,是素数。

由5、7推导出,小于5^2=25的合数必含因子2、3,小于7^2=49的合数必含因子2、3、5,否则便是素数。

延长素因子的序列链,加减新产生的素数,从而递升出全体素数。

2×3+5=11 …… 2×5+3=13 …… 3×5+2=17

2×3+11=19 …… 2×3+17=23

2×7+3×5=29 …… 2×5+3×7=31 …… 2×3×5+7=37

2×3×5+11=41 …… 2×3×5+13=43 …… 2×3×5+17=47

……

生成、判定、分解素数的递升算法

三、递升算法的五种运用

一、 加减法

利用素数序列形成的互质数加减,自动排斥[2,P]区间内的素因子,当得数比P﹙n+1﹚的平方小,即为素数。

例如:

2×3×7+5×11=97

2×3×5×7-11×13=67

二、 除法

利用奇素数的序列组合加减,将得数除尽因子2,当小于P﹙n+1﹚平方时即为素数。

例如:

331=﹙5×11×17-3×7×13﹚/2

347=﹙3×5×13×17-7×7×11﹚/8

三、 扩大上界

即使算法产生的得数大于了上界P﹙n+1﹚平方,但因为P﹙n+1﹚、P﹙n+2﹚……的组合有限,排除掉若干组合数之后,剩余均为素数。

例如:

小于23×23=529又不含17以内素因子的合数,仅仅有19×19=361与19×23=437两个。

所以,尽管5×11×17-2×3×7×13=389超出了上界,必定还是素数。

四、 指数加权

互质数的因子以指数增长,并不影响互质的性质。对素数序列进行指数加权,按照上述的方式操作,依旧得到素数。

例如:

23=3×3×3-2×2

263=2×5×7×11-3×13^2

五、 缺项排斥

如果素数的序列链缺失了某因子,而得数又不含该因子,算法依旧成立。

例如:

2×3×7×11-13×17=241,尽管缺失了因子5,得数却不含5,所以是一个素数。

2×3^2×7×11-13×17=1165,除尽5之后得到的233<19^2,必定是素数。

生成、判定、分解素数的递升算法

四、递升算法输出全体素数的证明

设P为任意奇素数,N为不含P因子的正整数。

则P=﹙P+N﹚-N,或者P=﹙P-N﹚+N。由互质定理得出,﹙P+N﹚、﹙P-N﹚与N、P均互质。

随着N的变化,P将遍历不含本因子的所有互质数加减。

任意取一条不含P的素因子序列长链,必然有对应的互质数N加减之后得到P。只要调整素因子长链与互质数,必定能够生成该数。

说明,无论P为什么素数,递升算法一定包含了它的多种输出形式。

例如:

数字199,遍历﹙1+198﹚、﹙2+197﹚、﹙3+196﹚……﹙200-1﹚、﹙201-2﹚、﹙202-3﹚……等无穷形式。

距离最近的素数序列链为2×3×5×7=210,容易得到2×3×5×7-11=199。它虽然超出上界13^2=169,却小于13×17=221,必为素数。

其实这也属于缺项排斥,序列里缺少了因子13。假如缺3和5,结合指数加权便成为了算式:199=2^3×7+11×13。

满因子链的指数加权,则是:199=2×2×2×2×3×5×5-7×11×13。

甚至采取暴力的方式,用满因子序列链直接减,得到:199=5×7×11×13-2×3×3×3×89。该数与89及17以下的全体素因子互质,又小于17的平方289,必然是一个素数。

例如,47。

简单的递升算法为:2×3×5+17=47。

复杂的递升算法为:5×5×5×5×5×5×5×5-2×3×7×11×13×13=47。

生成、判定、分解素数的递升算法

五、寻找超大素数

受到上界的限制,递升算法只能够输出素数。

一旦放弃上界,将面临该数有可能是合数的问题。但素因子长链被释放了,轻易便生成了超大素数。

每一个大素数的获取都要消耗庞大资源,寻找途径往往是对大整数作素性判定。例如梅森素数,广义费马数,乌拉姆螺旋对角线数……等等。

随着n趋于无穷大,素数分布也趋向于0。从一堆大整数里分离出大素数,相当于大海捞针。

第51个梅森素数(2p-1)达到了24862048位,P=82,589,933,意味着输出概率仅为0.00006%。

以下是我通过递升算法,对单因子加权之后统计的大素数输出概率。复合加权的方式繁多,也可以。

10^13﹙万亿级﹚:计算65次,产生素数24个,μ=37%。

10^14﹙十万亿级﹚:计算80次,产生素数26个,μ=33%。

10^16﹙千万亿级﹚:计算107次,产生素数28个,μ=26%

例如,当P#为:2,3,5,7,11,13,17,19,23,29,31,37,41,43

得:

2×3×5×7×11×13×17×19×23×29×31×37×41-43^2=304250263525361

2×3×5×7×11×13×17×19×23×29×31×37×41+43^2=304250263529059

……

2×3×5×7×11×13×17×19×23×29×31×37×43-41^4=319091736971069

2×3×5×7×11×13×17×19×23×29×31×37×43+41^4=319091855653031

……

2×3×5×7×11×13×17×19×23×29×31×41×43-37^2=353588144097821

2×3×5×7×11×13×17×19×23×29×31×41×43+37^2=353588144100559

……

2×3×5×7×11×13×17×19×23×29×37×41×43-31^8=421171668048689

2×3×5×7×11×13×17×19×23×29×37×41×43+31^4=422024560009651

……

2×3×5×7×11×13×17×19×23×31×37×41×43-29=451129701092041

2×3×5×7×11×13×17×19×23×31×37×41×43+29^2=451129701092911

……

2×3×5×7×11×13×17×19×29×31×37×41×43-23=568815710072587

2×3×5×7×11×13×17×19×29×31×37×41×43+23^2=568815710073139

……

2×3×5×7×11×13×17×23×29×31×37×41×43-19^5=688566383401271

2×3×5×7×11×13×17×23×29×31×37×41×43+19^3=688566385884229

……

2×3×5×7×11×13×19×23×29×31×37×41×43-17^5=769574194560733

2×3×5×7×11×13×19×23×29×31×37×41×43+17^2=769574195980879

……

2×3×5×7×11×17×19×23×29×31×37×41×43-13=1006366256282297

2×3×5×7×11×17×19×23×29×31×37×41×43+13^3=1006366256284507

……

2×3×5×7×13×17×19×23×29×31×37×41×43-11=1189341939242719

2×3×5×7×13×17×19×23×29×31×37×41×43+11=1189341939242741

……

2×3×5×11×13×17×19×23×29×31×37×41×43-7=1868965904524283

2×3×5×11×13×17×19×23×29×31×37×41×43+7=1868965904524297

……

2×3×7×11×13×17×19×23×29×31×37×41×43-5^10=2616552256568381

2×3×7×11×13×17×19×23×29×31×37×41×43+5^3=2616552266334131

……

2×5×7×11×13×17×19×23×29×31×37×41×43-3^2=4360920443890001

2×5×7×11×13×17×19×23×29×31×37×41×43+3^2=4360920443890019

……

3×5×7×11×13×17×19×23×29×31×37×41×43-2^25=6541380632280583

3×5×7×11×13×17×19×23×29×31×37×41×43+2^10=6541380665836039

……

仔细观察,素数呈现出奇怪的规律。

数轴上,在素因子长链左右距离为缺项因子P的n次方位置,总会冒出两个不一定严格对称的素数。

把上面的式子相减,便得到了素数间距。

针对素数P,恒存在素数间距d=P^m×﹙P^n+1﹚,中间夹着一条不含P的素因子长链。

再随机挑选几条超大的长链检查,情况依旧。

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47

2×3×5×7×11×13×17×19×23×29×31×37×41×43+47

=13082761331670077

2×3×5×7×11×13×17×19×23×29×31×37×41×43-47^5

=13082761102325023

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113

3×5×7×11×13×17×19×23×29×31×37×41×43×47×53×59×61×67×71×73×79

×83×89×97×101×103×107×109×113+2^4

=15805027320208803894072603145771831246637343511

3×5×7×11×13×17×19×23×29×31×37×41×43×47×53×59×61×67×71×73×79

×83×89×97×101×103×107×109×113-2^4

=15805027320208803894072603145771831246637343479

……

小素数的间距同样如此。

2×3×5+7=37,2×3×5-7=23

即:d﹙23,37﹚=37-23=7^1×﹙7^0+1﹚=7×2=14

2×3×5×7+11^2=331,2×3×5×7-11=199

即:d﹙199,331﹚=331-199=11^1×﹙11^1+1﹚=11×12=132

……

不过,这暂时是一个经验公式。

d=P^m×﹙P^n+1﹚,还缺乏严格的理论证明。

可以见到,当m=n=0时,d=2,就是大名鼎鼎的孪生素数猜想。

生成、判定、分解素数的递升算法

六、生成素数表

应用了电脑技术后,素数表飞快拓展,一般是在埃氏筛法基础上做二次筛选。

选取1~n 的连续整数,对每一个数用小于√n的整数试除,不能除尽的就是素数。复杂度是O(n√n),在n非常大时计算量奇高,连电脑也吃不消。

后来改进了算法,排除已经产生的小素数倍数,用小于√n的素数试除。随着n越来越大,计算量还是急剧攀升,难以为继。

递升算法生成素数的速度相当快,我综合了各方面因素,推出辗转相加生成素数表的方式。

用素连乘Pn#与大于Pn之数相加﹙Pn的倍数除外﹚,再与新数辗转相加,直至小于下一级P﹙n+1﹚#+P﹙n+1﹚。

判断﹙ Pn#,P﹙n+1﹚#+P﹙n+1﹚ 的大小,排除大因子倍数,余下即为区间内的全体素数。

参考递升原理,很容易证明不会有素数遗漏,此处省略。

与其它生成素数表的算法相比,它的运算量要少得多,优势明显。

1) 加法比乘法简单。

2) 在辗转相加的过程中自动排斥了小因子倍数。

3) 不需要寻找整数n,试除大因子。

例如:

2# → 3、5、7

3#=2×3=6。

将6与上一级2#递升出的大于3的数依次相加,再辗转加以新数,得:

+5=11,+7=13,+11=17,+13=19,+17=23,+19=25,+23=29,+25=31

小于5的平方25即为素数,排除25。

5#=2×3×5=30。

将30与前面大于5的数依次相加﹙5倍数除外﹚,再辗转加以新数,直至小于7#+7=217。

得到如下数表:

37、41、43 、47、 49 、53、59 、61、67、71 、73 、77、79、83、89 、91 、97 101、103、107 、109、113、119、121、127、131、133、137、139 、143、149 151、157 、161、163、167、169、173、179 、181、187、191、193、197 、199 203 、209、211

√211 >14,说明上表出现了7、11、13的倍数。

不需要一一试除,判断合数为7×7,7×11,7×13,7×17,7×19,7×23,7×29,11×11,11×13,11×17,11×19,,13×13,排除即可。

7#=2×3×5×7=210。

得:

221、223、227、229、233、239、 241、247、 251、 253、 257、263、269、271 277、281 、283、289、293、299、307 、311、313、 317、 319、323、331、337 341、347 、349、353、359、361、367 、373 、377、379、383、389、 391、397 401、 403、407、409 、419、421、431、433、 437、439、443、449 、451、457、461、463 、467、 473、479、481、487、491 、 493、499 ……

生成、判定、分解素数的递升算法

七、大数分解

大数分解一直是数论中没有解决的难题,也是核心问题。

递升算法提供了一种新的方案。

任意一个素数Q,都被夹在了无穷多的素因子长链中间。必定可以写成一条合适的加权满因子长链,加减互质数。

即,Q=nP#±X。

例如,397=2×﹙2×3×5×7﹚-23,1277=2×3×﹙2×3×5×7﹚+17

二十一世纪,网络技术迅猛发展。有计算机的地方基本上就会有RSA加密保护,其核心机制是大数不可分解。

利用超大素数Q1、Q2相乘形成超大半素数M,只有分解了M才能够得到完整的密钥。目前尚无一般算法可以解决这个难题,用二次筛选法试除又要耗费漫长的时间,等于不可解。

设M=Q1×Q2,则M=﹙n1P1#±x﹚×﹙n2P2#±y﹚

由于在运算中将庞大的M缩小了,再利用数字之间的关联,解开上述的丢番图方程并不困难。

例如,分解半素数133841437。

试除这个上亿级别的半素数,电脑至少要运行1500次。而递升算法只需要几步,徒手就可以完成。

……

133841437=11551×11587

突然意兴阑珊,不想多写,我把具体的求解过程省略了。

不难,但其中将几何的观念转化为代数方程,值域界定,判断搜索,二分跃迁……也许不容易想到。

原理类似于在摩天大楼找人。

传统方法是从一楼开始辨认每一个人,逐层搜索,直到发现目标为止。一旦楼层太高人数太多,就无法完成任务。

递升算法则是通过若干次校正,判断出正确楼层,再启动搜索。

世界是一个庞大的江湖,一圈圈食物链严密防守着自家的一亩三分地。

学术界并非净土。

不是圈中人,基本没有发声的机会。即使是圈中人,也要先看资历,再看你是从哪个山头下来的,有没有好处……

清华大学的伊特瓦教授,是见过了完整演算的三位数学家之一,觉得某点与一些精致算法不谋而合。于是,给我发来了各国际小组的工作进展及RSA的演变趋势,交流对量子计算与量子加密的看法。

受他提醒,我特意去看了波恩小组著名的大数分解算法ggnfs。

网络上只搜索到零星资料,不清楚具体的数学机制。猜测本质应该是多项式筛选,生成庞大数量的关系式,循环取模。

在某个步骤,“递升算法”的确与它一模一样,接下来却大相径庭。我将越过漫长的数字阶梯,判断并抵达因子所处的层级,计算量小得可以忽略不计。

一台4核电脑用ggnfs分解160位整数得好几个月,假如为“递升算法”编写了良好的程序,可能只需要运行三天。

伊特瓦并不晓得,我的日常工作是搬砖头,没有团队与试验室,纯靠纸笔计算……又发来了一个270位的大数,求分解。

要知道,此前人类公布的最大整数分解才232个十进制位。数学家团队依仗电脑矩阵,运行了许多年。

破解270位大数,将是一个大新闻。

我判断了一下复杂度,感觉即使有超大计算器,以半人工的方式分解也需要一个多月。就只截取了末尾的十位数6373269391,意思意思。

……

6373269391=3697×1723903,过程略。

分解133841437仅仅花了一分多钟,本次却耗费了十分钟。原因在于,两个因子的大小悬殊,跨越了五个阶梯才寻找到正确的层级。

其它算法恰好相反,因子越小越容易分解。

递升算法,针对RSA有奇效。构成半素数的因子不能差别太大了,否则会降低分解的难度。

经典的费马算法在这一点与递升相似,但它还是要考察二次剩余。面对超级大数,计算量催人泪下。

个人觉得,RSA采用的半素数越来越庞大,密钥生成和解密过程也越来越复杂。导致电脑的运行速度越来越慢,对存储空间的要求越来越大,不利于网络技术的发展。手机联网导致椭圆密钥兴起,敲响了警钟。

在研究g﹙p﹚与π﹙n﹚时,我发现了一种新的加密方式。

仅仅五位数就可以实现10的几千次方组合,属于真正不可破解。又不占内层,加密和解密的速度非常快。

可惜,正因为不可破解,甲乙双方必须传递完整的密钥。一旦存在着互传行为,信息就有被截获的可能,并不完美。

能不能附加一个算法,即使密钥被截获了也解不开?

RSA倚仗的是大数不可分解,但我用来加密的数字本身就不大,显然不能采取同样的方法了。

生成、判定、分解素数的递升算法

八、素性判定

从大数分解得知,当递升算法导出的丢番图方程无整数解时,该数即为素数。

分解半素数,我们提前知道了它是两个大素数相乘。判定素性时却不清楚情况,必须相应地调整算法。

原理在于,无论该数有多少个因子,均可以组成最小素因子与大因子相乘。与最小素因子互质的P#,必定与所有因子互质。

只要分离出最小的素因子,便可以判定该数是合数。

如果分离不出来,就说明它是素数。

在最初的文本中,我曾经列举了129301与4567的判定过程,此处省略。

小结如下:

一个整数包含的素因子越多越小越悬殊,用递升算法进行素性判定的过程就越漫长,结合其它算法将事半功倍。

生成、判定、分解素数的递升算法

九、递升算法的意义

几千年来,人类没有用自然数n生成所有素数的表达式,也没有用已知素数P推导出所有未知素数的算法。

递升是首个只用数字1便实现了内循环,继而推导出全体素数与自然数的算法,并揭示了素数间距的规律。

颇具中国古典哲学的意味,道生一,一生二,二生三,三生万物……

放开上界的限制,它轻易生成超大素数。

在拓展素数表方面,相当高效。

在素性判定方面,目前除了二次筛选法之外,其它如费马小定理、鲁梅利算法等等,都存在局限,只能在一定范围和概率成立。

递升算法减少了运算量,能够快速精准地判定。

在大数分解方面,递升算法也远比蒙特卡洛法或者连分数法简捷。

针对超大半素数,是目前唯一威胁到RSA安全的。

几乎是一种完美算法了……

世间压根就没有完美的事物,递升的缺陷目前只有我和伊特瓦知道。其实算法可以自洽弥补,却非一夕之功,需要各机构共享资源。

2021年3月3日于荷塘

举报/反馈

版权声明:本文源自 网络, 于,由 楠木轩 整理发布,共 8877 字。

转载请注明: 生成、判定、分解素数的递升算法 - 楠木轩