Er zijn verschillende definities te geven voor een goppa-code. Hier wordt toegewerkt naar een polynomiale definitie. Voordat we dat kunnen doen zijn er enkele parameters nodig. De volgende gegevens zijn gebruikelijk voor een goppa-code:
Kies
n
=
2
m
{\displaystyle n=2^{m}}
met
m
∈
{
10
,
11
,
12
}
{\displaystyle m\in \{10,11,12\}}
.
De code is gedefinieerd over het lichaam
G
F
(
n
)
{\displaystyle \mathbb {GF} (n)}
. Noem de rij afzonderlijke elementen uit dat lichaam,
a
1
,
a
2
,
…
,
a
n
{\displaystyle a_{1},a_{2},\dots ,a_{n}}
lexicografisch geordend .
Voor het aantal fouten
t
{\displaystyle t}
die gecorrigeerd kunnen worden door de code, kiezen we
2
≤
t
≤
2
m
−
1
m
{\displaystyle 2\leq t\leq {\frac {2^{m}-1}{m}}}
. Voor
m
=
11
{\displaystyle m=11}
is bijvoorbeeld
t
=
32
,
t
=
70
{\displaystyle t=32,t=70}
of
t
=
100
{\displaystyle t=100}
.
Zoek een irreducibele monische polynoom
g
∈
G
F
(
2
m
)
[
x
]
{\displaystyle g\in \mathbb {GF} (2^{m})[x]}
van graad
t
{\displaystyle t}
.
Laat
h
=
∏
i
(
x
−
a
i
)
∈
G
F
(
n
)
[
x
]
{\displaystyle h=\prod _{i}(x-a_{i})\in \mathbb {GF} (n)[x]}
.
In dit geval geldt dat
h
=
x
n
−
x
∈
G
F
(
2
m
)
[
x
]
{\displaystyle h=x^{n}-x\in \mathbb {GF} (2^{m})[x]}
.
Een definitie van de goppa-code
Γ
{\displaystyle \Gamma }
, is nu
Γ
=
Γ
(
a
1
,
a
2
,
…
,
a
n
,
g
)
=
{
c
∈
G
F
(
2
m
)
:
∑
i
c
i
h
x
−
a
i
mod
g
=
0
}
{\displaystyle {\Gamma }={\Gamma }(a_{1},a_{2},\ldots ,a_{n},g)=\{c\in \mathbb {GF} (2^{m}):\sum _{i}c_{i}{\frac {h}{x-a_{i}}}\mod g=0\}}
De polynomen
h
x
−
a
1
mod
g
,
h
x
−
a
2
mod
g
,
…
,
h
x
−
a
n
mod
g
{\displaystyle {\frac {h}{x-a_{1}}}{\bmod {g}},{\frac {h}{x-a_{2}}}{\bmod {g}},\ldots ,{\frac {h}{x-a_{n}}}{\bmod {g}}}
, kunnen gezien worden als vectoren over
G
F
(
2
)
{\displaystyle \mathbb {GF} (2)}
.
Ze vormen een pariteitscontrole-matrix voor de code
Γ
{\displaystyle \Gamma }
.
Algoritme van Patterson
bewerken
In 1975 heeft Patterson een algoritme ontwikkeld om in polynomiale tijd
t
{\displaystyle t}
fouten te kunnen corrigeren uit de goppa-code.
Voordat het algoritme weergegeven kan worden, is de definitie nodig van de norm van een polynoom.
Norm van een polynoom
bewerken
Voor een polynoom
ϕ
∈
G
F
(
2
m
)
[
x
]
{\displaystyle \phi \in \mathbb {GF} (2^{m})[x]}
geldt dat de norm
|
ϕ
|
=
2
deg
(
ϕ
)
{\displaystyle |\phi |=2^{\deg(\phi )}}
, met
deg
(
ϕ
)
{\displaystyle \deg(\phi )}
de graad van
ϕ
{\displaystyle \phi }
.
Bij rationale functies geldt
|
ϕ
ψ
|
=
|
ϕ
|
|
ψ
|
{\displaystyle |{\frac {\phi }{\psi }}|={\frac {|\phi |}{|\psi |}}}
. Bijvoorbeeld
|
x
3
x
5
−
x
|
=
|
x
3
|
|
x
5
−
x
|
=
2
3
2
5
=
2
−
2
{\displaystyle |{\frac {x^{3}}{x^{5}-x}}|={\frac {|x^{3}|}{|x^{5}-x|}}={\frac {2^{3}}{2^{5}}}=2^{-2}}
.
Het doel is om maximaal
t
{\displaystyle t}
fouten te verbeteren uit eengoppa-code
Γ
{\displaystyle \Gamma }
. We starten met een woord
w
∈
G
F
n
(
2
)
{\displaystyle w\in \mathbb {GF} ^{n}(2)}
, met maximaal
t
{\displaystyle t}
fouten. Dat betekent dat er een coodewoord
c
≈
w
{\displaystyle c\approx w}
is zodat er in het codewoord hoogstens
t
{\displaystyle t}
maal een 1 met een 0 verwisseld is, of andersom.
Bereken
∑
i
w
i
x
−
a
i
{\displaystyle {\sum _{i}{\frac {w_{i}}{x-a_{i}}}}}
over het lichaam
G
F
(
2
m
)
[
x
]
/
(
g
)
{\displaystyle \mathbb {GF} (2^{m})[x]/(g)}
. Als deze som nul is in het lichaam, dan zijn er blijkbaar geen fouten in de code. Het algoritme geeft dan output
w
{\displaystyle w}
.
Bereken de wortel van
1
∑
i
w
i
x
−
a
i
−
x
{\displaystyle {\frac {1}{\sum _{i}{\frac {w_{i}}{x-a_{i}}}}}-x}
over het lichaam
G
F
(
2
m
)
[
x
]
/
(
g
)
{\displaystyle \mathbb {GF} (2^{m})[x]/(g)}
.
Noem deze berekende wortel
s
{\displaystyle s}
en bekijk deze in het lichaam
s
∈
G
F
(
2
m
)
[
x
]
{\displaystyle s\in \mathbb {GF} (2^{m})[x]}
. De graad van
s
{\displaystyle s}
is kleiner dan
t
{\displaystyle t}
.
De vectoren
(
s
,
1
)
{\displaystyle (s,1)}
en
(
g
,
0
)
{\displaystyle (g,0)}
genereren een rooster
L
⊆
G
F
(
2
m
)
[
x
]
2
{\displaystyle L\subseteq \mathbb {GF} (2^{m})[x]^{2}}
.
De norm
|
(
α
,
β
)
|
{\displaystyle |(\alpha ,\beta )|}
van een vector
(
α
,
β
)
∈
G
F
(
2
m
)
[
x
]
2
{\displaystyle (\alpha ,\beta )\in \mathbb {GF} (2^{m})[x]^{2}}
is per definitie gelijk aan de norm van de polynoom
α
2
+
x
β
2
{\displaystyle \alpha ^{2}+x\beta ^{2}}
.
Zo is de lengte van de vector
(
g
,
0
)
{\displaystyle (g,0)}
gelijk aan
|
(
g
,
0
)
|
=
|
g
2
|
=
2
2
t
{\displaystyle |(g,0)|=|g^{2}|=2^{2t}}
.
Vind met behulp van basisreductie een basis
(
α
0
,
β
0
)
{\displaystyle (\alpha _{0},\beta _{0})}
van minimale lengte. Deze zal kleiner of gelijk zijn aan
2
t
{\displaystyle 2^{t}}
.
Bereken
ϵ
=
α
0
2
+
x
β
0
2
{\displaystyle \epsilon =\alpha _{0}^{2}+x\beta _{0}^{2}}
Deel door de coëfficiënt van de hoogste macht van x, zodat
ϵ
{\displaystyle \epsilon }
monisch wordt.
Ontbindt
ϵ
{\displaystyle \epsilon }
in lineaire factoren van de vorm
(
x
−
a
i
)
{\displaystyle (x-a_{i})}
. Dit zullen
t
{\displaystyle t}
factoren zijn.
Output
c
{\displaystyle c}
, is de gecorrigeerd code
w
{\displaystyle w}
, met een correctie op de plaatsen
i
{\displaystyle i}
, waar
ϵ
(
a
i
)
=
0
{\displaystyle \epsilon (a_{i})=0}
.
Voor een uitgebreid voorbeeld van dit algoritme wordt verwezen naar het artikel van Bernstein.[1]