在组合学中需要有效的算法

时间:2016-08-10 13:15:30

标签: algorithm cryptography

我正在尝试找到解决加密挑战的最佳(现实)算法,其中:

  • 给定的密文C由在集合S = {A,B,C,...,Y,a,b,c,... y}中取得的约6000个字符组成。所以| S | = 50。
  • 加密方案不允许在C
  • 中有两个相同的相邻字符
  • S中的25个字母称为Nulls,未知
  • 必须从C中删除这些Null才能获得可以被攻击的实际密文C'。
  • C中的Null列表名为N和| N |接近| C | / 2 = 3000
  • 所以:| N | + | C'| = | C |

我的目标是识别25个Null,满足这两个条件:

  • C'
  • 中可能没有两个相同的相邻字符
  • N
  • 中可能没有两个相同的相邻Null

显然,在暴力中有50个!/(25!25!)= 126410606437752个S中25个Null的组合,所以这不是一个现实的方法。

我试图以尽可能多的方式递归地探索Nulls和'cut branches'的树。 例如,当向Null的子集添加S的字母时,如果序列“x n1n2 x”出现在C中,其中x还不是Null而n1n2是Null,那么x也应该是Null。 然而,对于低于几个世纪的运行时间来说,这还不够......

你能想到一个更聪明的算法来识别这25个Null吗?

注意:可能有多个Null满足这两个条件

2 个答案:

答案 0 :(得分:0)

让我们尝试这样的事情:

  • 创建一个集合列表 - 每个集合包含一个来自S的字符。该集合是空字符。
  • 虽然你有两套以上:
      每组
      • 搜索X[<set-chars>]+X
      • 的密文
      • 如果找到,请将集合与集合X合并。
    • 如果没有联合起来,就开始以两套联合起来。

如果为每个集合保留不同的密文,则可以加快速度,从中删除集合中的字符。如果你这样做,搜索会更容易 - 你正在寻找XX,女巫是恒定长度。每次你联合两个集合时,你需要从密文中删除集合中的所有字符。

这段时间取决于你给出的字符串C.

关于集合的解释 - 每个集合是C'或N的选项。如果您发现A和X在同一组中,则{A,X}是N或C'的子集。如果稍后你会发现关于Y和B的相同,那么{Y,B}是一个子集。之后,找到子串YAXAXY意味着Y与A和X在同一组中,B也是如此,因为它与Y一起。最后你将以两个组结束 - 一个用于C',一个用于N,巫婆你无法区分。

答案 1 :(得分:0)

elyashiv的方法很好。

非常快。

我制作了两套C&#39;和N,相当于。 S,S1和S2的子集产生C&#39;和N充分地使得S = S1 U S2。

谢谢。