45 for (i = 0; i <= degree - 1; i += 2) {
55 m(in_m), t(in_t), systematic(sys)
60 GFX x(
q, (
char *)
"-1 0");
62 g.
set(
q, (
char *)
"0");
63 for (
int i = 1; i <= 2*
t; i++) {
65 g *= (x -
GFX(
q, alphapow));
71 int i, j, itterations =
floor_i(static_cast<double>(uncoded_bits.length())
75 GFX uncoded_shifted(
n + 1,
n);
77 bvec mbit(
k*m), cbit(m);
79 coded_bits.set_size(itterations*
n*m,
false);
82 for (i = 0; i <
n -
k; i++)
83 uncoded_shifted[i] =
GF(
n + 1, -1);
85 for (i = 0; i < itterations; i++) {
87 for (j = 0; j <
k; j++) {
88 mpow.
set(
q, uncoded_bits.mid((i*m*k) + (j*m), m));
92 uncoded_shifted[j+
n-
k] = mx[j];
98 for (j = k; j <
n; j++) {
105 for (j = 0; j <
n; j++) {
106 cbit = cx[j].get_vectorspace();
107 coded_bits.replace_mid((i*n*m) + (j*m), cbit);
115 encode(uncoded_bits, coded_bits);
121 int j, i, kk, l, L, foundzeros, decoderfailure,
122 itterations =
floor_i(static_cast<double>(coded_bits.length()) / (
n *
m));
124 decoded_bits.set_size(itterations*k*m,
false);
126 GFX rx(
q,
n - 1), cx(
q,
n - 1), mx(
q, k - 1), ex(
q,
n - 1), S(
q, 2*
t), Lambda(
q),
127 Lambdaprim(
q), OldLambda(
q), T(
q), Ohmega(
q);
128 GFX dummy(
q), One(
q, (
char*)
"0"), Ohmegatemp(
q);
129 GF delta(
q), tempsum(
q), rtemp(
q), temp(
q), Xk(
q), Xkinv(
q);
132 for (i = 0; i < itterations; i++) {
133 decoderfailure =
false;
135 for (j = 0; j <
n; j++) {
136 rtemp.set(
q, coded_bits.mid(i*n*m + j*m, m));
141 for (j = 1; j <= 2*
t; j++) {
144 if (S.get_true_degree() == 0) {
146 decoderfailure =
false;
151 Lambda =
GFX(
q, (
char*)
"0");
153 T =
GFX(
q, (
char*)
"-1 0");
157 for (l = 1; l <= L; l++) {
158 tempsum += Lambda[l] * S[kk-l];
160 delta = S[kk] - tempsum;
161 if (delta !=
GF(
q, -1)) {
166 T = OldLambda / delta;
169 T =
GFX(
q, (
char*)
"-1 0") * T;
172 errorpos.set_size(Lambda.get_true_degree(),
false);
175 for (j =
q - 2; j >= 0; j--) {
176 temp = Lambda(
GF(
q, j));
177 if (Lambda(
GF(
q, j)) ==
GF(
q, -1)) {
178 errorpos(foundzeros) = (n - j) % n;
180 if (foundzeros >= Lambda.get_true_degree()) {
185 if (foundzeros != Lambda.get_true_degree()) {
186 decoderfailure =
false;
191 Ohmegatemp = Lambda * (One + S);
192 for (j = 0; j <= 2*
t; j++) {
193 Ohmega[j] = Ohmegatemp[j];
198 for (j = 0; j < foundzeros; j++) {
199 Xk =
GF(
q, errorpos(j));
200 Xkinv =
GF(
q, 0) / Xk;
201 ex[errorpos(j)] = (Xk * Ohmega(Xkinv)) / Lambdaprim(Xkinv);
207 for (j = 1; j <= 2*
t; j++) {
210 if (S.get_true_degree() >= 1) {
211 decoderfailure =
false;
217 if (decoderfailure ==
false) {
218 if (cx.get_true_degree() >= 1) {
220 for (j = 0; j <
k; j++) {
227 for (j = 0; j <= mx.get_true_degree(); j++) {
228 mbit.replace_mid(j*m, mx[j].get_vectorspace());
232 decoded_bits.replace_mid(i*m*k, mbit);
239 decode(coded_bits, decoded_bits);
247 it_error(
"Reed_Solomon::decode(): Soft-decision decoding not implemented");
252 it_error(
"Reed_Solomon::decode(): Soft-decision decoding not implemented");