9 for (
auto& coefficient : polynomial.
coeffs) {
10 coefficient = coefficient * scalar;
17 BigInt common_denominator(1);
18 for (
const auto& coefficient : polynomial.
coeffs) {
19 common_denominator *= coefficient.get_denominator();
21 for (
auto& coefficient : polynomial.
coeffs) {
22 coefficient = Rational(
23 coefficient.get_numerator() *
24 (common_denominator / coefficient.get_denominator()));
37 void add(std::size_t x_degree, std::size_t y_degree,
38 const Rational& coefficient) {
39 if (coefficient == Rational(0))
return;
44 coefficients[x_degree].resize(y_degree + 1, Rational(0));
61 const Poly& numerator,
70 "fraction-free resultant encountered a zero divisor",
74 if (!division.second.is_zero()) {
77 "fraction-free resultant division was not exact",
85 for (std::size_t x = 0; x < input.
coefficients.size(); ++x) {
86 for (std::size_t y = 0; y < input.
coefficients[x].size(); ++y) {
95 for (std::size_t x = 0; x < input.
coefficients.size(); ++x) {
96 for (std::size_t y = 0; y < input.
coefficients[x].size(); ++y) {
105 const Rational& scalar) {
106 for (std::size_t x = 0; x < source.
coefficients.size(); ++x) {
107 for (std::size_t y = 0; y < source.
coefficients[x].size(); ++y) {
115 power_real.
add(0, 0, Rational(1));
119 for (std::size_t degree = 0; degree < polynomial.
coeffs.size(); ++degree) {
122 polynomial.
coeffs[degree]);
128 power_real = std::move(next_real);
129 power_imaginary = std::move(next_imaginary);
136 const std::string& remaining_variable) {
137 std::size_t maximum_y = 0;
138 for (
const auto& x_coefficients : polynomial.
coefficients) {
139 if (!x_coefficients.empty()) {
140 maximum_y = std::max(maximum_y, x_coefficients.size() - 1);
143 std::vector<Poly> result(maximum_y + 1,
Poly(remaining_variable));
144 for (std::size_t x = 0; x < polynomial.
coefficients.size(); ++x) {
145 for (std::size_t y = 0; y < polynomial.
coefficients[x].size(); ++y) {
146 if (result[y].coeffs.size() <= x) {
147 result[y].coeffs.resize(x + 1, Rational(0));
152 while (result.size() > 1 && result.back().is_zero()) result.pop_back();
158 const std::string& remaining_variable) {
159 std::vector<Poly> result(
160 std::max<std::size_t>(1, polynomial.
coefficients.size()),
161 Poly(remaining_variable));
162 for (std::size_t x = 0; x < polynomial.
coefficients.size(); ++x) {
163 if (result[x].coeffs.size() < polynomial.
coefficients[x].size()) {
164 result[x].coeffs.resize(
167 for (std::size_t y = 0; y < polynomial.
coefficients[x].size(); ++y) {
172 while (result.size() > 1 && result.back().is_zero()) result.pop_back();
177 const std::vector<Poly>&
right,
179 const std::size_t left_degree = left.size() - 1;
180 const std::size_t right_degree =
right.size() - 1;
181 const std::size_t size = left_degree + right_degree;
183 for (std::size_t row = 0; row < right_degree; ++row) {
184 for (std::size_t column = 0; column <= left_degree; ++column) {
185 matrix[row][row + column] = left[left_degree - column];
188 for (std::size_t row = 0; row < left_degree; ++row) {
189 for (std::size_t column = 0; column <= right_degree; ++column) {
190 matrix[right_degree + row][row + column] =
191 right[right_degree - column];
198 PolyMatrix& matrix, std::size_t pivot, std::size_t row,
201 for (std::size_t column = pivot + 1; column < matrix.size(); ++column) {
202 Poly numerator = matrix[row][column] * matrix[pivot][pivot] -
203 matrix[row][pivot] * matrix[pivot][column];
208 matrix[row][column] = std::move(quotient.value());
210 matrix[row][column] = std::move(numerator);
213 matrix[row][pivot] =
Poly(matrix[pivot][pivot].variable_name);
221 int determinant_sign = 1;
222 for (std::size_t pivot = 0; pivot + 1 < matrix.size(); ++pivot) {
232 determinant_sign = -determinant_sign;
234 const Poly pivot_value = matrix[pivot][pivot];
235 for (std::size_t row = pivot + 1; row < matrix.size(); ++row) {
240 previous = pivot_value;
242 Poly determinant = std::move(matrix.back().back());
243 if (determinant_sign < 0) {
244 determinant =
scale_poly(std::move(determinant), Rational(-1));
251 if (coefficients.empty()) {
254 return coefficients.size() == 1 && coefficients[0].is_zero();
258 std::vector<Poly> left, std::vector<Poly>
right,
261 while (left.size() > 1 && left.back().is_zero()) {
264 while (
right.size() > 1 &&
right.back().is_zero()) {
270 const std::size_t size = left.size() +
right.size() - 2;
287 const ComplexBivariate parts = complex_bivariate_parts(polynomial);
288 auto real = sylvester_resultant(
289 coefficients_in_y(parts.real,
"_re"),
290 coefficients_in_y(parts.imaginary,
"_re"),
293 auto imaginary = sylvester_resultant(
294 coefficients_in_x(parts.real,
"_im"),
295 coefficients_in_x(parts.imaginary,
"_im"),
298 if (
real.
value().degree() <= 0 || imaginary.value().degree() <= 0) {
301 "complex coordinate resultant was identically zero",
operation);
304 real.
value().square_free_part().make_monic(),
305 imaginary.value().square_free_part().make_monic()});
std::pair< Polynomial, Polynomial > div_mod(const Polynomial &other) const
多项式带余除法
std::vector< CoeffType > coeffs
系数数组,coeffs[i] 为 x^i 的系数
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
bool zero_projection_polynomial(const std::vector< Poly > &coefficients)
ComplexBivariate complex_bivariate_parts(const Poly &polynomial)
std::vector< Poly > coefficients_in_y(const BiPolynomial &polynomial, const std::string &remaining_variable)
PolyMatrix sylvester_matrix(const std::vector< Poly > &left, const std::vector< Poly > &right, const std::string &variable)
Result< Poly > sylvester_resultant(std::vector< Poly > left, std::vector< Poly > right, const std::string &variable, ComputationContext &context, const std::string &operation)
Result< Poly > resultant_determinant(PolyMatrix matrix, const std::string &variable, ComputationContext &context, const std::string &operation)
void add_scaled(BiPolynomial &destination, const BiPolynomial &source, const Rational &scalar)
Result< Poly > exact_poly_divide(const Poly &numerator, const Poly &denominator, ComputationContext &context, const std::string &operation)
std::vector< std::vector< Poly > > PolyMatrix
BiPolynomial shift_y(const BiPolynomial &input)
BiPolynomial shift_x(const BiPolynomial &input)
Result< void > eliminate_resultant_row(PolyMatrix &matrix, std::size_t pivot, std::size_t row, const Poly &previous, ComputationContext &context, const std::string &operation)
Poly constant_poly(const Rational &value, const std::string &variable)
std::vector< Poly > coefficients_in_x(const BiPolynomial &polynomial, const std::string &remaining_variable)
Poly clear_denominators(Poly polynomial)
Polynomial< Rational > Poly
Result< CoordinateProjections > coordinate_projections(const Poly &polynomial, ComputationContext &context, const std::string &operation)
Poly scale_poly(Poly polynomial, const Rational &scalar)
const std::string & variable
const std::string const SymbolicNodePtr & replacement
ComputationContext const std::string & operation
std::size_t std::size_t ComputationContext & context
ExprResult real(const ExprPtr &expression, ComputationContext &context)
const std::string const ExprPtr & value
const ExprPtr & denominator
void add(std::size_t x_degree, std::size_t y_degree, const Rational &coefficient)
std::vector< std::vector< Rational > > coefficients