前言:
不要剽竊,否則後果會很嚴重!
請尊重勞動成果,引用或者借鑑本文時標明出處,謝謝!
開啟百度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日於荷塘