예제 #1
0
        // 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);
        }
예제 #2
0
        // 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);
        }
예제 #3
0
        // 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);
        }