前言:
不要剽窃,否则后果会很严重!
请尊重劳动成果,引用或者借鉴本文时标明出处,谢谢!
打开百度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日于荷塘