Коды Рида-Мюллера RM (3,7) имеют:
- размер блока 128 бит
- минимальное расстояние 16
- размер сообщенияиз 64 битов
Сначала создайте базу следующим образом:
def popcnt(x):
return bin(x).count("1")
basis = []
by_ones = list(range(128))
by_ones.sort(key=popcnt)
for i in by_ones:
count = popcnt(i)
if count > 3:
break
if count <= 1:
basis.append(((1 << 128) - 1) // ((1 << i) | 1))
else:
p = ((1 << 128) - 1)
for b in [basis[k + 1] for k in range(7) if ((i >> k) & 1) != 0]:
p = p & b
basis.append(p)
Затем вы можете использовать любую их линейную комбинацию, которая создается XORing подмножествами строк базы,например:
def encode(x, basis):
# requires x < (1 << 64)
r = 0
for i in range(len(basis)):
if ((x >> i) & 1) != 0:
r = r ^ basis[i]
return r
В какой-то другой реализации я обнаружил, что это было сделано, взяв точечные произведения со столбцами базисной матрицы, а затем уменьшив их по модулю 2. Я не знаю, почему они это делают, кажется, оченьпроще сделать это напрямую, суммируя подмножество строк.