为什么遗传算法不能解决像RSA因素这样的问题?

时间:2011-03-28 08:38:29

标签: genetic-algorithm genetic-programming

前段时间我对GAs很感兴趣,而且我对它们进行了相当多的研究。我使用C ++ GAlib编写了一些程序,我很惊讶他们能够在几秒钟内解决其他难以计算的问题。它们看起来像是一种很棒的强制技术,非常适合智能和适应。

我正在读Michalewitz的一本书,如果我记得正确的名字,这一切似乎都是基于图式定理,麻省理工学院证明了这一点。

我也听说它无法真正用于解决像RSA私钥分解这样的问题。

有人可以解释为什么会这样吗?

6 个答案:

答案 0 :(得分:12)

遗传算法根本不是智能,它们是非常贪婪的优化算法。他们都围绕着同样的想法。你有一组点('一群人'),你用随机算子将这个组转换成另一个点,偏向最佳改进方向('变异+交叉+选择')。重复直到它收敛或你厌倦了它,没有什么聪明的。

要使遗传算法起作用,新的点数应该接近先前的点数。微小的扰动应该几乎没有变化。如果在一点的小扰动之后,你得到一个代表完全不同性能的解的点,那么,算法就没有比随机搜索更好的了,随机搜索通常是不好的优化算法。在RSA的情况下,如果你的点数直接是数字,它可以是YES或NO,只需翻一点......因此使用遗传算法并不比随机搜索更好,如果你代表RSA问题而没有太多思考“让我们将搜索点编码为数字的位“

答案 1 :(得分:4)

我想说因为键的因子分解不是优化问题,而是一个确切的问题。这种区别不是很准确,所以这里有细节。 遗传算法非常适合解决最小值(局部/全局)的问题,但是因子分解问题中没有任何问题。作为DCA或模拟退火的遗传算法需要衡量“我与解决方案的距离”,但你不能对我们的问题说出这一点。

对于一个问题遗传学很好的例子,有登山问题。

答案 2 :(得分:2)

GA基于候选解决方案的适合度评估。

你基本上有一个健身功能,它将候选解决方案作为输入,并给你一个标量,告诉你该候选人有多好。然后你继续允许给定一代的最佳个体以比其他人更高的概率交配,这样后代将(希望)更“适合”整体,等等

在RSA分解场景中,无法评估适应度(候选解决方案与其他解决方案相比有多好),因此您无法使用它们。

答案 3 :(得分:1)

GAs不是暴力破解,它们只是一种搜索算法。每个GA基本上都是这样的:

candidates = seed_value;
while (!good_enough(best_of(candidates))) {
    candidates = compute_next_generation(candidates);
}

根据适应度函数定义good_enoughbest_of的位置。适应度函数表示给定候选人解决​​问题的程度。这似乎是这里的核心问题:你如何编写一个适用于因式分解的适应度函数?例如20 = 2 * 10或4 * 5。元组(2,10)和(4,5)显然是赢家,但其他人呢? “适合”如何(1,9)或(3,4)?

答案 4 :(得分:1)

间接地,你可以使用遗传算法来计算整数N.Dixon的整数分解方法使用涉及第一个 k 素数的幂的方程,模N.这些乘积小素数的幂被称为“平滑”。如果我们使用第一个 k = 4 素数 - {2,3,5,7} - 42 = 2x3x7是平滑的而11则不是(因为没有更好的术语,11是“粗糙的” )。 Dixon的方法需要一个可逆的 k x k 矩阵,该矩阵由定义这些平滑数的指数组成。有关Dixon方法的更多信息,请参阅https://en.wikipedia.org/wiki/Dixon%27s_factorization_method

现在,回到最初的问题:有一种遗传算法可以找到Dixon方法的方程式。

  1. r 为平滑数mod N的倒数 - 所以 r 是一个粗略的数字
  2. s 顺利
  3. 生成rx = sy mod N的随机解。这些解[x,y]是遗传算法的总体。每个x,y具有平滑的组分和粗糙的组分。例如假设x = 369 = 9 x 41.那么(假设41不足以计算为平滑),x的粗略部分为41,平滑部分为9.
  4. 选择成对的解决方案 - “父母” - 与更小的粗糙部分组合成线性组合。
  5. 当找到具有粗糙部分[1,1],[1,-1],[ - 1,1]或[-1,-1]的对[x,y]时,算法终止。这产生了Dixon方法的等式,因为 rx = sy mod N和 r 是唯一剩下的粗略数字: x y 很流畅, s 开始流畅。但是即使1 / r mod N也很平滑,所以它都很流畅!
  6. 每次你组合两对 - 比如[v,w]和[x,y] - 四个数字的平滑部分被删除,除了v和x的平滑部分共有的因子,以及因素w和y共享的平滑部分。因此,我们选择尽可能广泛分享顺畅部分的父母。为了使其准确,请写

    g = gcd(v的平滑部分,x的平滑部分)

    h = gcd(w的平滑部分,y的平滑部分)

    [v,w],[x,y] = [g v / g,h w / h],[g x / g,h y​​ / h]。

    来之不易的平滑因子g和h将被保留到下一代,但是为了组合[v,将牺牲v / g,w / h,x / g和y / h的平滑部分。 w]和[x,y]。因此我们选择父母,其中v / g,w / h,x / g和y / h具有最小的平滑部分。通过这种方式,我们确实将解决方案的粗略部分从一代驱动到下一代rx = sy mod N.

答案 5 :(得分:0)

进一步思考最好的方法,使你的方法走向平滑系数x,y在格子ax = by mod N是回归,而不是遗传算法。

进行两次回归,一次具有响应向量R0,其由来自随机选择的ax = mod N的溶液的x值组成;另一个响应矢量R1由来自相同解决方案的y值组成。两个回归都使用相同的解释矩阵X.在X中,列是由x值的余数和模数平滑除数组成的列,以及由y值的余数组成的其他列,以其他平滑除数为模。

平滑除数的最佳选择是最小化每次回归的误差:

E0 = R0-X((X-转置)(X)的倒数)(X-转置)(R0)

E1 = R1 - X((X-转置)(X)的倒数)(X-转置)(R1)

接下来是用于消灭X的行操作。然后将这些行操作的结果z应用于来自形成X的原始解的x和y值。

z R0 = z R0 - 0
     = z R0 - zX (inverse of (X-transpose)(X)) (X-transpose) (R0)
     = z E0 

类似地,z R1 = z E1

现在在z R0和z R1中组合了三个属性:

  • 它们是大数平滑数的倍数,因为z湮灭了余数模数平滑的数字。
  • 它们相对较小,因为E0和E1很小。
  • 与ax = mod N的任何线性组合相似,z R0和z R1本身就是该方程的解。

大平滑数的相对较小的倍数可能只是平滑数字本身。具有ax = mod N的平滑解决方案产生对Dixon方法的输入。

两次优化使得这一点变得特别快:

  • 无需一次猜出X的所有平滑数字和列。您可以连续运行回归,一次向X添加一列,选择最能减少E0和E1的列。任何时候都不会选择任何两个具有共同因子的平滑数字。
  • 您也可以从zx = by mod N的许多随机解决方案开始,并删除X选择新列之间错误最大的解决方案。