首页
社区
课程
招聘
[原创]整数分解随笔(四)
发表于: 2015-7-21 19:03 5563

[原创]整数分解随笔(四)

2015-7-21 19:03
5563

本次文中未注明处n≥3,且为奇数。

一、n中因子平方剩余的分布
  1、假设n=ab,b>a>1(a、b不一定是素因子),在[1,n)中可以得到如下包含因子b的数:
    b  2b  3b  ...  (a-1)b
   上述平方剩余序列中求最后一个平方剩余:
         ((a-1)b)^2(mod n)≡(ab-b)^2 (mod n)
                          ≡(-b)^2 (mod n)
                          ≡b^2 (mod n)
     即((a-1))^2≡b^2(mod n),\
     同样可以得到:((a-2)b)^2≡(2b)^2(mod n)
                   .
                   .
     现在来求中间一对数的平方剩余:                  
     n为奇数,n=ab,b>a>1,
     设a=2m+1,代入上式得:
     n=(2m+1)b ->
     n=2mb+b   ->
     n=mb+mb+b ->
     n-(m+1)b=mb    ①
     上式左边的平方剩余为:
     (n-(m+1)b)^2≡((m+1)b)^2 (mod n )  ②
     ∴ 根据①、②得:(mb)^2≡((m+1)b)^2 (mod n )
     
     根据上述我们可以知道,在[1,n)中对于大于(n-1)/2包含b数的平方剩余,可以反映在[1,(n-1)/2]中。
     现在来看一个例:
     299=13*23
     在[1,149]中共有 (13-1)/2=6个23的平方剩余因子
     23  46  69  92  115  138
     7*23=161^2≡138^2 (mod 299)
  2、在上面文中,我们得到了一个新的分解n的方法:
     a^2≡b(mod n),按一定方法配成Aa^2+Ba+C≡0 (mod n),这里设A=1(对于A>1的情况,较复杂,暂不讨论)
     上式变成 a^2+Ba+C≡0 (mod n)  B、C为整数,b=-(Ba+C),两个根为a1、a2(为整数),则可得到:
        (a-a1)(a-a2)≡0 (mod n)
      gcd(a-a1,n)>1 且 gcd(a-a2)>1
      得到n的两个因子,n被分解。在上面讨论中我们知道n=ts,s>t>1,所以该分解必是以较大数s的倍数为中心,来找寻较小数t。
      现在再来讨论c^2≡d^2 (mod n),其中d^2<√n,在[√n]<c≤(n-1)/2中的分布规律及其与a^2≡b(mod n)的关系
      先看例:299=13*23
       49^2≡9 (mod 299)         ->
       (49+3)(49-3)≡0(mod 299)  ->
       52*46≡0 (mod 299)
       gcd(52,299)=13  gcd(46,299)=23

       48^2≡211(mod 299)        ->
       48^2≡-88(mod 299)        ->
       48^2≡-2*48+6(mod 299)    ->
       48^2+2*48-6≡0(mod 299)   ->
       (48+4)(48-2)≡0(mod 299)  ->
       52*46≡0 (mod 299)
       gcd(52,299)=13  gcd(46,299)=23
  
       47^2≡116(mod 299)        ->
       47^2≡-183(mod 299)       ->
       47^2≡-4*47+5(mod 299)    ->
       (47+5)(47-1)≡0 (mod 299) ->
       52*46≡0 (mod 299)
       gcd(52,299)=13  gcd(46,299)=23

       50^2≡108(mod 299)        ->
       50^2≡2*50+8(mod 299)     ->
       50^2-2*50-8≡0(mod 299)   ->
       (50+2)(50-4)≡0(mod 299)  ->
       52*46≡0 (mod 299)
       gcd(52,299)=13  gcd(46,299)=23

       51^2≡209(mod 299)        ->
       51^2≡4*51+5(mod 299)     ->
       51^2-4*51-5≡0(mod 299)   ->
       (51+1)(51-5)≡0(mod 299)  ->
       52*46≡0 (mod 299)
       gcd(52,299)=13  gcd(46,299)=23

       现在讨论为什么是这种情况?
       从c^2≡d^2(mod n),可得(c+d)(c-d)≡0(mod n)
       与(a-a1)(a-a2)≡0(mod n)相同,都是以较大数s的倍数为中心,来找寻较小数t。
       对于(c+d)(c-d)≡0(mod n),可以变化得:
       (c+d)(c-d)≡0(mod n)              ->
       (c+1+d-1)(c+1-(d+1))≡0 (mod n)   ->
       (c+1)^2-2(c+1)-(d^2-1)≡0 (mod n) ->
       (c+1)^2≡2(c+1)+(d^2-1) (mod n)

       (c+d)(c-d)≡0(mod n)              ->
       (c+2+d-2)(c+2-(d+2))≡0 (mod n)   ->
       (c+2)^2-4(c+2)-(d^2-4)≡0 (mod n) ->,
       (c+2)^2≡4(c+i)+(d^2-4) (mod n)
       .
       .
       (c+d)(c-d)≡0(mod n)              ->
       (c+i+d-i)(c+i-(d+i))≡0 (mod n)   ->
       (c+i)^2-2i(c+i)-(d^2-i^2)≡0 (mod n) ->
       (c+i)^2≡2i(c+i)+(d^2-i^2) (mod n)

       c-1 c-2 ... c-i也可以得到同样的结果,这里不再推算,请大家自行推算。
       在整数分解随笔(二)中,已经指出,c^2≡d^2(mod n),都是相差较小因子t的,而c^2≡d^2(mod n)都是分布在较大因子s的周围,即
       s  2s 3s ... ms  其中t=2m+1
       如299,平方剩余中的平方数,是分布在
        23  46 69 92 115 138的周围
       对于提出新分解方法a^2≡b(mod n),进行配方的计算 4中的对称数方法,是在一段范围内查找平方数,而不是只查找一个平方数。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 4
支持
分享
最新回复 (1)
雪    币: 842
活跃值: (487)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
2
二、整数二分分解算法
    如果直接按a^2≡b(mod n)进行配方查找较大因子s,是比较困难的,根据以上的讨论的方法,我们来设计一个整数二分分解算法,同时附上一个程序,供大家参考。
    算法思路:
    根据上述讨论我们知道大数因子s的平方剩余按小数因子t中的m分布在[1.(n-1)/2]范围内,又根据对称数原理,在[k,(n-1)/2]也可以在[1,k]进行计算。k值是已知的,所以在[1,k]先划分为个f段,f一般是2^h(h>0),而大数因子s及s的倍数(或对称数)的平方剩余必然位于f段中,在每一段中按a^2≡b(mod n)进行计算,未找到时,分子、分母乘2,折半进行查找,每一段用一台电脑(或一组电脑)或一个进程(或多个进程)进行计算(当n很大时),每一段计算的范围为如下:
    第一段:  k/f~2k/f
    第二段:  2k/f~3k/f
    第三段:  3k/f~4k/f
    ...
    第f-1段:(f-1)k/f~k
   
    因为是随机性的划分,当折半到一定范围时,就能找到n的因子。现举例来说明(具体可以参考所附程序)
    比如 f=8(分母),共分为7段
    第一段:  k/8~2k/8
    第二段:  2k/8~3k/8
    第三段:  3k/8~4k/8
    第四段:  4k/8~5k/8
    第五段:  5k/8~6k/8
    第六段:  6k/8~7k/8
    第七段:  7k/8~k
   
    第五段折半计算:  第五段范围:5k/8~6k/8
    1  计算5k/8及对称数值的平方剩余,按a^2≡b(mod n)进行计算,找到返回,未找到,分子、分母同时乘2得到如下:(6k/8属于另一段,不在该段计算,仅作比较用)
    2  范围变成:10k/16~12k/16,该范围内,计算11k/16及对称数值的平方剩余,按a^2≡b(mod n)进行计算,找到返回,未找到,分子、分母同时再乘2得到如下:
    3  范围变成:20k/32~24k/32,该范围内,计算21k/32、23k/32及对称数值的平方剩余,每个值按a^2≡b(mod n)进行计算,找到返回,未找到,分子、分母同时再乘2得到如下:
    4  范围变成:40k/64~48k/64,该范围内,计算41k/64、43k/64、45k/64、47k/64及对称数值的平方剩余,每个值按a^2≡b(mod n)进行计算,找到返回,未找到,分子、分母同时再乘2得到如下:
    5  范围变成:80k/128~96k/128,该范围内,计算81k/128、83k/128、85k/128、87k/128、89k/128、91k/128、93k/128、95k/128及对称数值的平方剩余,每个值按a^2≡b(mod n)进行计算,找到返回,未找到,分子、分母同时再乘2得到如下:
      .
      .
      .
    直到设定的一个最大值MAX为止,则在该段未找到因子。其它段也是同样计算。
    以上就是整数的二分分解法,该方法是电脑越多,分段f值越大,分解越快。
    该种方法当然还有不足之处,希望大家提出改进意见和建议,本人十分感谢!
上传的附件:
2015-7-21 19:07
0
游客
登录 | 注册 方可回帖
返回
//