#多项式 #纠错 # #符号 # #四元数 #van der Monde

bin+lib vandermonde_lc

Rust 中受 Tetrys 启发的纠错码实现(IETF RFC9407)

2 个版本

0.1.1 2024 年 8 月 9 日
0.1.0 2024 年 8 月 9 日

#362 in 数学

Download history 169/week @ 2024-08-03 75/week @ 2024-08-10

每月 244 次下载
用于 网络编码

Apache-2.0

86KB
2K SLoC

受 Tetrys 启发的纠错码

这是基于 Tetrys 的 Rust 中纠错码的实现。

Tetrys 草案对 GF(256) 的说明如下

Vandermonde based coefficients over the finite field GF(2^(8)), as defined below. Each coefficient is built as alpha^( (source_symbol_id*coded-symbol_id) % 256), with alpha the root of the primitive polynomial

用于 GF(256) 的不可约多项式是 x^(8) + x^(4) + x^(3) + x^(2) + 1。

如何计算这个多项式的根?根是多项式等于 0 的 x 的值。但这个原始多项式(康威多项式)应该在 GF(2) 中定义,但 0 和 1 都不是这个多项式的根。草案引用了 RFC5510 的第 8.1 节,指出这一点

Note that all the roots of this polynomial are in GF(2^^m) but not in GF(2).

因此,为了找到根,我们必须在 GF256 中而不是 GF(2) 中评估多项式来找到根。

让我们用 galois Python 库来做(注意:确保 numpy>=1.23.3,否则可能会导致错误!)

pip install galois

python
>>> import galois
>>> GF = galois.GF(256)
>>> conway_poly_gf256 = galois.Poly([1, 0, 0, 0, 1, 1, 1, 0, 1], field=GF)
>>> print(conway_poly_gf256) # ensure that the poly is correct
x^8 + x^4 + x^3 + x^2 + 1
>>> conway_poly_gf256.roots()
GF([  2,   4,  16,  29,  76,  95, 133, 157], order=2^8)

从 [ 2, 4, 16, 29, 76, 95, 133, 157] 中的任何根都是好的。我们随机选择了 157 来推导 van der Monde 系数。

依赖项

~1.5MB
~17K SLoC