生成数字,具有高汉明距离

generating numbers, with high hamming distance

我正在寻找一种快速生成 k 个小于 2^64 的非负整数的方法,其中,在基数 2 中,任意两个数字之间的最小汉明距离尽可能大。

例如,如果我正在寻找 k=4 个数字并且它们应该小于 2^4,它们可能是:
0000
0011
1100
1111
最小汉明距离为 2。

是否有一种快速算法可以为给定的 k 生成这些数字?我将以 10^4 的顺序得到 k。

或者,生成一组数字的算法也可以正常工作,这些数字的成对汉明距离都大于给定值。

这是一个相当简单的方法。找出最小的位数 = b 可以表示 k 个不同的数字。例如。对于 k=4 使用 b = 2 位。将 64 位分成大小为 2 的块。对于每个块,在可用的 2^b >= k 中为每个要生成的数字指定一个不同的数字。

例如对于 k=4 个数字,b 位是 00、01、10、11,这里有 4 种可能性:

0000

0101

1010

1111

如果你有 c 个块,那么每个数字在每个 c 个块中至少有一位不同,所以最小保证汉明分离是 c。

您还可以排列每个块中的数字选择,这会产生更多看起来随机的示例,例如

0011

0101

1000

1110

mcdowella 的回答是一种非常好的方法,可以快速生成彼此之间具有特定最小汉明距离的数字。但是,它并不能保证产生的汉明距离特别大(如果我理解正确,它会保证 10^4 64 位数字中的任何两个之间的汉明距离至少为 4,尽管实际的最小汉明距离可能变大)。如果你真的想获得尽可能大的最小汉明距离,并且愿意为此花费更多 CPU 个周期,我建议使用 Reed-Solomon code。如果您需要 10^4 个数字,您可以将 1,2,...,10000 中的每个数字解释为长度为 14 的二进制消息,以长度为 64 的二进制代码字进行编码。为此,您可以使用 Reed-Solomon代码 [64,14,51]_2,这将保证任意两个 64 位数字之间的汉明距离至少为 51。正如您从链接的维基百科文章中看到的那样,构造相当复杂,但您应该能够使用开源实现(维基百科文章提供了一些链接),这样您就不必重新发明轮子。