【问题标题】:Generating n binary vectors where each vector has a Hamming distance of d from every other vector生成 n 个二进制向量,其中每个向量与每个其他向量的汉明距离为 d
【发布时间】:2018-01-17 09:52:37
【问题描述】:

我正在尝试生成任意长度的n 二进制向量l,其中每个向量i 的汉明距离为d(其中d 是偶数)与其他 向量j。我不确定nld 之间是否存在任何理论上的关系,但我想知道是否有针对此任务的任何实现。我当前的实现如下所示。有时我成功,有时代码挂起,这表明a)不可能找到n给定ld这样的向量,或者b)搜索需要很长时间,特别是对于@的大值987654333@。

我的问题是:

  • 此任务是否有任何有效的实现方式?
  • nld之间存在什么样的理论关系?

    import numpy as np
    
    def get_bin(n):
        return ''.join([str(np.random.randint(0, 2)) for _ in range(n)])
    
    def hamming(s1, s2):
        return sum(c1 != c2 for c1, c2 in zip(s1, s2))
    
    def generate_codebook(n, num_codes, d):    
        codebooks = []
        seen = []
    
        while len(codebooks) < num_codes:
            code = get_bin(n)
            if code in seen:
                continue
            else:
                if len(codebooks) == 0:
                    codebooks.append(code)
                    print len(codebooks), code
                else:
                    if all(map(lambda x: int(hamming(code, x)) == d, codebooks)):
                        codebooks.append(code)
                        print len(codebooks), code
                seen.append(code)
    
        codebook_vectorized = map(lambda x: map(lambda b: int(b), x), codebooks)
        return np.array(codebook_vectorized)
    

例子:

codebook = generate_codebook(4,3,2)
codebook

1 1111
2 1001
3 0101

【问题讨论】:

  • 你的问题到底是什么?
  • 好问题,请查看编辑
  • 如果 d 是奇数,则 n 最多为 2(你不能有 3 个值在 1 的数量上都具有不同的奇偶校验)
  • @qwertyman 更新了问题以限定 d
  • 寻找具有最小汉明距离(与固定汉明距离相反)的序列集的问题已得到充分研究,但尚无定论。特别是,对于给定的最小距离和序列长度,集合的最大大小仅对小的和微不足道的参数值是已知的。我怀疑您的问题版本并不简单。

标签: python algorithm encryption vector cryptography


【解决方案1】:

让我们构建一个图G,其中每个L-bit 二进制向量v 都是一个顶点。并且只有当vivj 之间的汉明距离等于d 时,才存在边(vi, vj)。现在我们需要找到一个大小为nclique 就是这张图。

Clique 是无向图的顶点子集,使得每个 团中两个不同的顶点是相邻的。

在任意图中找到给定大小的团的任务是 NP 完全的。您可以在wikipedia article 中阅读有关此问题和一些算法的信息。

这个问题有很多special cases。例如,对于perfect graphs,有一个polynomial algorithm。不知道是否有可能证明我们的图表是这些特殊情况之一。

【讨论】:

【解决方案2】:

不是真正的解决方案,而是更多关于ldn之间的关系以及生成向量的过程的部分讨论。在任何情况下,您都可以考虑将问题(或更正式的类似问题)发布到Mathematics Stack Exchange。我在写的时候一直在推理,但我希望我没有弄错。

假设我们有l = 6。由于汉明距离仅取决于位置差异,因此您可以决定首先将第一个任意向量放入您的集合中(如果有解决方案,有些可能不包含它,但至少应该包含它)。所以让我们从一个初始的v1 = 000000 开始。现在,如果d = 1 显然n 只能是1 或2(111111)。如果d = 1,你会发现n也只能是1或者2;例如,您可以添加000001,但任何其他可能的向量与您拥有的向量之间的距离至少为 2。

假设d = 4。您需要更改 4 个位置并保留另外 2 个位置,因此您有 6 个元素集合中的 4-combinations,即 15 个选项,001111010111 等 - 您现在可以看到二项式系数 C(n, d) 加 1 是 n 的上限。让我们选择v2 = 001111,并说保留的位置是T = [1, 2],更改的位置是S = [3, 4, 5, 6]。现在继续,我们可以考虑对v2 进行更改;但是,为了保持正确的距离,我们必须遵循以下规则:

  • 我们必须对 v2 进行 4 处更改。
  • 如果我们更改S 中的位置,我们必须再次更改T 中的位置(反之亦然)。否则,与v1 的距离将无法保持。

从逻辑上讲,如果d 是奇数,您现在就可以完成(只能形成两个元素的集合),但幸运的是您已经说过您的距离数是偶数。所以我们将我们的数字除以 2,即 2,需要从 SC(4, 2) = 6 中选择 2 个元素,从 TC(2, 2) = 1 中选择 2 个元素,给我们 6 * 1 = 6 选项 - 你现在应该注意如果d 是偶数,则C(d, d/2) * C(l - d, d/2) + 2n 的新下限。让我们选择v3 = 111100v3 现在有四种类型的位置:相对于v1v2P1 = [1, 2]、相对于v1 没有变化的位置或v2P2 = [](在这种情况下没有)、相对于v1 但相对于v2 没有变化的位置、P3 = [3, 4] 和相对于v2 但没有变化的位置关于v1P4 = [5, 6]。同样的交易,我们需要 4 处更改,但现在我们对 P1 位置所做的每一次更改都必须意味着 P2 位置的更改,并且我们对 P3 位置所做的每一次更改都必须意味着 @987654373 位置的更改@ 位置。唯一剩下的选项是v4 = 110011,就是这样,最大的n 将是4。

因此,从组合的角度考虑问题,每次更改后,您将拥有呈指数级增长的“职位类型”(第一次更改后为 2,第二次更改后为 4,8、16... ) 根据它们在先前添加的每个向量中是否相等来定义,并且可以通过“对称”或“互补”关系将它们排列成对。在每一步,你都可以(我认为,这是我不太确定的推理的一部分)贪婪地从这些对中选择一组变化,并计算下一步的“职位类型”的大小。如果这一切都正确,您应该能够基于此编写算法来生成和/或计算某些特定 ldn(如果给定)的可能向量集。

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多