// Method added by Sonic-The-Hedgehog-LNK1123 (github.com/Sonic-The-Hedgehog-LNK1123) private GenericGFPoly findErrataLocator(int[] errorPositions) { GenericGFPoly errataLocator = new GenericGFPoly(field, new int[] { 1 }, false); foreach (int i in errorPositions) { errataLocator = errataLocator.multiply(new GenericGFPoly(field, new int[] { 1 }, false).addOrSubtract(new GenericGFPoly(field, new int[] { field.exp(i), 0 }, false))); } return(errataLocator); }
// Method added by Sonic-The-Hedgehog-LNK1123 (github.com/Sonic-The-Hedgehog-LNK1123) // this method replaces original method "runEuclideanAlgorithm" internal GenericGFPoly runBerlekampMasseyAlgorithm(GenericGFPoly syndrome, int erasureCount) { GenericGFPoly sigma = new GenericGFPoly(field, new int[] { 1 }, false); GenericGFPoly old = new GenericGFPoly(field, new int[] { 1 }, false); for (int i = 0; i < (syndrome.Coefficients.Length - erasureCount); i++) { int delta = syndrome.getCoefficient(i); for (int j = 1; j < sigma.Coefficients.Length; j++) { delta ^= field.multiply(sigma.getCoefficient(j), syndrome.getCoefficient(i - j)); } List <int> oldList = new List <int>(old.Coefficients); oldList.Add(0); old = new GenericGFPoly(field, oldList.ToArray(), false); if (delta != 0) { if (old.Coefficients.Length > sigma.Coefficients.Length) { GenericGFPoly new_loc = old.multiply(delta); old = sigma.multiply(field.inverse(delta)); sigma = new_loc; } sigma = sigma.addOrSubtract(old.multiply(delta)); } } List <int> sigmaList = new List <int>(sigma.Coefficients); while (Convert.ToBoolean(sigmaList.Count) && sigmaList[0] == 0) { sigmaList.RemoveAt(0); } sigma = new GenericGFPoly(field, sigmaList.ToArray(), false); return(sigma); }
// Method added by Sonic-The-Hedgehog-LNK1123 (github.com/Sonic-The-Hedgehog-LNK1123) private GenericGFPoly findErrorEvaluator(GenericGFPoly syndrome, GenericGFPoly errataLocations) { int[] product = syndrome.multiply(errataLocations).Coefficients; int[] target = new int[errataLocations.Coefficients.Length - 1]; Array.Copy(product, product.Length - errataLocations.Coefficients.Length + 1, target, 0, target.Length); if (target.Length == 0) { return(null); } GenericGFPoly omega = new GenericGFPoly(field, target, false); return(omega); }