【问题标题】:Brute force all possible matrix combinations in python蛮力在python中所有可能的矩阵组合
【发布时间】:2016-08-17 21:32:12
【问题描述】:

我目前使用 numpy 在 python 中创建了一个 3x3 矩阵(将每个值初始化为 0)。我想创建一个小型 python 程序,蛮力矩阵中每个可能的 KEY 组合。例如:

[1, 0, 0
 0, 0, 0
 0, 0, 0]

[1, 1, 0
 0, 0, 0
 0, 0, 0]

等等……一直到:

[9, 9, 9
 9, 9, 9
 9, 9, 9]

看起来很微不足道,但由于某种原因我无法理解它。 我这样做的原因是因为我想得到每个矩阵组合的逆(使用 numpy 很容易)并将它乘以另一个矩阵,直到我得到我正在寻找的解决方案......基本上我正在尝试对 Crypto Hill Cipher 进行暴力破解。

非常感谢您的帮助!

【问题讨论】:

  • 什么是“KEY”组合?
  • 你不是说[[1, 0, 0], [0, 0, 0], [0, 0, 0]]吗?
  • @user2357112:一个非奇异的 3x3 矩阵,在环中以字母表的大小为模(通常为 26,在本例中显然为 10)进行乘法运算。
  • 如果它应该是非奇异的,那么这些例子似乎都不是有效的。
  • @user2357112:这是真的。提问者没有说,但希尔密码中的密钥必须有一个逆才能解密。我猜提问者的第一步是遍历所有内容,奇异矩阵稍后将被明确地消除,或者因为它们不可能是正确的键。我提到了它,以防有人知道在给定约束的情况下修剪搜索空间的方法。

标签: python numpy matrix brute-force


【解决方案1】:

如果您的字母表只有 10 位数字,那么您在此所做的在技术上称为“以 10 为基数计数”;-)

在每一步增加最后一位数字(右下角)。如果是 9,则将其环绕为 0 并递增倒数第二个数字,依此类推,直到 100 亿步后,最高位数字环绕。

也可以使用itertools.product 做一些更有效的事情,但由于这不会产生您需要的 numpy 矩阵,也许不会。

如果您的字母表是 26 个字符,那么您可能要等待一段时间才能完成运行,因为 26**10 是一个相当大的数字。

【讨论】:

    【解决方案2】:

    我认为应该这样做。

    from itertools import combinations_with_replacement
    import numpy as np
    
    x = np.empty((3,3), dtype=int)
    
    for comb in combinations_with_replacement(range(10),9):
        x.flat[:] = comb
    

    【讨论】:

    • 您先生,可以生我的孩子。谢谢!
    • 哦,挂在那里...函数 x.I 不起作用 =[(I = numpy 的逆)。反正有这个......还是我现在必须自己计算逆? >_>
    • 错误信息是什么?您可能必须将 X 定义为矩阵而不是数组。
    • 错误信息是:'numpy.ndarry' 对象没有属性 I。即使我尝试使用 linalg.inv(x) 函数,我也会得到 'Singular Matrix'... 我该怎么办去解决这个问题? =/
    • 您必须打破数学才能反转奇异矩阵。并非所有矩阵都是可逆的。如果您在循环之前执行x = np.matrix(x),则可以使用 x.I.但是对于奇异矩阵,它仍然会出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多