1975年,John M. Pollard提出了第二种因数分解的方法。Pollard rho因数分解方法基于下列几点:
(1) 假定有两个整数[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=17 alt="" src="http://pic.aIhUaU.com/201602/15/174700711.jpg" width=18 border=0> 和[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=15 alt="" src="http://pic.aIhUaU.com/201602/15/174746351.jpg" width=18 border=0> 使得p可以整除[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=17 alt="" src="http://pic.aIhUaU.com/201602/15/174700711.jpg" width=18 border=0>-[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=15 alt="" src="http://pic.aIhUaU.com/201602/15/174746351.jpg" width=18 border=0>,但是n不能整除[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=20 alt="" src="http://pic.aIhUaU.com/201602/15/174856699.jpg" width=64 border=0> 。
(2) 可以证明[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=24 alt="" src="http://pic.aIhUaU.com/201602/15/174936734.jpg" width=174 border=0> 。因为p可以整除[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=17 alt="" src="http://pic.aIhUaU.com/201602/15/174700711.jpg" width=18 border=0>- [I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=15 alt="" src="http://pic.aIhUaU.com/201602/15/174746351.jpg" width=18 border=0>,可以写成[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=23 alt="" src="http://pic.aIhUaU.com/201602/15/175038225.jpg" width=135 border=0> 。但是,因为n不能整除[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=17 alt="" src="http://pic.aIhUaU.com/201602/15/174700711.jpg" width=18 border=0>-[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=15 alt="" src="http://pic.aIhUaU.com/201602/15/174746351.jpg" width=18 border=0>,很明显q不能整除n。这就表明[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=23 alt="" src="http://pic.aIhUaU.com/201602/15/175137971.jpg" width=141 border=0> 既可以是1也可以是n的一个因数。
下列算法重复选择[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=17 alt="" src="http://pic.aIhUaU.com/201602/15/174700711.jpg" width=18 border=0>和[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=15 alt="" src="http://pic.aIhUaU.com/201602/15/174746351.jpg" width=18 border=0>,直到求出一个合适的对。
(1) 选择[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=17 alt="" src="http://pic.aIhUaU.com/201602/15/174700711.jpg" width=18 border=0>,一个小的随机整数称为种子。
(2) 运用函数算出[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=15 alt="" src="http://pic.aIhUaU.com/201602/15/174746351.jpg" width=18 border=0>,使得n不能整除[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=20 alt="" src="http://pic.aIhUaU.com/201602/15/175306689.jpg" width=104 border=0> 。这里所用的一个函数也许就是[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=15 alt="" src="http://pic.aIhUaU.com/201602/15/174746351.jpg" width=18 border=0> = [I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=25 alt="" src="http://pic.aIhUaU.com/201602/15/175356708.jpg" width=135 border=0> (a通常选作1)。
(3) 计算[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=22 alt="" src="http://pic.aIhUaU.com/201602/15/175430723.jpg" width=135 border=0> 。如果它不是1,结果是n的一个因数;如果它是1,返回到步骤1并用[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=15 alt="" src="http://pic.aIhUaU.com/201602/15/174746351.jpg" width=18 border=0>重复这个过程。现在我们计算[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=18 alt="" src="http://pic.aIhUaU.com/201602/15/175513175.jpg" width=21 border=0> 。注意,在下一轮中,我们以[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=18 alt="" src="http://pic.aIhUaU.com/201602/15/175513175.jpg" width=21 border=0>开始,如此这般。如果我们运用Pollard rho算法列出x的值,就会发现最终要重复的这个值,创建一个和希腊字母rho ([I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=19 alt="" src="http://pic.aIhUaU.com/201602/15/175603728.jpg" width=12 border=0> )一样的形状,如图9-3所示。
[TR]
[TD][I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=311 alt="" src="http://pic.aIhUaU.com/201602/15/174555510.jpg" width=311 border=0>[/TD][/TR]
[TR]
[TD]图9-3 Pollard rho连续数[/TD][/TR]
为了减少反复的次数,算法做了一些改进。该算法用数对([I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=17 alt="" src="http://pic.aIhUaU.com/201602/15/175713557.jpg" width=20 border=0> , [I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=17 alt="" src="http://pic.aIhUaU.com/201602/15/175713557.jpg" width=20 border=0>)开始,并且用[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=24 alt="" src="http://pic.aIhUaU.com/201602/15/175805135.jpg" width=98 border=0> ,迭代计算[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=24 alt="" src="http://pic.aIhUaU.com/201602/15/175852716.jpg" width=313 border=0> 。在每一次迭代中,我们都应用上述函数式运算(从第二步)第一次计算数对中的第一个元素,第二次计算数对中的第二个元素(参看算法9.6)。
算法 9.6 Pollard rho方法的伪代码
[TR]
[TD][I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=331 alt="" src="http://pic.aIhUaU.com/201602/15/175948477.jpg" width=670 border=0>[/TD][/TR]
[TR][/TR]
复杂度 这种方法需要算术运算[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=25 alt="" src="http://pic.aIhUaU.com/201602/15/180232659.jpg" width=25 border=0> 。不过,因为我们希望p小于或等于[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=24 alt="" src="http://pic.aIhUaU.com/201602/15/180313803.jpg" width=22 border=0> ,我们希望做[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=23 alt="" src="http://pic.aIhUaU.com/201602/15/180358279.jpg" width=34 border=0> 算术运算。这就是说比特操作复杂度是[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=27 alt="" src="http://pic.aIhUaU.com/201602/15/180430214.jpg" width=75 border=0> ,它是指数增长的。
例9.32
假定有一台每秒可以执行[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=20 alt="" src="http://pic.aIhUaU.com/201602/15/180511783.jpg" width=27 border=0> 比特(几乎10亿)运算的计算机。要分解一个大小如下的整数,近似的计算次数是多少?
(1) 60个十进制数位?
(2) 100个十进制数位?
解答
(1) 一个60个十进制数位的数几乎有200比特,那么复杂度就是[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=29 alt="" src="http://pic.aIhUaU.com/201602/15/180649523.jpg" width=57 border=0> 或[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=23 alt="" src="http://pic.aIhUaU.com/201602/15/180713773.jpg" width=29 border=0> 。如果每秒运算[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=22 alt="" src="http://pic.aIhUaU.com/201602/15/180738936.jpg" width=26 border=0> 次,算法可以在[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=22 alt="" src="http://pic.aIhUaU.com/201602/15/180803590.jpg" width=27 border=0> 秒或者说差不多12天中完成,
(2) 一个100个十进制数位的数几乎有300比特,复杂度是[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=23 alt="" src="http://pic.aIhUaU.com/201602/15/180827465.jpg" width=29 border=0> 。如果每秒运算[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=22 alt="" src="http://pic.aIhUaU.com/201602/15/180738936.jpg" width=26 border=0>次,该算法可以在[I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=21 alt="" src="http://pic.aIhUaU.com/201602/15/180853399.jpg" width=29 border=0> 秒或许多年中完成。
例9.33
我们已经写出一个计算434617的因数的程序,结果是709 (434617 = 709′ 613)。表9-2所示的就是这种运算中数对(x和 y)和p的值。
表9-2 例9.33中x、y和p的值
[TR]
[TD]
[I]x[/I]
[/TD]
[TD]
[I]y[/I]
[/TD]
[TD]
[I]p[/I]
[/TD][/TR]
[TR]
[TD]
2
[/TD]
[TD]
2
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
5
[/TD]
[TD]
26
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
26
[/TD]
[TD]
23713
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
677
[/TD]
[TD]
142292
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
23713
[/TD]
[TD]
157099
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
346589
[/TD]
[TD]
52128
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
142292
[/TD]
[TD]
41831
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
380320
[/TD]
[TD]
68775
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
157099
[/TD]
[TD]
427553
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
369457
[/TD]
[TD]
2634
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
52128
[/TD]
[TD]
63593
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
102901
[/TD]
[TD]
161353
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
41831
[/TD]
[TD]
64890
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
64520
[/TD]
[TD]
21979
[/TD]
[TD]
1
[/TD][/TR]
[TR]
[TD]
68775
[/TD]
[TD]
16309
[/TD]
[TD]
709
[/TD][/TR]