大整数分解因子算法——Dixon的随机平方算法

大整数分解因子算法——Dixon的随机平方算法

许多分解因子算法的理论依据是这样的事实:

假设我们可以找到 x ≢ ± y ( m o d n ) x\not\equiv \pm y\pmod{n} x±y(modn),但是有 x 2 ≡ y 2 ( m o d n ) x^{2}\equiv y^{2}\pmod{n} x2y2(modn)。那么有
n ∣ ( x − y ) ( x + y ) n|(x-y)(x+y) n(xy)(x+y)
但是 n ∤ ( x + y ) n\nmid (x+y) n(x+y) n ∤ ( x − y ) n\nmid (x-y) n(xy),所以 g c d ( x + y , n ) gcd(x+y,n) gcd(x+y,n) g c d ( x − y , n ) gcd(x-y,n) gcd(xy,n)都是 n n n的非平凡因子。

Dixon的随机平方算法也是利用这个事实进行设计的。

算法思想

我们先描述出随机平方算法的大致全貌,再分点详细讨论细节问题。

  1. 假设我们事先找到一个集合 B B B称为因子基, B B B中包含了 b b b个最小的素数( b b b是适当选取的一个数);
  2. 我们通过某种方法得到了若干个整数 z z z,使得 z 2 m o d    n z^{2}\mod{n} z2modn的所有因子都在集合 B B B中;
  3. 将某些 z z z相乘使得因子基中的每个素数出现偶数次,这样就可以得到一个 x 2 ≡ y 2 ( m o d n ) x^{2}\equiv y^{2}\pmod{n} x2y2(modn)的式子,根据这个式子可以得到 n n n的一个分解

通过例子看看具体的流程:

n = 15770708441 n=15770708441 n=15770708441,并且取的 b = 6 b=6 b=6,那么 B = { 1 , 3 , 5 , 7 , 11 , 13 } B=\lbrace 1,3,5,7,11,13\rbrace B={1,3,5,7,11,13},找到三个 z z z确定出如下三个方程:
834093415 6 2 ≡ 3 × 7 ( m o d n ) 1204494294 4 2 ≡ 2 × 7 × 13 ( m o d n ) 277370001 1 2 ≡ 2 × 3 × 13 ( m o d n ) 8340934156^{2} \equiv 3\times 7\pmod{n}\\ 12044942944^{2} \equiv 2\times 7\times 13\pmod{n}\\ 2773700011^{2} \equiv 2\times 3 \times 13\pmod{n} 834093415623×7(modn)1204494294422×7×13(modn)277370001122×3×13(modn)
把上式两边同时相乘得到
( 8340934156 × 12044942944 × 2773700011 ) 2 ≡ ( 2 × 3 × 7 × 13 ) 2 ( m o d n ) (8340934156\times 12044942944 \times 2773700011)^{2} \equiv (2\times 3\times 7\times 13)^{2}\pmod{n} (8340934156×12044942944×2773700011)2(2×3×7×13)2(modn)

950343578 5 2 ≡ 54 6 2 ( m o d n ) 9503435785^{2} \equiv 546^{2}\pmod{n} 950343578525462(modn)
利用Euclidean算法,计算
g c d ( 9503435785 − 546 , n ) = 115759 gcd(9503435785-546,n)=115759 gcd(9503435785546,n)=115759
所以得到 n n n的一个因子为115759.

几个关键问题

  1. 如何选择 z z z才能使得 z 2   m o d   n z^{2}\bmod{n} z2modn的所有因子都在集合 B B B中。

    这里没有完全绝对的方法,只能给出几个技巧。一种技巧是简单地随机选择一些 z z z,计算 z 2   m o d   n z^{2}\bmod{n} z2modn,这也是随机平方法名字的由来;二是使用行如 j + ⌈ k n ⌉ , j = 0 , 1 , 2 , ⋯   , k = 1 , 2 , ⋯ j+\lceil \sqrt{kn} \rceil,j=0,1,2,\cdots,k=1,2,\cdots j+kn ,j=0,1,2,,k=1,2,,这些整数的平方模 n n n之后,通常很小,因子容易落在 B B B中;另外可以使用行如 ⌊ k n ⌋ \lfloor \sqrt{kn} \rfloor kn 的整数,这些数在模 n n n之后,比 n n n小一点,这意味着 − z 2 -z^{2} z2是很小的,只要我们把-1加入 B B B中,就可以容易地在 B B B上分解 z 2 z^{2} z2

  2. 选择哪些 z z z才能使得那些 z z z相乘后,因子基中的每个素数出现偶数次。

    假定 B = { p 1 , ⋯   , p b } B=\lbrace p_{1},\cdots,p_{b}\rbrace B={p1,,pb}为因子基。设 c c c为稍大于 b b b的整数(比如 c = b + 1 c=b+1 c=b+1 c = b + 2 c=b+2 c=b+2),且假定我们已经得到 c c c个同余方程:
    z j 2 ≡ p 1 α 1 j × p 2 α 2 j × ⋯ × p b α b j ( m o d n ) z_{j}^{2}\equiv p_{1}^{\alpha_{1j}} \times p_{2}^{\alpha_{2j}} \times \cdots \times p_{b}^{\alpha_{bj}}\pmod{n} zj2p1α1j×p2α2j××pbαbj(modn)
    其中 1 ≤ j ≤ c 1\le j \le c 1jc。对于每个 j j j,考虑向量
    α j = ( α 1 j   m o d   2 , ⋯   , α b j   m o d   2 ) ∈ ( Z 2 ) b \alpha _{j} =(\alpha_{1j}\bmod{2},\cdots,\alpha_{bj}\bmod{2})\in (\mathbb{Z}_{2})^{b} αj=(α1jmod2,,αbjmod2)(Z2)b
    如果我们可以找到 { a j } \lbrace a_{j}\rbrace {aj}的子集使得其模2的和为向量 { 0 , 0 , ⋯   , 0 } \lbrace 0,0,\cdots,0\rbrace {0,0,,0},那么对应的 z j z_{j} zj的乘积将会使用 B B B中每个因子偶数次。

例子

在这里插入图片描述
在这里插入图片描述
3. B B B该怎么选。

B B B的选取比较复杂,如果 b = ∣ B ∣ b=|B| b=B取得越大,整数 z 2 z^{2} z2似乎更容易在 B B B上分解。但是 b b b越大,为了找到一个等式需要累积很多同余式。具体方法我们就不赘述,有兴趣的可以参考书籍——Stinson D , 斯廷森, 冯登国. 密码学原理与实践[M]. 电子工业出版社, 2009.

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值