| // Copyright 2016 The Fuchsia Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_ALGORITHMS_FORCULUS_POLYNOMIAL_COMPUTATIONS_H_ |
| #define COBALT_ALGORITHMS_FORCULUS_POLYNOMIAL_COMPUTATIONS_H_ |
| |
| #include <vector> |
| |
| #include "algorithms/forculus/field_element.h" |
| |
| namespace cobalt { |
| namespace forculus { |
| |
| // Some utility functions for computing with polynomials over the Forculus |
| // field. |
| |
| // Computes f(x) where f is the polynomial c0 + c1*x + c2*x^2 + ... cn*x^n |
| // where n = coefficients.size() and ci = coefficients[i]. |
| FieldElement Evaluate(const std::vector<FieldElement>& coefficients, |
| FieldElement x); |
| |
| // Computes the constant term c0 of the unique polynomial of degree d that |
| // passes through the points (x0, y0), (x1, y1), ... (x_{d}, y_{d}) |
| // xi = x_values[i], yi = y_values[i] and d = x_values.size() - 1. |
| // REQUIRES: x_values.size() == y_value.size() and the x_values are distinct. |
| FieldElement InterpolateConstant( |
| const std::vector<const FieldElement*>& x_values, |
| const std::vector<const FieldElement*>& y_values); |
| |
| } // namespace forculus |
| } // namespace cobalt |
| |
| #endif // COBALT_ALGORITHMS_FORCULUS_POLYNOMIAL_COMPUTATIONS_H_ |