/// <summary>
        /// Multiplies the polynomial by an <c>IntegerPolynomial</c>,
        /// taking the indices mod <c>N</c>.
        /// </summary>
        ///
        /// <param name="Factor">A polynomial factor</param>
        ///
        /// <returns>The product of the two polynomials</returns>
        public BigIntPolynomial Multiply(BigIntPolynomial Factor)
        {
            BigIntPolynomial c = _f1.Multiply(Factor);

            c = _f2.Multiply(c);
            c.Add(_f3.Multiply(Factor));

            return(c);
        }
Ejemplo n.º 2
0
        private BigIntPolynomial MultRecursive(BigIntPolynomial Factor)
        {
            // Karatsuba multiplication
            BigInteger[] a = Coeffs;
            BigInteger[] b = Factor.Coeffs;

            int n = Factor.Coeffs.Length;

            if (n <= 1)
            {
                BigInteger[] c = (BigInteger[])Coeffs.Clone();
                for (int i = 0; i < Coeffs.Length; i++)
                {
                    c[i] = c[i].Multiply(Factor.Coeffs[0]);
                }

                return(new BigIntPolynomial(c));
            }
            else
            {
                int n1 = n / 2;

                BigIntPolynomial a1 = new BigIntPolynomial(a.CopyOf(n1));
                BigIntPolynomial a2 = new BigIntPolynomial(a.CopyOfRange(n1, n));
                BigIntPolynomial b1 = new BigIntPolynomial(b.CopyOf(n1));
                BigIntPolynomial b2 = new BigIntPolynomial(b.CopyOfRange(n1, n));

                BigIntPolynomial A = (BigIntPolynomial)a1.Clone();
                A.Add(a2);
                BigIntPolynomial B = (BigIntPolynomial)b1.Clone();
                B.Add(b2);

                BigIntPolynomial c1 = a1.MultRecursive(b1);
                BigIntPolynomial c2 = a2.MultRecursive(b2);
                BigIntPolynomial c3 = A.MultRecursive(B);
                c3.Subtract(c1);
                c3.Subtract(c2);
                BigIntPolynomial c = new BigIntPolynomial(2 * n - 1);

                for (int i = 0; i < c1.Coeffs.Length; i++)
                {
                    c.Coeffs[i] = c1.Coeffs[i];
                }
                for (int i = 0; i < c3.Coeffs.Length; i++)
                {
                    c.Coeffs[n1 + i] = c.Coeffs[n1 + i].Add(c3.Coeffs[i]);
                }
                for (int i = 0; i < c2.Coeffs.Length; i++)
                {
                    c.Coeffs[2 * n1 + i] = c.Coeffs[2 * n1 + i].Add(c2.Coeffs[i]);
                }

                return(c);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Calculates a <c>rho</c> modulo <c>m1*m2</c> from two resultants whose
        /// <c>rho</c>s are modulo <c>m1</c> and <c>m2</c>.
        /// <para><c>res</c> is set to <c>null</c>.</para>
        /// </summary>
        ///
        /// <param name="ModRes1">M1 resultant</param>
        /// <param name="ModRes2">M2 resultant</param>
        ///
        /// <returns><c>Rho</c> modulo <c>modRes1.modulus * modRes2.modulus</c>, and <c>null</c> for <c>res</c></returns>
        public static ModularResultant CombineRho(ModularResultant ModRes1, ModularResultant ModRes2)
        {
            BigInteger      mod1 = ModRes1._modulus;
            BigInteger      mod2 = ModRes2._modulus;
            BigInteger      prod = mod1.Multiply(mod2);
            BigIntEuclidean er   = BigIntEuclidean.Calculate(mod2, mod1);

            BigIntPolynomial rho1 = ModRes1.Rho.Clone();

            rho1.Multiply(er.X.Multiply(mod2));
            BigIntPolynomial rho2 = ModRes2.Rho.Clone();

            rho2.Multiply(er.Y.Multiply(mod1));
            rho1.Add(rho2);
            rho1.Mod(prod);

            return(new ModularResultant(rho1, null, prod));
        }