/// <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); }
/// <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(); }