コード例 #1
0
ファイル: Polynomial.cs プロジェクト: mahdiz/mpclib
        public virtual Polynomial divideWithRemainder(Polynomial p)
        {
            if (Coefficients.Count == 0 || p.Coefficients.Count == 0)
                return null; //null

            var answer = new Polynomial[2];
            int prime = Coefficients[0].Prime;
            int m = Degree;
            int n = p.Degree;

            if (m < n)
                return null;

            var quotient = new Zp[m - n + 1];
            var coeffs = new Zp[m + 1];

            for (int k = 0; k <= m; k++)
                coeffs[k] = new Zp(Coefficients[k]);

            var norm = p.Coefficients[n].MultipInverse;
            for (int k = m - n; k >= 0; k--)
            {
                quotient[k] = new Zp(prime, coeffs[n + k].Value * norm.Value);
                for (int j = n + k - 1; j >= k; j--)
                    coeffs[j] = new Zp(prime,
                        coeffs[j].Value - quotient[k].Value * p.Coefficients[j - k].Value);
            }

            var remainder = new Zp[n];
            for (int k = 0; k < n; k++)
                remainder[k] = new Zp(coeffs[k]);

            answer[0] = new Polynomial(quotient);
            answer[1] = new Polynomial(remainder);
            foreach (Zp zp in answer[1].Coefficients)
            {
                if (zp.Value != 0)
                    return null;
            }
            return answer[0];
        }
コード例 #2
0
ファイル: Polynomial.cs プロジェクト: mahdiz/mpclib
        public virtual Polynomial multiply(Polynomial p)
        {
            Debug.Assert(Degree > p.Degree && Coefficients.Count > 0);

            int prime = Coefficients[0].Prime;
            var coeffs = new SortedDictionary<int, Zp>();

            for (int deg1 = 0; deg1 <= Degree; deg1++)
            {
                for (int deg2 = 0; deg2 <= p.Degree; deg2++)
                {
                    int deg = deg1 + deg2;
                    var curr = coeffs[deg];
                    var newValue = new Zp(prime, Coefficients[deg1].Value * p.Coefficients[deg2].Value);

                    if (curr == null)
                        curr = newValue;
                    else
                        curr = new Zp(prime, curr.Value + newValue.Value);
                    coeffs[deg] = curr;
                }
            }
            return new Polynomial(new List<Zp>(coeffs.Values));
        }