前段时间我对 GA 非常感兴趣,并且对它们进行了很多研究。我使用 C++ GAlib 编写了一些程序,我对它们在几秒钟内解决其他难以计算的问题的能力感到非常惊讶。它们似乎是一种很棒的暴力破解技术,非常聪明且适应性强。

我正在读 Michalewitz 的一本书,如果我没记错书名的话,它似乎都是基于麻省理工学院证明的图式定理。

我还听说它不能真正用于解决诸如分解 RSA 私钥之类的问题。

有人可以解释为什么会出现这种情况吗?

有帮助吗?

解决方案

遗传算法在所有完全没有智能算法,它们是非常贪婪的优化器算法。他们都在同样的想法上工作。您有一组积分(“个人群体”),您将该组与随机运营商转换为另一个组,在最佳改进方向('突变+交叉+选择')方向上有偏差。重复直到它收敛或厌倦了,没有什么聪明。

用于工作的遗传算法,新的积分人群应接近以前的积分。很少的扰动应该产生很少的变化。如果在一个点扰动的情况下,您可以获得一个表示具有完全不同性能的解决方案的点,然后,算法比随机搜索更好,通常不是良好的优化算法。在RSA案例中,如果您的点直接数字,则是是或否,只需通过翻转一点......因此使用遗传算法不比随机搜索更好,如果您代表RSA问题而没有太多思考“让我们代码搜索点作为数字的位“

其他提示

我会说因为键的分解不是优化问题,而是一个确切的问题。这种区别不是很准确,所以这里有细节。 遗传算法很棒,解决了最小值(本地/全球)的问题,但在修理问题中没有任何内容。作为DCA或模拟退火的遗传算法需要测量“我对解决方案的接近程度”,但你不能为我们的问题这么说。

有问题的遗传是好的,有山攀爬问题。

气体基于候选解决方案的适应性评估。

您基本上有一个健身功能,可以将候选解决方案占用作为输入,并给出标量,告诉您候选人有多好。然后继续,允许给定代代的最佳个人与其余的概率更高,因此将(希望)将更多“适合”总体,等。

在RSA分解方案中没有办法评估健身(与其余的候选解决方案有多好),因此这就是为什么无法使用它们。

遗传算法不是暴力破解,它们只是一种搜索算法。每个 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) 的“拟合度”如何?

间接你 可以 使用了遗传算法的因素的一个整数N.狄克逊的整数分解法使用公式,涉及的权力的第一个 k 素,模N.这些产品的权力的少数是所谓的"顺利的"。如果我们使用的是第一个 k=4 质数-{2,3,5,7}-42=2x3x7是顺利和11不是(由于缺乏一个更好的词,11是"粗略").狄克逊的方法需要一种可逆的 k x k 矩阵组成的指数,定义这些光滑的数字。欲了解更多关于迪克森的方法看到 https://en.wikipedia.org/wiki/Dixon%27s_factorization_method.

现在,回到原来的问题:有一个遗传算法寻找方程式用于迪克森的方法。

  1. r 可逆的平稳号国防部N-所以 r 是一个粗略的数量
  2. s 以顺利
  3. 产生随机的解决方案的rx=sy国防部N.这些解决方案[x,y]是人民的遗传算法。每个x、y有一个光滑的部件和一个粗略的组成部分。例如,假设x=369=9x41.然后(假设41是不足够小到最为顺利),粗略的一部分x41和光滑的部分是9.
  4. 选择对解决方案-"父母"-以结合成线性组合越来越粗糙的部分。
  5. 算法终止时对[x,y]发现的粗略的部分[1,1], [1,-1],[-1,1] 或[-1,-1].这产生了一个公式,用于迪克森的方法,因为 rx=国防部sy N和 r 是的只是粗略的数字左: xy 光滑, s 开始了平稳的。但是,即使1/r mod N是平滑的,所以这一切都顺利!

每次你结合了两对-说[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/g,h,x/g和y/小时会被牺牲,以便结合[v,w]和[x,y]。所以我们选择父母其v/g,h,x/g和y/h具有最光滑的部分。在这一方式,我们真的做驱动下的粗糙我们的部分解决方案rx=sy mod N从一代到下一步。

在进一步思考使您走向光滑系数x的最佳方法,在晶格x= by mod n中是回归,而不是遗传算法。

执行两个回归,一个带响应矢量R0,由来自x-= by mod n的随机选择的x值组成;而另一个具有来自相同解决方案的Y值组成的响应矢量R1。两个回归都使用相同的解释矩阵X.在x中是由X值模型平滑二数的剩余子组成的列,以及由Y值模数的剩余部分组成的其他列,而不是其他平滑二数。

光滑除数的最佳选择是最小化每个回归的错误:

e0= r0 - x(逆(x转置)(x))(x转置)(r0)

e1= r1-x(逆(x转置)(x))(x转置)(r1)

下面是unihilate 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本身是该等式的解决方案。

    一个较小的倍数较大的倍数可能只是顺畅的数字本身。通过MOD N具有平滑的AX=溶液,产生达克松方法的输入。

    两种优化使得特别快速:

    • 不需要一次猜测x的所有顺畅数量和列。您可以连续运行回归,一次将一个列添加到x,选择最多减少e0和e1的列。在任何两个具有共同因子的两个平滑数字都不会选择。
    • 您还可以从Mod N开始大量的zx=的随机解决方案,并将其中删除具有最大错误的x。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top