Ejemplo n.º 1
0
        /// <summary>
        /// Method for calculatin (<paramref name="r"/>, <paramref name="s"/>) Hasse derivative value for bivariate polynomial <paramref name="polynomial"/> at point the (<paramref name="xValue"/>, <paramref name="yValue"/>)
        /// </summary>
        /// <param name="polynomial">Polynomial which Hasse derivative'll be calculated</param>
        /// <param name="r">Hasse derivative order by x variable</param>
        /// <param name="s">Hasse derivative order by y variable</param>
        /// <param name="xValue">Value for x variable</param>
        /// <param name="yValue">Value fro y variable</param>
        /// <param name="combinationsCountCalculator">Combinations calculator contract implementation</param>
        /// <param name="combinationsCache">Cache for storing calculated numbers of combinations</param>
        /// <returns>Hasse derivative value</returns>
        public static FieldElement CalculateHasseDerivative(this BiVariablePolynomial polynomial,
                                                            int r, int s, FieldElement xValue, FieldElement yValue,
                                                            ICombinationsCountCalculator combinationsCountCalculator, FieldElement[][] combinationsCache = null)
        {
            var field           = polynomial.Field;
            var derivativeValue = 0;

            foreach (var coefficient in polynomial)
            {
                if (coefficient.Key.Item1 < r || coefficient.Key.Item2 < s)
                {
                    continue;
                }

                var currentAddition = combinationsCountCalculator.Calculate(field, coefficient.Key.Item1, r, combinationsCache).Representation;
                currentAddition = field.Multiply(currentAddition,
                                                 combinationsCountCalculator.Calculate(field, coefficient.Key.Item2, s, combinationsCache).Representation);
                currentAddition = field.Multiply(currentAddition, coefficient.Value.Representation);
                currentAddition = field.Multiply(currentAddition, field.Pow(xValue.Representation, coefficient.Key.Item1 - r));
                currentAddition = field.Multiply(currentAddition, field.Pow(yValue.Representation, coefficient.Key.Item2 - s));

                derivativeValue = field.Add(derivativeValue, currentAddition);
            }

            return(new FieldElement(field, derivativeValue));
        }
        /// <summary>
        /// Constructor for creating interpolation polynomial builder based on Kotter's algorithm
        /// </summary>
        /// <param name="combinationsCountCalculator">Implementation of combinations count calculator contract</param>
        public KotterAlgorithmBasedBuilder(ICombinationsCountCalculator combinationsCountCalculator)
        {
            if (combinationsCountCalculator == null)
            {
                throw new ArgumentNullException(nameof(combinationsCountCalculator));
            }

            _combinationsCountCalculator = combinationsCountCalculator;

            _zeroMonomial = new Tuple <int, int>(0, 0);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Constructor for creating instance of interpolation polynomial builder
        /// </summary>
        /// <param name="combinationsCountCalculator">Implementation of combinations count calculator contract</param>
        /// <param name="linearSystemSolver">Implementation of linear systems solver contract</param>
        public SimplePolynomialBuilder(ICombinationsCountCalculator combinationsCountCalculator, ILinearSystemSolver linearSystemSolver)
        {
            if (combinationsCountCalculator == null)
            {
                throw new ArgumentNullException(nameof(combinationsCountCalculator));
            }
            if (linearSystemSolver == null)
            {
                throw new ArgumentNullException(nameof(linearSystemSolver));
            }

            _combinationsCountCalculator = combinationsCountCalculator;
            _linearSystemSolver          = linearSystemSolver;
        }
 public BiVariablePolynomialTests()
 {
     _combinationsCountCalculator = new PascalsTriangleBasedCalcualtor();
 }