该问题似乎非常适合 GPU、FPGA 等(因为它非常并行);但我现在正在寻找一种基于 CPU 且在某种程度上独立于架构的解决方案。我认为一个好的答案可能只是一些未实现的伪代码,但我的程序是纯 C++20,所以答案应该与该上下文相关(例如,不要假设像 Python 这样非常高级的东西,不要使用编译器特定的内在函数或程序集)。我并不期待令人兴奋的性能,但我确实希望答案比我已经拥有的三个实现快得多(在这个文件):一种非常幼稚的方法,没有生成器矩阵,以及一种幼稚的“将输入向量与密集生成器矩阵相乘”方法。答案应该适用于任意码字和输入长度,但重要的码字长度在 2000 位以下,小输入长度并不重要。
一些预备知识:所讨论的二进制数的加法和乘法分别定义为“异或”(XOR)和“与”逻辑/按位运算。这扩展到二进制矩阵乘法。
汉明码是旧的和众所周知的二进制线性块错误检测/纠正码。每个码字是一串位,其中一些位位置被指定为奇偶校验位,用于错误检测和纠正,而其余位是数据位,如果没有错误,它们只是输入位的副本。我们只考虑奇偶校验位位于传统的二次幂位置的汉明码(即,基于 1 的编号:位 1、位 2、位 4、位 8,...)。因此,每个可能的代码都可以使用它的长度n
(代码字中的位数)或它的等级k
(代码字中的数据位数)来确定。汉明码可以称为(n, k)
,例如,(7, 4)
或(40, 34)
。
每个代码都有一个生成矩阵,一个二进制矩阵,输入向量可以与该矩阵相乘以获得一个代码字。因此,某个代码的代码字集合正是生成矩阵的行的线性组合集合。
所需的程序基本上是一个编码器:它以一(n, k)
对作为输入来提供代码(是的,这是多余的 - 本质上只需要一对)和一个任意二进制消息,将消息分成k
-bits long sub-消息并输出一系列 - 位n
长码字,每个码字编码一个子消息。
我希望在这里得到一个利用特定于我们的生成器矩阵的属性的答案(例如,生成器矩阵的特殊表示和特殊的向量矩阵乘法算法),所以这里是一些代码的生成器矩阵的示例:
汉明码(3, 1)
(只有代码字000
和111
):
111
汉明码((5, 2)
只有代码字00000
、11100
和):10011
01111
11100
10011
汉明码(6, 3)
:
111000
100110
010101
(注意每个生成矩阵如何包含所有较小代码的生成矩阵。)
汉明码(150, 142)
(所有零都留空,所以那些会更突出):
111
1 11
1 1 1
11 1 1
1 11
1 1 1
11 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 11
1 1 1
11 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 11
1 1 1
11 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
11 1 1 1 1 1
1 11
1 1 1
11 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
11 1 1 1 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
11 1 1 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
11 1 1 1 1 1
1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
11 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
11 1 1 1 1 1 1
1 11
1 1 1
11 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
11 1 1 1 1
1 1 1
1 1 1 1
1 1 1 1
11 1 1 1
1 1 1 1
1 1 1 1 1
1 1 1 1 1
请注意,在大多数生成器矩阵的所有零中,零的数量相对较少,而且这些矩阵肯定有一个模式,甚至是形状。
我在这里的所有相关领域都很薄弱,所以请尝试纠正我犯的任何可能的错误。