这是用于计算CLRS的整数因子分解的伪代码。但是当 i == k 第8行中 GCD 以及加倍k 的需要有什么意义呢? >在第13行。请帮助。
答案 0 :(得分:2)
尽管有标签,但伪代码不是Pollard-rho分解。这是相关Brent's factorization method的一次审判。在Pollard-rho分解中,在第i步中计算x_i和x_(2i),并用n检查x_(2i)-x_i的GCD。在布伦特的分解方法中,为b = 1,2,...,2 ^ a计算GCD(x_(2 ^ a)-x_(2 ^ a + b),n)。 (我使用从1开始的索引来同意伪代码,但在其他地方,序列用x_0初始化。)在代码中,k = 2 ^ a和i = 2 ^ a + b。当您检测到我已达到下一个2的幂时,将k增加到2 ^(a + 1)。
Euclid's algorithm可以非常快速地计算GCD,而不知道数字的因子分解。每当你找到一个带有n的非平凡的GCD时,这有助于你计算n。在Pollard-rho分解和布伦特算法中,一个想法是如果你迭代一个多项式,如x ^ 2-c,迭代modn的值之间的差异往往是与n共享非平凡因子的数字的良好候选者。 。这是因为(通过Chinese Remainder Theorem)迭代多项式mod n与在n的素因数分解中同时迭代多项式mod的每个素数相同。如果x_i = x_j mod p1 ^ e1但不是mod p2 ^ e2,则GCD(xi-xj,n)将p1 ^ e1作为因子而不是p2 ^ e2,因此它将是一个非平凡因子。
这是一次试验,因为x_1初始化一次。如果你运气不好,你为x_1选择的值会启动一个预先重复的序列,在n的素数因子分解中同时修改每个素数幂,即使n不是素数。例如,假设n = 1711 = 29 * 59,x_1 = 4,x_2 = 15,x_3 = 224,x_4 = 556,x_5 = 1155,x_6 = 1155,...这个序列无助于您找到一个非常重要的因子化,因为不同元素和1711之间的差异的所有GCD都是1.如果从x_1 = 5开始,则x_2 = 24,x_3 = 575,x_4 = 401,x_5 = 1677,x_6 = 1155,x_7 = 1155, ...在任何分解方法中,你会发现GCD(x_4-x_2,1711)= GCD(377,1711)= 29,非平凡因子1711.不仅一些序列没有帮助,其他序列可能有用,但它可能会更快放弃并从另一个初始值开始。所以,通常你不会永远增加我,通常有一个终止阈值,你可以尝试不同的初始值。