Os códigos de Reed–Muller são códigos corretores de erros usados em aplicações de comunicação sem fio, particularmente em comunicação no espaço profundo. Além disso, o padrão 5G proposto depende dos códigos polares intimamente relacionados para correção de erros no canal de controle. Devido às suas propriedades teóricas e matemáticas favoráveis, os códigos de Reed–Muller também têm sido extensivamente estudados em ciência da computação teórica. Por exemplo, foi demonstrado que eles alcançam assintoticamente a capacidade de Shannon em canais simétricos sem memória. Os códigos de Reed–Muller generalizam os códigos de Reed–Solomon e o código de Walsh–Hadamard. Os códigos de Reed–Muller são de bloco lineares que são localmente testáveis, localmente decodificáveis e decodificáveis em lista. Essas propriedades os tornam particularmente úteis no projeto de provas verificáveis probabilisticamente. Os códigos de Reed–Muller tradicionais são códigos binários, o que significa que mensagens e palavras-código são strings binárias. Quando r e m são inteiros com 0 ≤ r ≤ m, o código de Reed–Muller com parâmetros r e m é denotado como RM(r, m). Quando solicitado a codificar uma mensagem consistindo de k bits, onde
k =
∑
i = 0
r
(
m i
)
{\displaystyle \textstyle k=\sum _{i=0}^{r}{\binom {m}{i}}}
é válido, o código RM(r, m) produz uma palavra-código consistindo de 2m bits. Os códigos de Reed–Muller recebem o nome de David E. Muller, que descobriu os códigos em 1954, e Irving S. Reed, que propôs o primeiro algoritmo de decodificação eficiente.
Descrição usando polinômios de baixo grau Os códigos de Reed–Muller podem ser descritos de várias maneiras diferentes (mas em última análise equivalentes). A descrição baseada em polinômios de baixo grau é bastante elegante e particularmente adequada para sua aplicação como códigos localmente testáveis e códigos localmente decodificáveis.
Codificador Um código de bloco pode ter uma ou mais funções de codificação
C : { 0 , 1
}
k
→ { 0 , 1
}
n
{\textstyle C:\{0,1\}^{k}\to \{0,1\}^{n}}
que mapeiam mensagens
x ∈ { 0 , 1
}
k
{\textstyle x\in \{0,1\}^{k}}
para palavras-código
C ( x ) ∈ { 0 , 1
}
n
{\textstyle C(x)\in \{0,1\}^{n}}
. O código de Reed–Muller RM(r, m) tem comprimento da mensagem
k =
∑
i = 0
r
(
m i
)
{\displaystyle \textstyle k=\sum _{i=0}^{r}{\binom {m}{i}}}
e comprimento de bloco
n =
2
m
{\displaystyle \textstyle n=2^{m}}
. Uma maneira de definir uma codificação para este código é baseada na avaliação de polinômios multilineares com m variáveis e grau total no máximo r. Todo polinômio multilinear sobre o corpo finito com dois elementos pode ser escrito como segue:
p
c
(
Z
1
, ... ,
Z
m
) =
∑
S ⊆ { 1 , ... , m }
|
S
|
≤ r
c
S
⋅
∏
i ∈ S
Z
i
.
{\displaystyle p_{c}(Z_{1},\dots ,Z_{m})=\sum _{\underset {|S|\leq r}{S\subseteq \{1,\dots ,m\}}}c_{S}\cdot \prod _{i\in S}Z_{i}\,.}
As variáveis
Z
1
, ... ,
Z
m
{\textstyle Z_{1},\dots ,Z_{m}}
são as variáveis do polinômio, e os valores
c
S
∈ { 0 , 1 }
{\textstyle c_{S}\in \{0,1\}}
são os coeficientes do polinômio. Note que há exatamente
k =
∑
i = 0
r
(
m i
)
{\textstyle k=\sum _{i=0}^{r}{\binom {m}{i}}}
coeficientes. Com isso em mente, uma mensagem de entrada consiste em
k
{\textstyle k}
valores
x ∈ { 0 , 1
}
k
{\textstyle x\in \{0,1\}^{k}}
que são usados como esses coeficientes. Desta forma, cada mensagem
x
{\textstyle x}
dá origem a um polinômio único
p
x
{\textstyle p_{x}}
em m variáveis. Para construir a palavra-código
C ( x )
{\textstyle C(x)}
, o codificador avalia o polinômio
p
x
{\textstyle p_{x}}
em todos os pontos
Z = (
Z
1
, ... ,
Z
m
) ∈ { 0 , 1
}
m
{\textstyle Z=(Z_{1},\ldots ,Z_{m})\in \{0,1\}^{m}}
, onde o polinômio é tomado com multiplicação e adição mod 2
(
p
x
( Z )
mod
2
) ∈ { 0 , 1 }
{\textstyle (p_{x}(Z){\bmod {2}})\in \{0,1\}}
. Ou seja, a função de codificação é definida por
C ( x ) =
(
p
x
( Z )
mod
2
)
Z ∈ { 0 , 1
}
m
.
{\displaystyle C(x)=\left(p_{x}(Z){\bmod {2}}\right)_{Z\in \{0,1\}^{m}}\,.}
O fato de que a palavra-código
C ( x )
{\displaystyle C(x)}
é suficiente para reconstruir unicamente
x
{\displaystyle x}
segue da interpolação de Lagrange, que afirma que os coeficientes de um polinômio são unicamente determinados quando pontos de avaliação suficientes são dados. Como
C ( 0 ) = 0
{\displaystyle C(0)=0}
e
C ( x + y ) = C ( x ) + C ( y )
mod
2
{\displaystyle C(x+y)=C(x)+C(y){\bmod {2}}}
vale para todas as mensagens
x , y ∈ { 0 , 1
}
k
{\displaystyle x,y\in \{0,1\}^{k}}
, a função
C
{\displaystyle C}
é um mapa linear. Assim, o código de Reed–Muller é um código linear.
Exemplo Para o código RM(2, 4), os parâmetros são os seguintes:
r
= 2
m
= 4
k
=
(
4 2
)
+
(
4 1
)
+
(
4 0
)
= 6 + 4 + 1 = 11
n
=
2
m
= 16
{\textstyle {\begin{aligned}r&=2\\m&=4\\k&=\textstyle {\binom {4}{2}}+{\binom {4}{1}}+{\binom {4}{0}}=6+4+1=11\\n&=2^{m}=16\\\end{aligned}}}
Seja
C : { 0 , 1
}
11
→ { 0 , 1
}
16
{\textstyle C:\{0,1\}^{11}\to \{0,1\}^{16}}
a função de codificação recém-definida. Para codificar a string x = 1 1010 010101 de comprimento 11, o codificador primeiro constrói o polinômio
p
x
{\textstyle p_{x}}
em 4 variáveis:
p
x
(
Z
1
,
Z
2
,
Z
3
,
Z
4
)
= 1 + ( 1 ⋅
Z
1
+ 0 ⋅
Z
2
+ 1 ⋅
Z
3
+ 0 ⋅
Z
4
) + ( 0 ⋅
Z
1
Z
2
+ 1 ⋅
Z
1
Z
3
+ 0 ⋅
Z
1
Z
4
+ 1 ⋅
Z
2
Z
3
+ 0 ⋅
Z
2
Z
4
+ 1 ⋅
Z
3
Z
4
)
= 1 +
Z
1
+
Z
3
+
Z
1
Z
3
+
Z
2
Z
3
+
Z
3
Z
4
{\displaystyle {\begin{aligned}p_{x}(Z_{1},Z_{2},Z_{3},Z_{4})&=1+(1\cdot Z_{1}+0\cdot Z_{2}+1\cdot Z_{3}+0\cdot Z_{4})+(0\cdot Z_{1}Z_{2}+1\cdot Z_{1}Z_{3}+0\cdot Z_{1}Z_{4}+1\cdot Z_{2}Z_{3}+0\cdot Z_{2}Z_{4}+1\cdot Z_{3}Z_{4})\\&=1+Z_{1}+Z_{3}+Z_{1}Z_{3}+Z_{2}Z_{3}+Z_{3}Z_{4}\end{aligned}}}
Então ele avalia este polinômio em todos os 16 pontos de avaliação (0101 significa
Z
1
= 0 ,
Z
2
= 1 ,
Z
3
= 0 ,
Z
4
= 1 )
{\displaystyle Z_{1}=0,Z_{2}=1,Z_{3}=0,Z_{4}=1)}
:
p
x
( 0000 ) = 1 ,
p
x
( 0001 ) = 1 ,
p
x
( 0010 ) = 0 ,
p
x
( 0011 ) = 1 ,
{\displaystyle p_{x}(0000)=1,\;p_{x}(0001)=1,\;p_{x}(0010)=0,\;p_{x}(0011)=1,\;}
p
x
( 0100 ) = 1 ,
p
x
( 0101 ) = 1 ,
p
x
( 0110 ) = 1 ,
p
x
( 0111 ) = 0 ,
{\displaystyle p_{x}(0100)=1,\;p_{x}(0101)=1,\;p_{x}(0110)=1,\;p_{x}(0111)=0,\;}
p
x
( 1000 ) = 0 ,
p
x
( 1001 ) = 0 ,
p
x
( 1010 ) = 0 ,
p
x
( 1011 ) = 1 ,
{\displaystyle p_{x}(1000)=0,\;p_{x}(1001)=0,\;p_{x}(1010)=0,\;p_{x}(1011)=1,\;}
p
x
( 1100 ) = 0 ,
p
x
( 1101 ) = 0 ,
p
x
( 1110 ) = 1 ,
p
x
( 1111 ) = 0
.
{\displaystyle p_{x}(1100)=0,\;p_{x}(1101)=0,\;p_{x}(1110)=1,\;p_{x}(1111)=0\,.}
Como resultado, C(1 1010 010101) = 1101 1110 0001 0010 vale.
Decodificador Como já mencionado, a interpolação de Lagrange pode ser usada para recuperar eficientemente a mensagem a partir de uma palavra-código. No entanto, um decodificador precisa funcionar mesmo se a palavra-código tiver sido corrompida em algumas posições, ou seja, quando a palavra recebida é diferente de qualquer palavra-código. Neste caso, um procedimento de decodificação local pode ajudar. O algoritmo de Reed é baseado na seguinte propriedade: você começa a partir da palavra-código, que é uma sequência de pontos de avaliação de um polinômio desconhecido
p
x
{\textstyle p_{x}}
de
F
2
[
X
1
,
X
2
, . . . ,
X
m
]
{\textstyle {\mathbb {F} }_{2}[X_{1},X_{2},...,X_{m}]}
de grau no máximo
r
{\textstyle r}
que você deseja encontrar. A sequência pode conter qualquer número de erros até
2
m − r − 1
− 1
{\textstyle 2^{m-r-1}-1}
inclusive. Se você considerar um monômio
μ
{\textstyle \mu }
do maior grau
d
{\textstyle d}
em
p
x
{\textstyle p_{x}}
e somar todos os pontos de avaliação do polinômio onde todas as variáveis em
μ
{\textstyle \mu }
têm os valores 0 ou 1, e todas as outras variáveis têm valor 0, você obtém o valor do coeficiente (0 ou 1) de
μ
{\textstyle \mu }
em
p
x
{\textstyle p_{x}}
(Há
2
d
{\textstyle 2^{d}}
tais pontos). Isso se deve ao fato de que todos os divisores monomiais inferiores de
μ
{\textstyle \mu }
aparecem um número par de vezes na soma, e apenas
μ
{\textstyle \mu }
aparece uma vez. Para levar em conta a possibilidade de erros, você também pode notar que pode fixar o valor de outras variáveis para qualquer valor. Então, em vez de fazer a soma apenas uma vez para outras variáveis não em
μ
{\textstyle \mu }
com valor 0, você a faz
2
m − d
{\textstyle 2^{m-d}}
vezes para cada valoração fixa das outras variáveis. Se não houver erro, todas essas somas devem ser iguais ao valor do coeficiente procurado. O algoritmo consiste aqui em tomar a maioria das respostas como o valor procurado. Se a minoria for maior que o número máximo de erros possível, a etapa de decodificação falha, sabendo que há muitos erros no código de entrada. Uma vez que um coeficiente é calculado, se for 1, atualize o código para remover o monômio
μ
{\textstyle \mu }
do código de entrada e continue para o próximo monômio, em ordem reversa de seu grau.
Exemplo Vamos considerar o exemplo anterior e começar a partir do código. Com
r = 2 , m = 4
{\textstyle r=2,m=4}
podemos fixar no máximo 1 erro no código. Considere o código de entrada como 1101 1110 0001 0110 (este é o código anterior com um erro). Sabemos que o grau do polinômio
p
x
{\textstyle p_{x}}
é no máximo
r = 2
{\textstyle r=2}
, começamos procurando por monômios de grau 2.
μ =
X
3
X
4
{\textstyle \mu =X_{3}X_{4}}
começamos procurando pontos de avaliação com
X
1
= 0 ,
X
2
= 0 ,
X
3
∈ { 0 , 1 } ,
X
4
∈ { 0 , 1 }
{\textstyle X_{1}=0,X_{2}=0,X_{3}\in \{0,1\},X_{4}\in \{0,1\}}
. No código isso é: 1101 1110 0001 0110. A primeira soma é 1 (número ímpar de 1s). procuramos pontos de avaliação com
X
1
= 0 ,
X
2
= 1 ,
X
3
∈ { 0 , 1 } ,
X
4
∈ { 0 , 1 }
{\textstyle X_{1}=0,X_{2}=1,X_{3}\in \{0,1\},X_{4}\in \{0,1\}}
. No código isso é: 1101 1110 0001 0110. A segunda soma é 1. procuramos pontos de avaliação com
X
1
= 1 ,
X
2
= 0 ,
X
3
∈ { 0 , 1 } ,
X
4
∈ { 0 , 1 }
{\textstyle X_{1}=1,X_{2}=0,X_{3}\in \{0,1\},X_{4}\in \{0,1\}}
. No código isso é: 1101 1110 0001 0110. A terceira soma é 1. procuramos pontos de avaliação com
X
1
= 1 ,
X
2
= 1 ,
X
3
∈ { 0 , 1 } ,
X
4
∈ { 0 , 1 }
{\textstyle X_{1}=1,X_{2}=1,X_{3}\in \{0,1\},X_{4}\in \{0,1\}}
. No código isso é: 1101 1110 0001 0110. A terceira soma é 0 (número par de 1s). As quatro somas não concordam (então sabemos que há um erro), mas o relatório minoritário não é maior que o número máximo de erros permitido (1), então tomamos a maioria e o coeficiente de
μ
{\textstyle \mu }
é 1. Removemos
μ
{\textstyle \mu }
do código antes de continuar: código: 1101 1110 0001 0110, valoração de
μ
{\textstyle \mu }
é 0001000100010001, o novo código é 1100 1111 0000 0111
μ =
X
2
X
4
{\textstyle \mu =X_{2}X_{4}}
1100 1111 0000 0111. Soma é 0 1100 1111 0000 0111. Soma é 0 1100 1111 0000 0111. Soma é 1 1100 1111 0000 0111. Soma é 0 Um erro detectado, coeficiente é 0, nenhuma mudança no código atual.
μ =
X
1
X
4
{\textstyle \mu =X_{1}X_{4}}
1100 1111 0000 0111. Soma é 0 1100 1111 0000 0111. Soma é 0 1100 1111 0000 0111. Soma é 1 1100 1111 0000 0111. Soma é 0 Um erro detectado, coeficiente é 0, nenhuma mudança no código atual.
μ =
X
2
X
3
{\textstyle \mu =X_{2}X_{3}}
1100 1111 0000 0111. Soma é 1 1100 1111 0000 0111. Soma é 1 1100 1111 0000 0111. Soma é 1 1100 1111 0000 0111. Soma é 0 Um erro detectado, coeficiente é 1, valoração de
μ
{\textstyle \mu }
é 0000 0011 0000 0011, código atual é agora 1100 1100 0000 0100.
μ =
X
1
X
3
{\textstyle \mu =X_{1}X_{3}}
1100 1100 0000 0100. Soma é 1 1100 1100 0000 0100. Soma é 1 1100 1100 0000 0100. Soma é 1 1100 1100 0000 0100. Soma é 0 Um erro detectado, coeficiente é 1, valoração de
μ
{\textstyle \mu }
é 0000 0000 0011 0011, código atual é agora 1100 1100 0011 0111.
μ =
X
1
X
2
{\textstyle \mu =X_{1}X_{2}}
1100 1100 0011 0111. Soma é 0 1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 0 1100 1100 0011 0111. Soma é 0 Um erro detectado, coeficiente é 0, nenhuma mudança no código atual. Sabemos agora todos os coeficientes de grau 2 para o polinômio, podemos começar os monômios de grau 1. Observe que para cada próximo grau, há duas vezes mais somas, e cada soma é duas vezes menor.
μ =
X
4
{\textstyle \mu =X_{4}}
1100 1100 0011 0111. Soma é 0 1100 1100 0011 0111. Soma é 0 1100 1100 0011 0111. Soma é 0 1100 1100 0011 0111. Soma é 0 1100 1100 0011 0111. Soma é 0 1100 1100 0011 0111. Soma é 0 1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 0 Um erro detectado, coeficiente é 0, nenhuma mudança no código atual.
μ =
X
3
{\textstyle \mu =X_{3}}
1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 1 1100 1100 0011 0111. Soma é 0 Um erro detectado, coeficiente é 1, valoração de
μ
{\textstyle \mu }
é 0011 0011 0011 0011, código atual é agora 1111 1111 0000 0100. Então encontraremos 0 para
μ =
X
2
{\textstyle \mu =X_{2}}
, 1 para
μ =
X
1
{\textstyle \mu =X_{1}}
e o código atual se torna 1111 1111 1111 1011. Para o grau 0, temos 16 somas de apenas 1 bit. A minoria ainda tem tamanho 1, e encontramos
p
x
= 1 +
X
1
+
X
3
+
X
1
X
3
+
X
2
X
3
+
X
3
X
4
{\textstyle p_{x}=1+X_{1}+X_{3}+X_{1}X_{3}+X_{2}X_{3}+X_{3}X_{4}}
e a palavra inicial correspondente 1 1010 010101
Generalização para alfabetos maiores via polinômios de baixo grau Usando polinômios de baixo grau sobre um corpo finito
F
{\displaystyle \mathbb {F} }
de tamanho
q
{\displaystyle q}
, é possível estender a definição dos códigos de Reed–Muller para alfabetos de tamanho
q
{\displaystyle q}
. Sejam
m
{\displaystyle m}
e
d
{\displaystyle d}
inteiros positivos, onde
m
{\displaystyle m}
deve ser pensado como maior que
d
{\displaystyle d}
. Para codificar uma mensagem
x ∈
F
k
{\textstyle x\in \mathbb {F} ^{k}}
de largura
k =
(
m + d
m
)
{\displaystyle k=\textstyle {\binom {m+d}{m}}}
, a mensagem é novamente interpretada como um polinômio
p
x
{\displaystyle p_{x}}
de
m
{\displaystyle m}
variáveis de grau total no máximo
d
{\displaystyle d}
e com coeficientes em
F
{\displaystyle \mathbb {F} }
. Tal polinômio tem de fato
(
m + d
m
)
{\displaystyle \textstyle {\binom {m+d}{m}}}
coeficientes. A codificação Reed–Muller de
x
{\displaystyle x}
é a lista de todas as avaliações de
p
x
( a )
{\displaystyle p_{x}(a)}
sobre todos os
a ∈
F
m
{\displaystyle a\in \mathbb {F} ^{m}}
. Assim, o comprimento de bloco é
n =
q
m
{\displaystyle n=q^{m}}
.
Descrição usando uma matriz geradora Uma matriz geradora para um código de Reed–Muller RM(r, m) de comprimento N = 2m pode ser construída como segue. Vamos escrever o conjunto de todos os vetores binários de m dimensões como:
X =
F
2
m
= {
x
1
, ... ,
x
N
} .
{\displaystyle X=\mathbb {F} _{2}^{m}=\{x_{1},\ldots ,x_{N}\}.}
Definimos no espaço N-dimensional
F
2
N
{\displaystyle \mathbb {F} _{2}^{N}}
os vetores indicadores
I
A
∈
F
2
N
{\displaystyle \mathbb {I} _{A}\in \mathbb {F} _{2}^{N}}
em subconjuntos
A ⊂ X
{\displaystyle A\subset X}
por:
(
I
A
)
i
=
{
1
se
x
i
∈ A
0
caso contrário
{\displaystyle \left(\mathbb {I} _{A}\right)_{i}={\begin{cases}1&{\text{ se }}x_{i}\in A\\0&{\text{ caso contrário}}\\\end{cases}}}
juntamente com, também em
F
2
N
{\displaystyle \mathbb {F} _{2}^{N}}
, a operação binária
w ∧ z = (
w
1
⋅
z
1
, ... ,
w
N
⋅
z
N
) ,
{\displaystyle w\wedge z=(w_{1}\cdot z_{1},\ldots ,w_{N}\cdot z_{N}),}
referida como produto cunha (não confundir com o produto cunha definido na álgebra exterior). Aqui,
w = (
w
1
,
w
2
, ... ,
w
N
)
{\displaystyle w=(w_{1},w_{2},\ldots ,w_{N})}
e
z = (
z
1
,
z
2
, ... ,
z
N
)
{\displaystyle z=(z_{1},z_{2},\ldots ,z_{N})}
são pontos em
F
2
N
{\displaystyle \mathbb {F} _{2}^{N}}
(vetores binários N-dimensionais), e a operação
⋅
{\displaystyle \cdot }
é a multiplicação usual no corpo
F
2
{\displaystyle \mathbb {F} _{2}}
.
F
2
m
{\displaystyle \mathbb {F} _{2}^{m}}
é um espaço vetorial m-dimensional sobre o corpo
F
2
{\displaystyle \mathbb {F} _{2}}
, então é possível escrever
(
F
2
)
m
= { (
y
m
, ... ,
y
1
) ∣
y
i
∈
F
2
} .
{\displaystyle (\mathbb {F} _{2})^{m}=\{(y_{m},\ldots ,y_{1})\mid y_{i}\in \mathbb {F} _{2}\}.}
Definimos no espaço N-dimensional
F
2
N
{\displaystyle \mathbb {F} _{2}^{N}}
os seguintes vetores com comprimento
N :
v
0
= ( 1 , 1 , ... , 1 )
{\displaystyle N:v_{0}=(1,1,\ldots ,1)}
e
v
i
=
I
H
i
,
{\displaystyle v_{i}=\mathbb {I} _{H_{i}},}
onde 1 ≤ i ≤ m e os Hi são hiperplanos em
(
F
2
)
m
{\displaystyle (\mathbb {F} _{2})^{m}}
(com dimensão m − 1):
H
i
= { y ∈ (
F
2
)
m
∣
y
i
= 0 } .
{\displaystyle H_{i}=\{y\in (\mathbb {F} _{2})^{m}\mid y_{i}=0\}.}
A matriz geradora O código de Reed–Muller RM(r, m) de ordem r e comprimento N = 2m é o código gerado por v0 e pelos produtos cunha de até r dos vi, 1 ≤ i ≤ m (onde por convenção um produto cunha de menos de um vetor é a identidade para a operação). Em outras palavras, podemos construir uma matriz geradora para o código RM(r, m), usando vetores e suas permutações de produto cunha até r de cada vez
v
0
,
v
1
, ... ,
v
n
, ... , (
v
i
1
∧
v
i
2
) , ... (
v
i
1
∧
v
i
2
... ∧
v
i
r
)
{\displaystyle {v_{0},v_{1},\ldots ,v_{n},\ldots ,(v_{i_{1}}\wedge v_{i_{2}}),\ldots (v_{i_{1}}\wedge v_{i_{2}}\ldots \wedge v_{i_{r}})}}
, como as linhas da matriz geradora, onde 1 ≤ ik ≤ m.
Exemplo 1 Seja m = 3. Então N = 8, e
X =
F
2
3
= { ( 0 , 0 , 0 ) , ( 0 , 0 , 1 ) , ( 0 , 1 , 0 ) ... , ( 1 , 1 , 1 ) } ,
{\displaystyle X=\mathbb {F} _{2}^{3}=\{(0,0,0),(0,0,1),(0,1,0)\ldots ,(1,1,1)\},}
e
v
0
= ( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 )
v
1
= ( 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 )
v
2
= ( 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 )
v
3
= ( 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 ) .
{\displaystyle {\begin{aligned}v_{0}&=(1,1,1,1,1,1,1,1)\\[2pt]v_{1}&=(1,0,1,0,1,0,1,0)\\[2pt]v_{2}&=(1,1,0,0,1,1,0,0)\\[2pt]v_{3}&=(1,1,1,1,0,0,0,0).\end{aligned}}}
O código RM(1,3) é gerado pelo conjunto
{
v
0
,
v
1
,
v
2
,
v
3
} ,
{\displaystyle \{v_{0},v_{1},v_{2},v_{3}\},\,}
ou mais explicitamente pelas linhas da matriz:
(
1
1
1
1
1
1
1
1
1
0
1
0
1
0
1
0
1
1
0
0
1
1
0
0
1
1
1
1
0
0
0
0
)
{\displaystyle {\begin{pmatrix}1&1&1&1&1&1&1&1\\1&0&1&0&1&0&1&0\\1&1&0&0&1&1&0&0\\1&1&1&1&0&0&0&0\end{pmatrix}}}
Exemplo 2 O código RM(2,3) é gerado pelo conjunto:
{
v
0
,
v
1
,
v
2
,
v
3
,
v
1
∧
v
2
,
v
1
∧
v
3
,
v
2
∧
v
3
}
{\displaystyle \{v_{0},v_{1},v_{2},v_{3},v_{1}\wedge v_{2},v_{1}\wedge v_{3},v_{2}\wedge v_{3}\}}
ou mais explicitamente pelas linhas da matriz:
(
1
1
1
1
1
1
1
1
1
0
1
0
1
0
1
0
1
1
0
0
1
1
0
0
1
1
1
1
0
0
0
0
1
0
0
0
1
0
0
0
1
0
1
0
0
0
0
0
1
1
0
0
0
0
0
0
)
{\displaystyle {\begin{pmatrix}1&1&1&1&1&1&1&1\\1&0&1&0&1&0&1&0\\1&1&0&0&1&1&0&0\\1&1&1&1&0&0&0&0\\1&0&0&0&1&0&0&0\\1&0&1&0&0&0&0&0\\1&1&0&0&0&0&0&0\\\end{pmatrix}}}
Propriedades As seguintes propriedades são válidas:
O conjunto de todos os produtos cunha possíveis de até m dos vi forma uma base para
F
2
N
{\displaystyle \mathbb {F} _{2}^{N}}
. O código RM (r, m) tem rank
∑
s = 0
r
(
m s
)
.
{\displaystyle \sum _{s=0}^{r}{m \choose s}.}
RM (r, m) = RM (r, m − 1) | RM (r − 1, m − 1) onde '|' denota o produto barra de dois códigos. RM (r, m) tem peso de Hamming mínimo 2m − r. A distribuição completa dos pesos das palavras-código é mais complicada do que a fórmula da distância mínima. Tadao Kasami e Nobuki Tokura estudaram a estrutura de pesos dos códigos de Reed–Muller, incluindo palavras-código de baixo peso além do peso mínimo.
Prova
Decodificação de códigos RM Códigos RM(r, m) podem ser decodificados usando decodificação por lógica majoritária. A ideia básica da decodificação por lógica majoritária é construir várias somas de verificação para cada elemento da palavra-código recebida. Como cada uma das diferentes somas de verificação deve ter o mesmo valor (ou seja, o valor do elemento da palavra da mensagem), podemos usar uma lógica majoritária para decifrar o valor do elemento da palavra da mensagem. Uma vez que cada ordem do polinômio é decodificada, a palavra recebida é modificada adequadamente, removendo as palavras-código correspondentes ponderadas pelas contribuições da mensagem decodificada, até o estágio atual. Assim, para um código RM de ordem r, temos que decodificar iterativamente r+1 vezes antes de chegarmos à palavra-código final recebida. Além disso, os valores dos bits da mensagem são calculados através deste esquema; finalmente podemos calcular a palavra-código multiplicando a palavra da mensagem (recém-decodificada) pela matriz geradora. Uma pista se a decodificação foi bem-sucedida é ter uma palavra recebida modificada toda zero, no final da decodificação de estágio (r + 1) através da lógica majoritária. Esta técnica foi proposta por Irving S. Reed e é mais geral quando aplicada a outros códigos de geometria finita.
Descrição usando uma construção recursiva Um código Reed–Muller RM(r,m) existe para quaisquer inteiros
m ≥ 0
{\displaystyle m\geq 0}
e
0 ≤ r ≤ m
{\displaystyle 0\leq r\leq m}
. RM(m, m) é definido como o código universo (
2
m
,
2
m
, 1
{\displaystyle 2^{m},2^{m},1}
). RM(−1,m) é definido como o código trivial (
2
m
, 0 , ∞
{\displaystyle 2^{m},0,\infty }
). Os códigos RM restantes podem ser construídos a partir desses códigos elementares usando a construção de duplicação de comprimento
R M
( r , m ) = { (
u
,
u
+
v
) ∣
u
∈
R M
( r , m − 1 ) ,
v
∈
R M
( r − 1 , m − 1 ) } .
{\displaystyle \mathrm {RM} (r,m)=\{(\mathbf {u} ,\mathbf {u} +\mathbf {v} )\mid \mathbf {u} \in \mathrm {RM} (r,m-1),\mathbf {v} \in \mathrm {RM} (r-1,m-1)\}.}
A partir desta construção, RM(r,m) é um código de bloco linear binário (n, k, d) com comprimento n = 2m, dimensão
k ( r , m ) = k ( r , m − 1 ) + k ( r − 1 , m − 1 )
{\displaystyle k(r,m)=k(r,m-1)+k(r-1,m-1)}
e distância mínima
d =
2
m − r
{\displaystyle d=2^{m-r}}
para
r ≥ 0
{\displaystyle r\geq 0}
. O código dual de RM(r,m) é RM(m-r-1,m). Isso mostra que códigos de repetição e SPC são duais, códigos biorthogonais e de Hamming estendidos são duais e que códigos com k = n/2 são autoduais.
Casos especiais dos códigos de Reed–Muller
Tabela de todos os códigos RM(r,m) para m≤5 Todos os códigos RM(r, m) com
0 ≤ m ≤ 5
{\displaystyle 0\leq m\leq 5}
e tamanho de alfabeto 2 são exibidos aqui, anotados com a notação padrão [n,k,d] da teoria da codificação para códigos de bloco. O código RM(r, m) é um
[
2
m
, k ,
2
m − r
]
2
{\displaystyle \textstyle [2^{m},k,2^{m-r}]_{2}}
-código, ou seja, é um código linear sobre um alfabeto binário, tem comprimento de bloco
2
m
{\displaystyle \textstyle 2^{m}}
, comprimento da mensagem (ou dimensão) k, e distância mínima
2
m − r
{\displaystyle \textstyle 2^{m-r}}
.
Propriedades dos códigos RM(r,m) para r≤1 ou r≥m-2 Códigos RM(0, m) são códigos de repetição de comprimento N = 2m, taxa
R =
1 N
{\displaystyle {R={\tfrac {1}{N}}}}
e distância mínima
d
min
= N
{\displaystyle d_{\min }=N}
. Códigos RM(1, m) são códigos de verificação de paridade de comprimento N = 2m, taxa
R =
m + 1
N
{\displaystyle R={\tfrac {m+1}{N}}}
e distância mínima
d
min
=
N 2
{\displaystyle d_{\min }={\tfrac {N}{2}}}
. Códigos RM(m − 1, m) são códigos de verificação de paridade única de comprimento N = 2m, taxa
R =
N − 1
N
{\displaystyle R={\tfrac {N-1}{N}}}
e distância mínima
d
min
= 2
{\displaystyle d_{\min }=2}
. Códigos RM(m − 2, m) são a família de códigos de Hamming estendidos de comprimento N = 2m com distância mínima
d
min
= 4
{\displaystyle d_{\min }=4}
.
Referências
Leitura adicional Shu Lin; Daniel Costello (2005). Error Control Coding 2 ed. [S.l.]: Pearson. ISBN 978-0-13-017973-9 Capítulo 4. J.H. van Lint (1992). Introduction to Coding Theory. Col: GTM. 86 2 ed. [S.l.]: Springer-Verlag. ISBN 978-3-540-54894-2 Capítulo 4.5.
Ligações externas MIT OpenCourseWare, 6.451 Principles of Digital Communication II, Lecture Notes seção 6.4 Implementação GPL em Matlab de códigos RM Código-fonte GPL da implementação em Matlab de códigos RM Weiss, E. (setembro de 1962). «Generalized Reed-Muller codes». Information and Control. 5 (3): 213–222. ISSN 0019-9958. doi:10.1016/s0019-9958(62)90555-7