前段时间我对GAs很感兴趣,而且我对它们进行了相当多的研究。我使用C ++ GAlib编写了一些程序,我很惊讶他们能够在几秒钟内解决其他难以计算的问题。它们看起来像是一种很棒的强制技术,非常适合智能和适应。
我正在读Michalewitz的一本书,如果我记得正确的名字,这一切似乎都是基于图式定理,麻省理工学院证明了这一点。
我也听说它无法真正用于解决像RSA私钥分解这样的问题。
有人可以解释为什么会这样吗?
答案 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_enough
和best_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方法的方程式。
每次你组合两对 - 比如[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中组合了三个属性:
大平滑数的相对较小的倍数可能只是平滑数字本身。具有ax = mod N的平滑解决方案产生对Dixon方法的输入。
两次优化使得这一点变得特别快: