Example #1
0
        public PolynomialOverFiniteField Mul(PolynomialOverFiniteField firstArg, PolynomialOverFiniteField secondArg)
        {
            int firstDeg  = firstArg.Deg;
            int secondDeg = secondArg.Deg;

            if (firstDeg == -1 || secondDeg == -1)
            {
                return(new PolynomialOverFiniteField(new Polynomial[] { new Polynomial(new BigInteger[] { 0 }) }));
            }
            int maxdegree = firstDeg + secondDeg;

            Polynomial[] result = new Polynomial[maxdegree + 1];
            for (int i = 0; i <= firstDeg; i++)
            {
                for (int j = 0; j <= secondDeg; j++)
                {
                    if (result[i + j] == null)
                    {
                        result[i + j] = new Polynomial(new BigInteger[] { 0 });
                    }
                    result[i + j] = _polynomialMath.Add(result[i + j], _polynomialMath.Mul(firstArg[i], secondArg[j]));
                }
            }
            return(new PolynomialOverFiniteField(result, Mod, FieldChar));
        }
Example #2
0
        public PolynomialOverFiniteField ModPow(PolynomialOverFiniteField polynomial, BigInteger power, PolynomialOverFiniteField mod)
        {
            if (power == 0)
            {
                return(new PolynomialOverFiniteField(new Polynomial[] { new Polynomial(new BigInteger[] { 1 }) }));
            }
            var res = new PolynomialOverFiniteField(new Polynomial[] { new Polynomial(new BigInteger[] { 1 }) });
            var a   = polynomial;

            while (power != 0)
            {
                if (power % 2 != 0)
                {
                    res = Rem(Mul(res, a), mod);
                }
                a       = Rem(Mul(a, a), mod);
                power >>= 1;
            }
            return(res);
        }
Example #3
0
        public PolynomialOverFiniteField Add(PolynomialOverFiniteField firstArg, PolynomialOverFiniteField secondArg)
        {
            int firstDeg  = firstArg.Deg;
            int secondDeg = secondArg.Deg;

            var maxDeg = Math.Max(firstDeg, secondDeg);

            if (maxDeg == -1)
            {
                return(new PolynomialOverFiniteField(new Polynomial[] { new Polynomial(new BigInteger[1]) }));
            }

            var result = new Polynomial[maxDeg + 1];

            if (firstDeg > secondDeg)
            {
                int i;
                for (i = 0; i <= secondDeg; i++)
                {
                    result[i] = _polynomialMath.Add(firstArg[i], secondArg[i]);
                }
                for (; i <= firstDeg; i++)
                {
                    result[i] = firstArg[i];
                }
            }
            else
            {
                int i;
                for (i = 0; i <= firstDeg; i++)
                {
                    result[i] = _polynomialMath.Add(firstArg[i], secondArg[i]);
                }
                for (; i <= secondDeg; i++)
                {
                    result[i] = secondArg[i];
                }
            }

            return(new PolynomialOverFiniteField(result, Mod, FieldChar));
        }
Example #4
0
        public PolynomialOverFiniteField Div(PolynomialOverFiniteField firstArg, PolynomialOverFiniteField secondArg)
        {
            if (secondArg.Deg == -1)
            {
                throw new DivideByZeroException();
            }
            if (firstArg.Deg < secondArg.Deg)
            {
                return(new PolynomialOverFiniteField(new Polynomial[] { new Polynomial(new BigInteger[] { 0 }) }));
            }


            var        firstDeg  = firstArg.Deg;
            var        secondDeg = secondArg.Deg;
            var        newDeg    = firstDeg - secondDeg;
            var        result    = new Polynomial[newDeg + 1];
            var        reminder  = (Polynomial[])firstArg.Coefficients.Clone();
            Polynomial firstLc;
            Polynomial secondLc = secondArg[secondDeg];

            var inverse = new PolynomialInverse();

            secondLc = inverse.Inverse(secondLc, Mod);


            for (int i = 0; i <= newDeg; i++)
            {
                firstLc            = reminder[firstDeg - i];
                result[newDeg - i] = _polynomialMath.Mul(firstLc, secondLc);
                for (int j = 0; j <= secondDeg; j++)
                {
                    reminder[firstDeg - secondDeg + j - i] =
                        _polynomialMath.Sub(reminder[firstDeg - secondDeg + j - i], (_polynomialMath.Mul(result[newDeg - i], secondArg[j])));
                }
            }
            return(new PolynomialOverFiniteField(result, Mod, FieldChar));
        }