生成、判定、分解素數的遞升演算法

前言:

不要剽竊,否則後果會很嚴重!

請尊重勞動成果,引用或者借鑑本文時標明出處,謝謝!

生成、判定、分解素數的遞升演算法

開啟百度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 字。

轉載請註明: 生成、判定、分解素數的遞升演算法 - 楠木軒