mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
[Aaru.Checksums] Reformat and cleanup.
This commit is contained in:
162
ReedSolomon.cs
162
ReedSolomon.cs
@@ -88,69 +88,25 @@ public class ReedSolomon
|
||||
public void InitRs(int n, int k, int m)
|
||||
{
|
||||
_pp = m switch
|
||||
{
|
||||
2 => new[]
|
||||
{
|
||||
1, 1, 1
|
||||
},
|
||||
3 => new[]
|
||||
{
|
||||
1, 1, 0, 1
|
||||
},
|
||||
4 => new[]
|
||||
{
|
||||
1, 1, 0, 0, 1
|
||||
},
|
||||
5 => new[]
|
||||
{
|
||||
1, 0, 1, 0, 0, 1
|
||||
},
|
||||
6 => new[]
|
||||
{
|
||||
1, 1, 0, 0, 0, 0, 1
|
||||
},
|
||||
7 => new[]
|
||||
{
|
||||
1, 0, 0, 1, 0, 0, 0, 1
|
||||
},
|
||||
8 => new[]
|
||||
{
|
||||
1, 0, 1, 1, 1, 0, 0, 0, 1
|
||||
},
|
||||
9 => new[]
|
||||
{
|
||||
1, 0, 0, 0, 1, 0, 0, 0, 0, 1
|
||||
},
|
||||
10 => new[]
|
||||
{
|
||||
1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1
|
||||
},
|
||||
11 => new[]
|
||||
{
|
||||
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
|
||||
},
|
||||
12 => new[]
|
||||
{
|
||||
1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1
|
||||
},
|
||||
13 => new[]
|
||||
{
|
||||
1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1
|
||||
},
|
||||
14 => new[]
|
||||
{
|
||||
1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1
|
||||
},
|
||||
15 => new[]
|
||||
{
|
||||
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
|
||||
},
|
||||
16 => new[]
|
||||
{
|
||||
1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1
|
||||
},
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(m), Localization.m_must_be_between_2_and_16_inclusive)
|
||||
};
|
||||
{
|
||||
2 => new[] { 1, 1, 1 },
|
||||
3 => new[] { 1, 1, 0, 1 },
|
||||
4 => new[] { 1, 1, 0, 0, 1 },
|
||||
5 => new[] { 1, 0, 1, 0, 0, 1 },
|
||||
6 => new[] { 1, 1, 0, 0, 0, 0, 1 },
|
||||
7 => new[] { 1, 0, 0, 1, 0, 0, 0, 1 },
|
||||
8 => new[] { 1, 0, 1, 1, 1, 0, 0, 0, 1 },
|
||||
9 => new[] { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
|
||||
10 => new[] { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 },
|
||||
11 => new[] { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
|
||||
12 => new[] { 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 },
|
||||
13 => new[] { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
|
||||
14 => new[] { 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 },
|
||||
15 => new[] { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
|
||||
16 => new[] { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 },
|
||||
_ => throw new ArgumentOutOfRangeException(
|
||||
nameof(m), Localization.m_must_be_between_2_and_16_inclusive)
|
||||
};
|
||||
|
||||
_mm = m;
|
||||
_kk = k;
|
||||
@@ -238,7 +194,7 @@ public class ReedSolomon
|
||||
{
|
||||
int i;
|
||||
|
||||
int mask = 1;
|
||||
var mask = 1;
|
||||
_alphaTo[_mm] = 0;
|
||||
|
||||
for(i = 0; i < _mm; i++)
|
||||
@@ -264,7 +220,7 @@ public class ReedSolomon
|
||||
for(i = _mm + 1; i < _nn; i++)
|
||||
{
|
||||
if(_alphaTo[i - 1] >= mask)
|
||||
_alphaTo[i] = _alphaTo[_mm] ^ ((_alphaTo[i - 1] ^ mask) << 1);
|
||||
_alphaTo[i] = _alphaTo[_mm] ^ (_alphaTo[i - 1] ^ mask) << 1;
|
||||
else
|
||||
_alphaTo[i] = _alphaTo[i - 1] << 1;
|
||||
|
||||
@@ -304,10 +260,12 @@ public class ReedSolomon
|
||||
* (@**(B0+i-1) + x)
|
||||
*/
|
||||
for(int j = i - 1; j > 0; j--)
|
||||
{
|
||||
if(_gg[j] != 0)
|
||||
_gg[j] = _gg[j - 1] ^ _alphaTo[Modnn(_indexOf[_gg[j]] + B0 + i - 1)];
|
||||
else
|
||||
_gg[j] = _gg[j - 1];
|
||||
}
|
||||
|
||||
/* Gg[0] can never be zero */
|
||||
_gg[0] = _alphaTo[Modnn(_indexOf[_gg[0]] + B0 + i - 1)];
|
||||
@@ -343,8 +301,10 @@ public class ReedSolomon
|
||||
for(i = _kk - 1; i >= 0; i--)
|
||||
{
|
||||
if(_mm != 8)
|
||||
{
|
||||
if(data[i] > _nn)
|
||||
return -1; /* Illegal symbol */
|
||||
}
|
||||
|
||||
int feedback = _indexOf[data[i] ^ bb[_nn - _kk - 1]];
|
||||
|
||||
@@ -352,17 +312,19 @@ public class ReedSolomon
|
||||
{
|
||||
/* feedback term is non-zero */
|
||||
for(int j = _nn - _kk - 1; j > 0; j--)
|
||||
{
|
||||
if(_gg[j] != _a0)
|
||||
bb[j] = bb[j - 1] ^ _alphaTo[Modnn(_gg[j] + feedback)];
|
||||
else
|
||||
bb[j] = bb[j - 1];
|
||||
}
|
||||
|
||||
bb[0] = _alphaTo[Modnn(_gg[0] + feedback)];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* feedback term is zero. encoder becomes a
|
||||
* single-byte shifter */
|
||||
* single-byte shifter */
|
||||
for(int j = _nn - _kk - 1; j > 0; j--)
|
||||
bb[j] = bb[j - 1];
|
||||
|
||||
@@ -397,25 +359,27 @@ public class ReedSolomon
|
||||
throw new UnauthorizedAccessException(Localization.Trying_to_calculate_RS_without_initializing);
|
||||
|
||||
erasPos = new int[_nn - _kk];
|
||||
int i, j;
|
||||
int q, tmp;
|
||||
int[] recd = new int[_nn];
|
||||
int[] lambda = new int[_nn - _kk + 1]; /* Err+Eras Locator poly */
|
||||
int[] s = new int[_nn - _kk + 1]; /* syndrome poly */
|
||||
int[] b = new int[_nn - _kk + 1];
|
||||
int[] t = new int[_nn - _kk + 1];
|
||||
int[] omega = new int[_nn - _kk + 1];
|
||||
int[] root = new int[_nn - _kk];
|
||||
int[] reg = new int[_nn - _kk + 1];
|
||||
int[] loc = new int[_nn - _kk];
|
||||
int count;
|
||||
int i, j;
|
||||
int q, tmp;
|
||||
var recd = new int[_nn];
|
||||
var lambda = new int[_nn - _kk + 1]; /* Err+Eras Locator poly */
|
||||
var s = new int[_nn - _kk + 1]; /* syndrome poly */
|
||||
var b = new int[_nn - _kk + 1];
|
||||
var t = new int[_nn - _kk + 1];
|
||||
var omega = new int[_nn - _kk + 1];
|
||||
var root = new int[_nn - _kk];
|
||||
var reg = new int[_nn - _kk + 1];
|
||||
var loc = new int[_nn - _kk];
|
||||
int count;
|
||||
|
||||
/* data[] is in polynomial form, copy and convert to index form */
|
||||
for(i = _nn - 1; i >= 0; i--)
|
||||
{
|
||||
if(_mm != 8)
|
||||
{
|
||||
if(data[i] > _nn)
|
||||
return -1; /* Illegal symbol */
|
||||
}
|
||||
|
||||
recd[i] = _indexOf[data[i]];
|
||||
}
|
||||
@@ -423,18 +387,20 @@ public class ReedSolomon
|
||||
/* first form the syndromes; i.e., evaluate recd(x) at roots of g(x)
|
||||
* namely @**(B0+i), i = 0, ... ,(NN-KK-1)
|
||||
*/
|
||||
int synError = 0;
|
||||
var synError = 0;
|
||||
|
||||
for(i = 1; i <= _nn - _kk; i++)
|
||||
{
|
||||
tmp = 0;
|
||||
|
||||
for(j = 0; j < _nn; j++)
|
||||
{
|
||||
if(recd[j] != _a0) /* recd[j] in index form */
|
||||
tmp ^= _alphaTo[Modnn(recd[j] + ((B0 + i - 1) * j))];
|
||||
tmp ^= _alphaTo[Modnn(recd[j] + (B0 + i - 1) * j)];
|
||||
}
|
||||
|
||||
synError |= tmp; /* set flag if non-zero syndrome =>
|
||||
* error */
|
||||
* error */
|
||||
|
||||
/* store syndrome in index form */
|
||||
s[i] = _indexOf[tmp];
|
||||
@@ -476,18 +442,20 @@ public class ReedSolomon
|
||||
q = 1;
|
||||
|
||||
for(j = 1; j <= noEras; j++)
|
||||
{
|
||||
if(reg[j] != _a0)
|
||||
{
|
||||
reg[j] = Modnn(reg[j] + j);
|
||||
q ^= _alphaTo[reg[j]];
|
||||
}
|
||||
}
|
||||
|
||||
if(q != 0)
|
||||
continue;
|
||||
|
||||
/* store root and error location
|
||||
* number indices
|
||||
*/
|
||||
* number indices
|
||||
*/
|
||||
root[count] = i;
|
||||
loc[count] = _nn - i;
|
||||
count++;
|
||||
@@ -524,12 +492,14 @@ public class ReedSolomon
|
||||
{
|
||||
/* r is the step number */
|
||||
/* Compute discrepancy at the r-th step in poly-form */
|
||||
int discrR = 0;
|
||||
var discrR = 0;
|
||||
|
||||
for(i = 0; i < r; i++)
|
||||
{
|
||||
if(lambda[i] != 0 &&
|
||||
s[r - i] != _a0)
|
||||
discrR ^= _alphaTo[Modnn(_indexOf[lambda[i]] + s[r - i])];
|
||||
}
|
||||
|
||||
discrR = _indexOf[discrR]; /* Index form */
|
||||
|
||||
@@ -545,10 +515,12 @@ public class ReedSolomon
|
||||
t[0] = lambda[0];
|
||||
|
||||
for(i = 0; i < _nn - _kk; i++)
|
||||
{
|
||||
if(b[i] != _a0)
|
||||
t[i + 1] = lambda[i + 1] ^ _alphaTo[Modnn(discrR + b[i])];
|
||||
else
|
||||
t[i + 1] = lambda[i + 1];
|
||||
}
|
||||
|
||||
if(2 * el <= r + noEras - 1)
|
||||
{
|
||||
@@ -573,7 +545,7 @@ public class ReedSolomon
|
||||
}
|
||||
|
||||
/* Convert lambda to index form and compute deg(lambda(x)) */
|
||||
int degLambda = 0;
|
||||
var degLambda = 0;
|
||||
|
||||
for(i = 0; i < _nn - _kk + 1; i++)
|
||||
{
|
||||
@@ -597,11 +569,13 @@ public class ReedSolomon
|
||||
q = 1;
|
||||
|
||||
for(j = degLambda; j > 0; j--)
|
||||
{
|
||||
if(reg[j] != _a0)
|
||||
{
|
||||
reg[j] = Modnn(reg[j] + j);
|
||||
q ^= _alphaTo[reg[j]];
|
||||
}
|
||||
}
|
||||
|
||||
if(q != 0)
|
||||
continue;
|
||||
@@ -628,7 +602,7 @@ public class ReedSolomon
|
||||
* Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo
|
||||
* x**(NN-KK)). in index form. Also find deg(omega).
|
||||
*/
|
||||
int degOmega = 0;
|
||||
var degOmega = 0;
|
||||
|
||||
for(i = 0; i < _nn - _kk; i++)
|
||||
{
|
||||
@@ -636,9 +610,11 @@ public class ReedSolomon
|
||||
j = degLambda < i ? degLambda : i;
|
||||
|
||||
for(; j >= 0; j--)
|
||||
{
|
||||
if(s[i + 1 - j] != _a0 &&
|
||||
lambda[j] != _a0)
|
||||
tmp ^= _alphaTo[Modnn(s[i + 1 - j] + lambda[j])];
|
||||
}
|
||||
|
||||
if(tmp != 0)
|
||||
degOmega = i;
|
||||
@@ -654,19 +630,23 @@ public class ReedSolomon
|
||||
*/
|
||||
for(j = count - 1; j >= 0; j--)
|
||||
{
|
||||
int num1 = 0;
|
||||
var num1 = 0;
|
||||
|
||||
for(i = degOmega; i >= 0; i--)
|
||||
{
|
||||
if(omega[i] != _a0)
|
||||
num1 ^= _alphaTo[Modnn(omega[i] + (i * root[j]))];
|
||||
num1 ^= _alphaTo[Modnn(omega[i] + i * root[j])];
|
||||
}
|
||||
|
||||
int num2 = _alphaTo[Modnn((root[j] * (B0 - 1)) + _nn)];
|
||||
int den = 0;
|
||||
int num2 = _alphaTo[Modnn(root[j] * (B0 - 1) + _nn)];
|
||||
var den = 0;
|
||||
|
||||
/* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */
|
||||
for(i = Min(degLambda, _nn - _kk - 1) & ~1; i >= 0; i -= 2)
|
||||
{
|
||||
if(lambda[i + 1] != _a0)
|
||||
den ^= _alphaTo[Modnn(lambda[i + 1] + (i * root[j]))];
|
||||
den ^= _alphaTo[Modnn(lambda[i + 1] + i * root[j])];
|
||||
}
|
||||
|
||||
if(den == 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user