|
Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
|
Sparse multivariate polynomial. More...
#include <tpl_multi_polynomial.H>
Classes | |
| struct | FactorTerm |
| Factorization term: a factor polynomial with its multiplicity. More... | |
| struct | Pair_Candidate |
| struct | Pair_Candidate_Less |
| struct | Uni_Factor_Signature_Less |
| Deterministic ordering of primitive univariate factors by normalized signature. More... | |
| struct | Uni_Linear_Factor_Data |
| Primitive linear factor data \(a x + b\) for a chosen main variable. More... | |
| struct | Uni_Linear_Factor_Data_Less |
| Deterministic ordering of primitive univariate linear factors. More... | |
Public Types | |
| using | Coeff = Coefficient |
| using | Index = Array< size_t > |
| using | Order = MonomOrder |
Public Member Functions | |
| Gen_MultiPolynomial ()=default | |
| Default constructor: the zero polynomial with 0 variables. | |
| Gen_MultiPolynomial (const size_t nvars, const Coefficient &c=Coefficient{}) | |
| Constant polynomial. | |
| Gen_MultiPolynomial (const size_t nvars, const Array< size_t > &idx, const Coefficient &c) | |
| Single-term constructor. | |
| Gen_MultiPolynomial (const size_t nvars, const DynList< std::pair< Array< size_t >, Coefficient > > &ts) | |
| Construct from a list of (exponent-vector, coefficient) pairs. | |
| Gen_MultiPolynomial (const size_t nvars, std::initializer_list< std::pair< Array< size_t >, Coefficient > > ts) | |
| Construct from an initializer list of term pairs. | |
| bool | is_zero () const noexcept |
| True if this is the zero polynomial. | |
| bool | is_constant () const noexcept |
| True if constant or zero (total degree 0). | |
| size_t | num_vars () const noexcept |
| Number of variables. | |
| size_t | num_terms () const noexcept |
| Number of non-zero terms. | |
| size_t | degree () const noexcept |
| Total degree (maximum sum of exponents over all terms). | |
| size_t | degree_in (size_t var) const noexcept |
| Degree in a specific variable. | |
| std::pair< Array< size_t >, Coefficient > | leading_term () const |
| Leading term (largest monomial in the ordering). | |
| Coefficient | leading_coeff () const |
| Leading coefficient. | |
| Array< size_t > | leading_monomial () const |
| Leading monomial (exponent vector of the leading term). | |
| Coefficient | coeff_at (const Array< size_t > &idx) const |
| Read coefficient at a multi-index (0 if absent). | |
| template<class Op > | |
| void | for_each_term (Op &&op) const |
| Visit every non-zero term in ascending monomial order. | |
| template<class Op > | |
| void | for_each_term_desc (Op &&op) const |
| Visit every non-zero term in descending monomial order. | |
| DynList< std::pair< Array< size_t >, Coefficient > > | terms () const |
| All terms as a list (ascending order). | |
| void | add_to_coeff (const Array< size_t > &idx, const Coefficient &delta) |
Add delta to the coefficient at idx. | |
| void | remove_zeros () |
| Remove all terms whose coefficient is approximately zero. | |
| void | scale_inplace (const Coefficient &s) |
Multiply every coefficient by s in place. | |
| void | divide_scalar_inplace (const Coefficient &s) |
Divide every coefficient by s in place. | |
| Gen_MultiPolynomial | operator+ (const Gen_MultiPolynomial &q) const |
| Polynomial addition. | |
| Gen_MultiPolynomial & | operator+= (const Gen_MultiPolynomial &q) |
| In-place addition. | |
| Gen_MultiPolynomial | operator+ (const Coefficient &s) const |
| Add a scalar constant term. | |
| Gen_MultiPolynomial & | operator+= (const Coefficient &s) |
| In-place addition of a scalar constant term. | |
| Gen_MultiPolynomial | operator- (const Gen_MultiPolynomial &q) const |
| Polynomial subtraction. | |
| Gen_MultiPolynomial & | operator-= (const Gen_MultiPolynomial &q) |
| In-place subtraction. | |
| Gen_MultiPolynomial | operator- (const Coefficient &s) const |
| Subtract a scalar constant term. | |
| Gen_MultiPolynomial & | operator-= (const Coefficient &s) |
| In-place subtraction of a scalar constant term. | |
| Gen_MultiPolynomial | operator- () const |
| Unary negation. | |
| Gen_MultiPolynomial | operator* (const Gen_MultiPolynomial &q) const |
| Polynomial multiplication. | |
| Gen_MultiPolynomial & | operator*= (const Gen_MultiPolynomial &q) |
| In-place polynomial multiplication. | |
| Gen_MultiPolynomial | operator* (const Coefficient &s) const |
| Multiply by a scalar. | |
| Gen_MultiPolynomial & | operator*= (const Coefficient &s) |
| In-place scalar multiplication. | |
| Gen_MultiPolynomial | operator/ (const Coefficient &s) const |
| Divide by a scalar. | |
| Gen_MultiPolynomial & | operator/= (const Coefficient &s) |
| In-place scalar division. | |
| Gen_MultiPolynomial | pow (size_t n) const |
| Exponentiation \(p^n\) by repeated squaring. | |
| Coefficient | eval (const Array< Coefficient > &pt) const |
| Evaluate at a point. | |
| Coefficient | operator() (const Array< Coefficient > &pt) const |
| Evaluate at a point (function-call syntax). | |
| bool | operator== (const Gen_MultiPolynomial &q) const |
| Polynomial equality. | |
| bool | operator!= (const Gen_MultiPolynomial &q) const |
| Polynomial inequality. | |
| std::string | to_str (const DynList< std::string > &names=DynList< std::string >()) const |
| Human-readable string. | |
| Gen_MultiPolynomial | promote (size_t new_nv) const |
| Promote to a polynomial with more variables. | |
| Gen_MultiPolynomial | partial (size_t var, size_t n=1) const |
| Partial derivative with respect to a variable. | |
| Array< Gen_MultiPolynomial > | gradient () const |
| Gradient vector: array of all first-order partial derivatives. | |
| Array< Array< Gen_MultiPolynomial > > | hessian () const |
| Hessian matrix: all second-order partial derivatives. | |
| Array< Coefficient > | eval_gradient (const Array< Coefficient > &pt) const |
| Evaluate gradient at a point. | |
| Array< Array< Coefficient > > | eval_hessian (const Array< Coefficient > &pt) const |
| Evaluate Hessian at a point. | |
| std::string | to_json () const |
| Serialize polynomial to JSON string. | |
| void | to_binary (std::ostream &out) const |
| Serialize polynomial to binary stream. | |
| Array< Coefficient > | eval_batch (const Array< Array< Coefficient > > &pts) const |
| Evaluate polynomial at multiple points (with parallelism support). | |
| std::pair< Array< Gen_MultiPolynomial >, Gen_MultiPolynomial > | divmod (const Array< Gen_MultiPolynomial > &divisors) const |
| Multivariate division with remainder (Buchberger algorithm). | |
| Gen_MultiPolynomial | reduce_modulo (const Array< Gen_MultiPolynomial > &divisors) const |
| Polynomial reduction modulo an ideal (one-liner). | |
| Coefficient | content () const |
| Content of a multivariate polynomial: GCD of all coefficients. | |
| Gen_MultiPolynomial | primitive_part () const |
| Primitive part: polynomial divided by its content. | |
| Gen_Polynomial< Coefficient > | homomorphic_eval (size_t keep_var, const Array< Coefficient > &eval_pts) const |
| Homomorphic evaluation: reduce to univariate by substitution. | |
| DynList< FactorTerm > | factorize () const |
| Main multivariate factorization over the integers. | |
Private Types | |
| using | Pair_Key = std::pair< size_t, size_t > |
| using | Pair_Registry = DynMapTree< Pair_Key, bool > |
| using | Pair_Queue = DynBinHeap< Pair_Candidate, Pair_Candidate_Less > |
Private Member Functions | |
| Array< size_t > | norm (const Array< size_t > &idx) const |
| Pad an index to nvars_ trailing zeros. | |
Private Attributes | |
| size_t | nvars_ = 0 |
| DynMapTree< Array< size_t >, Coefficient, Avl_Tree, MonomOrder > | coeffs |
Sparse multivariate polynomial.
Represents a polynomial in \(n\) variables \(x_0, x_1, \ldots, x_{n-1}\) over a coefficient ring. Terms are stored in a balanced BST keyed by exponent vectors, ordered according to the monomial ordering MonomOrder.
| Coefficient | Coefficient type (default double). |
| MonomOrder | Strict-weak-order functor on Array<size_t> (default Grevlex_Order). |
Definition at line 322 of file tpl_multi_polynomial.H.
| using Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Coeff = Coefficient |
Definition at line 679 of file tpl_multi_polynomial.H.
| using Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Index = Array<size_t> |
Definition at line 680 of file tpl_multi_polynomial.H.
| using Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Order = MonomOrder |
Definition at line 681 of file tpl_multi_polynomial.H.
|
private |
Definition at line 368 of file tpl_multi_polynomial.H.
|
private |
Definition at line 406 of file tpl_multi_polynomial.H.
|
private |
Definition at line 369 of file tpl_multi_polynomial.H.
|
default |
Default constructor: the zero polynomial with 0 variables.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::gradient(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::hessian(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_power(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::interpolate(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::monomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::primitive_part(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::variable().
|
inlineexplicit |
Constant polynomial.
| [in] | nvars | Number of variables. |
| [in] | c | Constant value (default 0). |
Definition at line 721 of file tpl_multi_polynomial.H.
|
inline |
Single-term constructor.
| [in] | nvars | Number of variables. |
| [in] | idx | Exponent vector. |
| [in] | c | Coefficient. |
Definition at line 733 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::norm().
|
inline |
Construct from a list of (exponent-vector, coefficient) pairs.
| [in] | nvars | Number of variables. |
| [in] | ts | Term list. |
Definition at line 744 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), and Aleph::divide_and_conquer_partition_dp().
|
inline |
Construct from an initializer list of term pairs.
| [in] | nvars | Number of variables. |
| [in] | ts | Initializer list of {exponent-vector, coefficient}. |
Definition at line 757 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), and Aleph::divide_and_conquer_partition_dp().
|
inlinestatic |
Append value to vals if it is not already present.
Definition at line 3277 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inlinestatic |
Build a monic affine linear factor from root data.
Given root values of the kept variable at a base point and slopes for the remaining variables, constructs: x_main - (sum_i slope_i * x_i + intercept).
Definition at line 3498 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::divide_and_conquer_partition_dp(), and Aleph::intercept().
|
inlinestatic |
Build a primitive affine linear factor from specialized coefficients.
Given factors of the form \(a x_{\text{main}} + b(\mathbf{u})\) at a base specialization point, reconstructs:
\[ a x_{\text{main}} + \sum_i c_i u_i + d \]
where each \(c_i\) is the change in the specialized constant term after incrementing the corresponding variable by one.
Definition at line 3378 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::divide_and_conquer_partition_dp(), and Aleph::intercept().
|
inlinestatic |
Build the full homomorphic-evaluation point from active-variable coordinates.
Definition at line 3700 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inlinestatic |
Build a regular interpolation grid for the active non-main variables.
Definition at line 3648 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Array< T >::reserve().
|
inlinestatic |
Expand, primitive-normalize, and group factors by degree in a stable order.
Definition at line 3758 of file tpl_multi_polynomial.H.
References cmp(), Aleph::divide_and_conquer_partition_dp(), Aleph::in_place_sort(), and Aleph::size().
|
inlinestatic |
Collect primitive linear factors from a univariate factorization in stable order.
Definition at line 3306 of file tpl_multi_polynomial.H.
References Aleph::Array< T >::append(), Aleph::divide_and_conquer_partition_dp(), and m.
|
inlinestatic |
Collect unique roots of monic linear factors from a univariate factorization.
Definition at line 3332 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inlinestatic |
Count active variables (positive degree) and remember the last one seen.
Definition at line 3355 of file tpl_multi_polynomial.H.
References Aleph::count(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::degree_in(), Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::num_vars().
|
inlinestatic |
Decode a flat tensor-grid index into coordinates (last dimension fastest).
Definition at line 3685 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Array< T >::size().
|
inlinestaticprivate |
Test whether divisor divides f exactly over Z[x1,...,xn].
Uses the multivariate division algorithm directly and accepts the divisor only when the remainder is exactly zero.
Definition at line 4327 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::degree(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), and r.
|
inlinestatic |
Embed a coefficient polynomial in the ambient ring and multiply by x_main^exp.
Definition at line 3786 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::divide_and_conquer_partition_dp(), and exp().
|
inlinestatic |
Embed a univariate polynomial into the multivariate ring.
| [in] | u | Univariate polynomial. |
| [in] | nv | Number of variables in the target ring. |
| [in] | x_var | Variable index for the univariate variable. |
u in variable x_var. Definition at line 3262 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::divide_and_conquer_partition_dp(), exp(), and Aleph::Gen_Polynomial< Coefficient >::for_each_term().
|
inlinestaticnoexcept |
Return the evaluation-array position corresponding to variable var.
Definition at line 3349 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inlinestaticprivate |
Evaluate a monomial \(x^\alpha\) at a point.
Definition at line 4280 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::multi_poly_detail::int_power(), and Aleph::Array< T >::size().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit_ridge(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit_weighted().
|
inlinestaticprivate |
Compute exact quotient f / divisor over Z[x1,...,xn].
Uses the public multivariate division algorithm and returns the quotient only when the remainder vanishes exactly.
Definition at line 4347 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::num_vars(), and r.
|
inlinestatic |
Expand a univariate factorization into individual factors.
Definition at line 3712 of file tpl_multi_polynomial.H.
References Aleph::Array< T >::append(), Aleph::divide_and_conquer_partition_dp(), and m.
|
inlinestatic |
Factor a polynomial that is effectively univariate in one variable.
Projects the polynomial onto the active variable, delegates to the univariate integer factorizer, and embeds the factors back into the ambient multivariate ring while preserving multiplicities.
Definition at line 3948 of file tpl_multi_polynomial.H.
References Aleph::DynList< T >::append(), Aleph::divide_and_conquer_partition_dp(), exp(), Aleph::Gen_Polynomial< Coefficient >::for_each_term(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::FactorTerm::multiplicity.
|
inlinestatic |
Reconstruct primitive factors by interpolation across specialization grids.
Factors are grouped by degree in the main variable and ordered deterministically by their univariate coefficient signatures at each specialization point. When that slot ordering remains consistent across the grid, each primitive factor can be interpolated back into the ambient ring and then verified by exact division.
Definition at line 3813 of file tpl_multi_polynomial.H.
References Aleph::and, Aleph::Array< T >::append(), Aleph::divide_and_conquer_partition_dp(), exp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::interpolate(), and Aleph::size().
|
inlinestaticprivate |
Count elements in a DynList.
Definition at line 4314 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inlinestatic |
Recursive search for an affine linear multivariate lift.
Definition at line 3532 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inlinestaticprivate |
Substitute a single variable with a scalar value.
Definition at line 4294 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::multi_poly_detail::int_power(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
|
inlinestatic |
Try to extract a monic affine linear factor via multivariate lifting.
Definition at line 3618 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inlinestatic |
Try to extract an exact non-linear factor via coefficient interpolation.
Definition at line 3915 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inlinestatic |
Try to lift a monic affine linear factor for a fixed main variable.
Definition at line 3572 of file tpl_multi_polynomial.H.
References Aleph::and, Aleph::Array< T >::append(), and Aleph::divide_and_conquer_partition_dp().
|
inlinestatic |
Try to lift a primitive affine linear factor from specialized coefficients.
Definition at line 3415 of file tpl_multi_polynomial.H.
References Aleph::and, Aleph::Array< T >::append(), Aleph::divide_and_conquer_partition_dp(), and Aleph::size().
|
inline |
Add delta to the coefficient at idx.
Inserts the term if absent; removes it if the result is zero.
| [in] | idx | Exponent vector. |
| [in] | delta | Value to add. |
Definition at line 961 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::norm().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_build_affine_factor(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_build_affine_factor_from_linear_data(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_embed_coeff_poly_as_x_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_embed_univariate(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_substitute_var(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit_parallel(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit_ridge(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit_weighted(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::from_binary(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::from_json(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator+=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator+=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator-=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator-=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::partial(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestaticprivate |
Definition at line 574 of file tpl_multi_polynomial.H.
References Aleph::and, Aleph::Array< T >::append(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_equal_polynomial(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::make_monic_inplace(), r, and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::remove_zero_and_duplicates().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis().
|
inlinestaticprivate |
Definition at line 486 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_equal_polynomial(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::make_monic_inplace(), and r.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis().
|
inlinestaticprivatenoexcept |
Definition at line 371 of file tpl_multi_polynomial.H.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::enqueue_pair_if_needed(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::lcm_pair_less(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::make_pair_candidate(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::pair_is_recorded(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::pop_best_pair().
|
inline |
Read coefficient at a multi-index (0 if absent).
| [in] | idx | Exponent vector. |
Coefficient{} if the term is absent. Definition at line 896 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::norm().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator==(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestaticnoexcept |
Test whether a coefficient is (approximately) zero.
| [in] | c | Coefficient to test. |
c is zero (within epsilon for floats). Definition at line 702 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::epsilon().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divide_scalar_inplace(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit_parallel(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit_ridge(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::fit_weighted(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::homomorphic_eval(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::interpolate(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::make_monic_inplace(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator/(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator==(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::partial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::primitive_part(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::remove_zeros(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::scale_inplace(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_str().
|
inlinestaticprivate |
Definition at line 345 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduce_groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduced_generators(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::remove_zero_and_duplicates().
|
inlinestatic |
Test whether ideal I contains ideal J: I ⊇ J.
An ideal I contains ideal J if and only if every generator of J belongs to I. Uses a precomputed Gröbner basis of I for efficiency.
| [in] | I_gens | Generators of ideal I (non-empty, no zeros). |
| [in] | J_gens | Generators of ideal J (non-empty, no zeros). |
| std::domain_error | if either ideal is empty or contains zero |
| std::invalid_argument | if nvars mismatch |
Definition at line 2973 of file tpl_multi_polynomial.H.
References ah_domain_error_if, ah_invalid_argument_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and remainder().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideals_equal(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inline |
Content of a multivariate polynomial: GCD of all coefficients.
For \(f = \sum_\alpha c_\alpha x^\alpha\), the content is \(\gcd(c_{\alpha_1}, c_{\alpha_2}, \ldots)\).
For the zero polynomial, returns zero. The sign follows the leading coefficient so that primitive_part() has a positive leading coefficient.
Definition at line 3142 of file tpl_multi_polynomial.H.
References Aleph::and, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_coeff().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::primitive_part(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinenoexcept |
Total degree (maximum sum of exponents over all terms).
Definition at line 830 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), and Aleph::multi_poly_detail::total_degree().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_divides_exactly(), main(), TEST(), TEST(), and TEST().
|
inlinenoexcept |
Degree in a specific variable.
| [in] | var | Variable index (0-based). |
var over all terms. Definition at line 843 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, and Aleph::Array< T >::size().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_count_active_vars(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::factorize(), and main().
|
inline |
Divide every coefficient by s in place.
| [in] | s | Scalar divisor (must not be zero). |
| std::domain_error | if s is zero. |
Definition at line 1021 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::remove_zeros().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator/=().
|
inline |
Multivariate division with remainder (Buchberger algorithm).
Divides this polynomial by the array of divisors and returns quotients and remainder. Each divisor must be non-zero and have the same number of variables as this polynomial.
| [in] | divisors | Array of non-zero divisor polynomials. |
| std::domain_error | if divisors is empty or contains a zero polynomial |
| std::invalid_argument | if a non-zero divisor has mismatched nvars |
Definition at line 2531 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), ah_domain_error_if, ah_invalid_argument_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), Aleph::multi_poly_detail::divides_index(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::monomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, r, and Aleph::multi_poly_detail::sub_indices().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_divides_exactly(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_exact_quotient(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduce_groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduced_generators(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_ideal(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::reduce_modulo(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestaticprivate |
Definition at line 460 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::canonical_pair(), Aleph::divide_and_conquer_partition_dp(), Aleph::DynBinHeap< T, Compare >::insert(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_monomials_coprime(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::pair_is_recorded(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::redundant_pair_by_chain_criterion().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::rebuild_groebner_pair_state().
|
inlinestaticconstexprnoexcept |
Machine epsilon for floating-point coefficients.
Definition at line 690 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero().
|
inline |
Evaluate at a point.
| [in] | pt | Array of values, one per variable. |
| std::domain_error | if pt has fewer elements than num_vars(). |
Definition at line 1303 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::multi_poly_detail::int_power(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Array< T >::size().
Referenced by Aleph::analyze_fit(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval_batch(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval_hessian(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator()(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inline |
Evaluate polynomial at multiple points (with parallelism support).
| [in] | pts | Array of evaluation points. |
Definition at line 2372 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval().
Referenced by TEST().
|
inline |
Evaluate gradient at a point.
| [in] | pt | Evaluation point (array of size >= num_vars). |
| std::domain_error | if pt.size() < num_vars(). |
Definition at line 2035 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::gradient(), k, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Array< T >::size().
|
inline |
Evaluate Hessian at a point.
| [in] | pt | Evaluation point (array of size >= num_vars). |
pt.| std::domain_error | if pt.size() < num_vars(). |
Definition at line 2056 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::hessian(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Array< T >::size().
|
inlinestatic |
Factor recombination: find true factors from lifted candidates.
Given candidate factors from specialization-based lifting, tests exact divisibility against the current remainder and extracts any verified factors it finds.
| [in] | f | Polynomial to factor (primitive). |
| [in] | candidates | Array of candidate factors from Hensel lifting. |
Definition at line 3987 of file tpl_multi_polynomial.H.
References Aleph::and, Aleph::DynList< T >::append(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_constant(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), k, Aleph::product(), and Aleph::HTList::size().
|
inline |
Main multivariate factorization over the integers.
Combines content extraction, exact affine/non-linear factor lifting from specializations, homomorphic evaluation (reduction to univariate), univariate factorization (Layer 5), and factor recombination to factor a multivariate polynomial over \(\mathbb{Z}\).
Algorithm outline:
factorize() from Layer 5. Definition at line 4117 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::and, Aleph::DynList< T >::append(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::degree_in(), Aleph::divide_and_conquer_partition_dp(), LocateFunctions< Container, Type >::get_it(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::homomorphic_eval(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_constant(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), and m.
Referenced by main(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestatic |
Basic least-squares polynomial fitting.
Minimizes: \(\sum_i (y_i - p(x_i))^2\)
| [in] | data | Array of (point, value) pairs. |
| [in] | nvars | Number of variables. |
| [in] | basis | Array of monomial exponent vectors (basis monomials). |
| std::domain_error | if data or basis is empty, or normal equations singular. |
Definition at line 1516 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_eval_monomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), k, m, OhashCommon< HashTbl, Key >::size(), and y.
Referenced by TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestatic |
Parallel least-squares fitting.
Builds design matrix rows in parallel; solves normal equations sequentially.
| [in] | data | Array of (point, value) pairs. |
| [in] | nvars | Number of variables. |
| [in] | basis | Array of monomial exponent vectors. |
| std::domain_error | if data/basis empty or normal equations singular. |
Definition at line 2398 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), Aleph::multi_poly_detail::eval_monomial(), k, m, Aleph::pmaps(), OhashCommon< HashTbl, Key >::size(), and y.
Referenced by TEST().
|
inlinestatic |
Regularized least-squares fitting with automatic GCV-based lambda selection.
Solves Tikhonov ridge regression: \(\min_c ||Ac - y||^2 + \lambda ||c||^2\) Automatically selects \(\lambda\) via Generalized Cross-Validation (GCV).
| [in] | data | Array of (point, value) pairs. |
| [in] | nvars | Number of variables. |
| [in] | basis | Array of monomial exponent vectors (basis monomials). |
| [out] | lambda_used | If non-null, receives the selected regularization parameter. |
| [out] | gcv_score | If non-null, receives the GCV score at selected lambda. |
| std::domain_error | if data/basis empty or normal equations singular. |
Definition at line 1749 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_eval_monomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), k, m, pred, OhashCommon< HashTbl, Key >::size(), and y.
|
inlinestatic |
Weighted least-squares polynomial fitting.
Production-grade fitting with per-point weights for importance-weighted regression. Minimizes: \(\sum_i w_i (y_i - p(x_i))^2\)
| [in] | data | Array of (point, value) pairs. |
| [in] | nvars | Number of variables. |
| [in] | basis | Array of monomial exponent vectors (basis monomials). |
| [in] | weights | Per-point weights (size must equal data.size()). |
| std::domain_error | if data/basis empty or weights size mismatch. |
Definition at line 1628 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_eval_monomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), k, m, and OhashCommon< HashTbl, Key >::size().
Referenced by TEST().
|
inline |
Visit every non-zero term in ascending monomial order.
| [in] | op | Callable void(const Array<size_t>&, const Coefficient&). |
Definition at line 910 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_substitute_var(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::homomorphic_eval(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator+=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator-(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator-=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator/(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator==(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::partial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::primitive_part(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::promote(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::terms(), TEST(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_binary(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_json().
|
inline |
Visit every non-zero term in descending monomial order.
| [in] | op | Callable void(const Array<size_t>&, const Coefficient&). |
Definition at line 923 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), and Aleph::DynList< T >::insert().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_str().
|
inlinestatic |
Deserialize polynomial from binary stream.
Reads format created by to_binary().
| [in] | in | Input stream. |
| std::ios_base::failure | if read fails or format is invalid. |
Definition at line 2329 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::divide_and_conquer_partition_dp(), and exp().
|
inlinestatic |
Deserialize from JSON.
Parses format created by to_json().
| [in] | s | JSON string. |
| std::domain_error | if JSON format is invalid. |
| std::invalid_argument | if coefficient conversion fails (from std::stod). |
| std::out_of_range | if coefficient value is out of range (from std::stod). |
Definition at line 2236 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), ah_domain_error_if, Aleph::and, Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
|
inline |
Gradient vector: array of all first-order partial derivatives.
Definition at line 1993 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), k, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::partial().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval_gradient(), TEST(), TEST(), and TEST().
|
inlinestatic |
Gröbner basis computation via Buchberger's algorithm.
Computes a Gröbner basis of the ideal generated by the input polynomials using a Buchberger-style algorithm with criterion B1 (coprime LMs), Buchberger's chain criterion for known-zero pairs, prioritized pair selection by lcm leading monomial, and incremental basis autoreduction whenever a new non-zero remainder is added. Generators are first made monic and autoreduced to remove exact duplicates and obvious ideal members before pair processing.
| [in] | generators | Array of generator polynomials (may contain zero). |
| std::domain_error | if generators is empty or contains zero polynomials |
| std::domain_error | if iteration limit (10000) is exceeded |
Definition at line 2657 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduce_groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduced_generators(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::canonical_pair(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_equal_polynomial(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), GraphCommon< GT, Node, Arc >::is_empty(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_monomials_coprime(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::make_monic_inplace(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::pop_best_pair(), r, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::rebuild_groebner_pair_state(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::redundant_pair_by_chain_criterion(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::s_poly().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_ideal(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_member(), main(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::reduced_groebner_basis(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inline |
Hessian matrix: all second-order partial derivatives.
Definition at line 2009 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::partial().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval_hessian(), TEST(), TEST(), TEST(), and TEST().
|
inline |
Homomorphic evaluation: reduce to univariate by substitution.
Substitutes all variables except keep_var with values from eval_pts, producing a univariate polynomial in \(x_{\text{keep\_var}}\).
| [in] | keep_var | Index of the variable to keep (0-based). |
| [in] | eval_pts | Array of size num_vars()-1 with substitution values, ordered by variable index (skipping keep_var). |
| std::domain_error | if keep_var >= num_vars(). |
| std::domain_error | if eval_pts.size() != num_vars()-1. |
Definition at line 3225 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_Polynomial< Coefficient >::get_coeff(), Aleph::multi_poly_detail::int_power(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Gen_Polynomial< Coefficient >::set_coeff().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::factorize(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestatic |
Test membership in an ideal via Gröbner basis.
A polynomial belongs to the ideal generated by the given generators if and only if its remainder modulo a Gröbner basis of the ideal is zero.
| [in] | f | Polynomial to test. |
| [in] | generators | Array of generator polynomials. |
f is in the ideal; false otherwise. | std::domain_error | if generators is empty or contains zero polynomials |
| std::domain_error | if iteration limit is exceeded |
Definition at line 2815 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis().
Referenced by main(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::radical_member(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestatic |
Power of an ideal: I^n = I · I · ... · I (n times).
Computes the nth power of an ideal by repeated ideal multiplication. Special cases: I^0 = ⟨1⟩ (the unit ideal), I^1 = I.
| [in] | gens | Generator polynomials (non-empty, no zeros). |
| [in] | n | Exponent (non-negative integer). |
| std::domain_error | if gens is empty or contains zero |
n. Definition at line 2927 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), ah_domain_error_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_product(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero().
|
inlinestatic |
Product of two ideals: I · J = ⟨a_i · b_j : a_i ∈ I, b_j ∈ J⟩.
Computes all pairwise products of generators from two ideals. The result is a set of |a| × |b| polynomials (may contain duplicates).
| [in] | a | First ideal generators (non-empty, no zeros). |
| [in] | b | Second ideal generators (non-empty, no zeros). |
| std::domain_error | if a or b is empty |
| std::domain_error | if any generator is zero |
| std::invalid_argument | if nvars mismatch |
Definition at line 2884 of file tpl_multi_polynomial.H.
References ah_domain_error_if, ah_invalid_argument_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), k, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Array< T >::size().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_power(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestatic |
Sum of two ideals: I + J = ⟨generators(I) ∪ generators(J)⟩.
Concatenates the generators of two ideals to form their sum. No Gröbner computation is performed; the result is the union of generators.
| [in] | a | First ideal generators (non-empty, no zeros). |
| [in] | b | Second ideal generators (non-empty, no zeros). |
| std::domain_error | if a or b is empty |
| std::domain_error | if any generator in a or b is zero |
| std::invalid_argument | if nvars mismatch between a and b |
Definition at line 2841 of file tpl_multi_polynomial.H.
References ah_domain_error_if, ah_invalid_argument_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Array< T >::size().
|
inlinestatic |
Test equality of two ideals: I = J.
Two ideals are equal if and only if each contains the other. Equivalent to: contains_ideal(I, J) && contains_ideal(J, I).
| [in] | I_gens | Generators of ideal I (non-empty, no zeros). |
| [in] | J_gens | Generators of ideal J (non-empty, no zeros). |
| std::domain_error | if either ideal is empty or contains zero |
| std::invalid_argument | if nvars mismatch |
Definition at line 3025 of file tpl_multi_polynomial.H.
References ah_domain_error_if, ah_invalid_argument_if, Aleph::and, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_ideal(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
|
inlinestatic |
Multivariate interpolation via Newton divided differences (Chung-Yao).
Constructs a polynomial that passes through all points in a tensor-product grid. Uses dimension-by-dimension Newton divided-differences table.
| [in] | grid | Array of size num_vars; grid[d] is array of nodes in dimension d (must be distinct). |
| [in] | values | Array of function values on the grid (must have size = product of grid sizes). |
| [in] | nvars | Number of variables. |
| std::domain_error | if grid sizes don't match data size, or duplicate nodes found. |
Definition at line 2090 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), dim(), Aleph::divide_and_conquer_partition_dp(), m, nodes, Aleph::Array< T >::size(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::variable().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_interpolated_factors_for_main_var(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinenoexcept |
True if constant or zero (total degree 0).
Definition at line 806 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, and Aleph::multi_poly_detail::is_zero_index().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::factor_recombination(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::factorize(), main(), TEST(), TEST(), and TEST().
|
inlinenoexcept |
True if this is the zero polynomial.
Definition at line 800 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_divides_exactly(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduce_groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_ideal(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::content(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::factor_recombination(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::factorize(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_power(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_product(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_sum(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideals_equal(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_term(), main(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::primitive_part(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::radical_member(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::remove_zero_and_duplicates(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_str().
|
inlinestaticprivate |
Definition at line 384 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::canonical_pair(), and Aleph::divide_and_conquer_partition_dp().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Pair_Candidate_Less::operator()().
|
inline |
Leading coefficient.
| std::domain_error | if the polynomial is zero. |
Definition at line 874 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_term().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::content(), and main().
|
inline |
Leading monomial (exponent vector of the leading term).
| std::domain_error | if the polynomial is zero. |
Definition at line 883 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_term().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::minimize_groebner_basis().
|
inlinestaticprivatenoexcept |
Definition at line 354 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::enqueue_pair_if_needed(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis().
|
inline |
Leading term (largest monomial in the ordering).
| std::domain_error | if the polynomial is zero. |
Definition at line 863 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), and m.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_coeff(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_monomial(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestaticprivate |
Definition at line 334 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), and Aleph::divide_and_conquer_partition_dp().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduce_groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduced_generators(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::reduced_groebner_basis().
|
inlinestaticprivate |
Definition at line 418 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::canonical_pair(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Pair_Candidate::i, Aleph::multi_poly_detail::lcm_indices(), and Aleph::multi_poly_detail::total_degree().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::rebuild_groebner_pair_state().
|
inlinestaticprivate |
Definition at line 515 of file tpl_multi_polynomial.H.
References Aleph::Array< T >::append(), Aleph::divide_and_conquer_partition_dp(), Aleph::multi_poly_detail::divides_index(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_monomial(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::reduced_groebner_basis().
|
inlinestatic |
A single monomial \(c \, x^{\alpha}\).
| [in] | nvars | Number of variables. |
| [in] | idx | Exponent vector \(\alpha\). |
| [in] | c | Coefficient (default 1). |
Definition at line 788 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), and Aleph::divide_and_conquer_partition_dp().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), main(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::radical_member(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::s_poly(), and TEST().
|
inlineprivate |
Pad an index to nvars_ trailing zeros.
Definition at line 329 of file tpl_multi_polynomial.H.
References Aleph::multi_poly_detail::extend_index(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_at().
|
inlinenoexcept |
Number of non-zero terms.
Definition at line 822 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs.
Referenced by main(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator==(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_binary().
|
inlinenoexcept |
Number of variables.
Definition at line 816 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_count_active_vars(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_exact_quotient(), main(), Aleph::operator-(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inline |
Polynomial inequality.
Definition at line 1361 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp().
|
inline |
Evaluate at a point (function-call syntax).
| [in] | pt | Array of values. |
| std::domain_error | if pt has fewer elements than num_vars(). |
Definition at line 1331 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval().
|
inline |
Multiply by a scalar.
| [in] | s | Scalar. |
Definition at line 1216 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and r.
|
inline |
Polynomial multiplication.
| [in] | q | Multiplicand. |
Definition at line 1167 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::multi_poly_detail::add_indices(), Aleph::divide_and_conquer_partition_dp(), Aleph::multi_poly_detail::extend_index(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::num_terms(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and r.
|
inline |
In-place scalar multiplication.
| [in] | s | Scalar. |
*this. Definition at line 1235 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::scale_inplace().
|
inline |
In-place polynomial multiplication.
| [in] | q | Multiplicand. |
*this. Definition at line 1202 of file tpl_multi_polynomial.H.
|
inline |
Add a scalar constant term.
| [in] | s | Scalar addend. |
s. Definition at line 1073 of file tpl_multi_polynomial.H.
References r.
|
inline |
Polynomial addition.
| [in] | q | Addend. |
Definition at line 1042 of file tpl_multi_polynomial.H.
References r.
|
inline |
In-place addition of a scalar constant term.
| [in] | s | Scalar addend. |
*this. Definition at line 1084 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
|
inline |
In-place addition.
| [in] | q | Addend. |
*this. Definition at line 1053 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::scale_inplace().
|
inline |
Unary negation.
Definition at line 1145 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and r.
|
inline |
Subtract a scalar constant term.
| [in] | s | Scalar subtrahend. |
s. Definition at line 1125 of file tpl_multi_polynomial.H.
References r.
|
inline |
Polynomial subtraction.
| [in] | q | Subtrahend. |
Definition at line 1094 of file tpl_multi_polynomial.H.
References r.
|
inline |
In-place subtraction of a scalar constant term.
| [in] | s | Scalar subtrahend. |
*this. Definition at line 1136 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
|
inline |
In-place subtraction.
| [in] | q | Subtrahend. |
*this. Definition at line 1105 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
|
inline |
Divide by a scalar.
| [in] | s | Scalar divisor (must not be zero). |
| std::domain_error | if s is zero. |
Definition at line 1246 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and r.
|
inline |
In-place scalar division.
| [in] | s | Scalar divisor (must not be zero). |
*this. | std::domain_error | if s is zero. |
Definition at line 1266 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divide_scalar_inplace().
|
inline |
Polynomial equality.
| [in] | q | Other polynomial. |
Definition at line 1344 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_at(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), Aleph::eq(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::num_terms().
|
inlinestaticprivate |
Definition at line 408 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::canonical_pair(), and Aleph::DynMapTree< Key, Data, Tree, Compare >::contains().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::enqueue_pair_if_needed(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::pair_is_zero_known().
|
inlinestaticprivate |
Definition at line 413 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::pair_is_recorded().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::redundant_pair_by_chain_criterion().
|
inline |
Partial derivative with respect to a variable.
Computes \(\frac{\partial^n p}{\partial x_{\text{var}}^n}\) using the falling factorial rule.
| [in] | var | Variable index (0-based). |
| [in] | n | Order of derivative (default 1). |
| std::domain_error | if var >= num_vars(). |
Definition at line 1962 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::multi_poly_detail::decrement_index_at(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), k, and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::gradient(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::hessian(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestaticprivate |
Definition at line 451 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::canonical_pair(), Aleph::divide_and_conquer_partition_dp(), Aleph::DynBinHeap< T, Compare >::getMin(), and Aleph::GenBinHeap< NodeType, Key, Compare >::is_empty().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis().
|
inline |
Exponentiation \(p^n\) by repeated squaring.
| [in] | n | Exponent. |
n == 0. Definition at line 1280 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
|
inline |
Primitive part: polynomial divided by its content.
Returns \(f / \text{content}(f)\). The result has \(\gcd\) of coefficients equal to 1 and positive leading coefficient.
is_zero().Definition at line 3178 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::content(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and r.
Referenced by TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inline |
Promote to a polynomial with more variables.
All existing terms are padded with trailing-zero exponents.
| [in] | new_nv | New number of variables (>= current num_vars). |
| std::domain_error | if new_nv < num_vars(). |
Definition at line 1481 of file tpl_multi_polynomial.H.
References ah_domain_error_if, Aleph::divide_and_conquer_partition_dp(), Aleph::multi_poly_detail::extend_index(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and r.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::radical_member(), and TEST().
|
inlinestatic |
Test membership in radical of ideal: f ∈ √I.
Uses the Rabinowitsch trick: f ∈ √I (radical of I in k[x₀,...,x_{n−1}]) if and only if 1 ∈ I + ⟨1 − y·f⟩ in k[x₀,...,x_{n−1}, y]. Returns true if the augmented ideal contains 1.
| [in] | f | Polynomial to test (nvars must match generators if non-zero). |
| [in] | gens | Generators of ideal I (non-empty, no zeros). |
| std::domain_error | if gens is empty or contains zero |
| std::invalid_argument | if f is non-zero with mismatched nvars |
Definition at line 3069 of file tpl_multi_polynomial.H.
References ah_domain_error_if, ah_invalid_argument_if, Aleph::and, Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_member(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::monomial(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::promote().
Referenced by TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestaticprivate |
Definition at line 646 of file tpl_multi_polynomial.H.
References Aleph::Array< T >::append(), Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::enqueue_pair_if_needed(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::make_pair_candidate(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis().
|
inline |
Polynomial reduction modulo an ideal (one-liner).
Reduces this polynomial modulo a set of divisor polynomials by computing the division remainder.
| [in] | divisors | Array of divisor polynomials. |
| std::domain_error | if divisors is empty |
Definition at line 2795 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod().
|
inlinestatic |
Reduced Gröbner basis (minimized and normalized).
Computes a Gröbner basis and then reduces it by:
| [in] | generators | Array of generator polynomials. |
| std::domain_error | if generators is empty or contains zero polynomials |
| std::domain_error | if iteration limit is exceeded |
Definition at line 2746 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::make_monic_inplace(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::minimize_groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, r, and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::remove_zero_and_duplicates().
Referenced by main(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inlinestaticprivate |
Definition at line 430 of file tpl_multi_polynomial.H.
References Aleph::and, Aleph::divide_and_conquer_partition_dp(), Aleph::multi_poly_detail::divides_index(), k, and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::pair_is_zero_known().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::enqueue_pair_if_needed(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis().
|
inlinestaticprivate |
Definition at line 559 of file tpl_multi_polynomial.H.
References Aleph::Array< T >::append(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_equal_polynomial(), Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::autoreduce_groebner_basis(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::reduced_groebner_basis().
|
inline |
Remove all terms whose coefficient is approximately zero.
Definition at line 979 of file tpl_multi_polynomial.H.
References Aleph::DynList< T >::append(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), and k.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divide_scalar_inplace(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::scale_inplace().
|
inlinestatic |
S-polynomial (Sylvester polynomial) of two polynomials.
Computes the S-polynomial used in Buchberger's algorithm: S(f, g) = (lcm(lm(f), lm(g)) / lm(f)) * f - (lcm(lm(f), lm(g)) / lm(g)) * g
| [in] | f | First polynomial (non-zero). |
| [in] | g | Second polynomial (non-zero). |
| std::domain_error | if f or g is zero |
| std::invalid_argument | if f and g have different number of variables |
Definition at line 2606 of file tpl_multi_polynomial.H.
References ah_domain_error_if, ah_invalid_argument_if, Aleph::divide_and_conquer_partition_dp(), gamma(), Aleph::multi_poly_detail::lcm_indices(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::monomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::multi_poly_detail::sub_indices().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
inline |
Multiply every coefficient by s in place.
| [in] | s | Scalar. |
Definition at line 997 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeffs, Aleph::divide_and_conquer_partition_dp(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::remove_zeros().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*=(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator+=().
|
inline |
All terms as a list (ascending order).
Definition at line 940 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), and r.
Referenced by TEST().
|
inline |
Serialize polynomial to binary stream.
Format: nvars (uint64) | n_terms (uint64) | ( exponents (uint64×nvars) | coeff (double) )×n_terms
| [out] | out | Output stream. |
| std::ios_base::failure | if write fails. |
Definition at line 2300 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), exp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::num_terms(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_.
|
inline |
Serialize polynomial to JSON string.
Format: {"nvars":n,"terms":[{"e":[...exponents...],"c":coeff},...]}.
Definition at line 2200 of file tpl_multi_polynomial.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Array< T >::size().
|
inline |
Human-readable string.
Uses variable names x, y, z for up to 3 variables, or x0, x1, ... for more. Custom names can be supplied via names.
| [in] | names | Optional variable-name list. |
"3*x^2*y - 2". Definition at line 1378 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_is_zero(), Aleph::divide_and_conquer_partition_dp(), FunctionalMethods< Container, T >::for_each(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term_desc(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::multi_poly_detail::is_zero_index(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::nvars_, and Aleph::Array< T >::size().
Referenced by main(), Aleph::operator<<(), print_result(), TEST(), and TEST().
|
inlinestatic |
The polynomial \(x_i\) (a single variable).
| [in] | nvars | Number of variables. |
| [in] | var | Variable index (0-based). |
Definition at line 774 of file tpl_multi_polynomial.H.
References Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), ah_domain_error_if, and Aleph::divide_and_conquer_partition_dp().
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::interpolate(), main(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().
|
private |
Definition at line 326 of file tpl_multi_polynomial.H.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::Gen_MultiPolynomial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::add_to_coeff(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::coeff_at(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::content(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::degree(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::degree_in(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divide_scalar_inplace(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::for_each_term_desc(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_constant(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::is_zero(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::leading_term(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::num_terms(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator-=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::primitive_part(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::remove_zeros(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::scale_inplace().
|
private |
Definition at line 324 of file tpl_multi_polynomial.H.
Referenced by Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::_substitute_var(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::contains_ideal(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::divmod(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval_gradient(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::eval_hessian(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::from_json(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::gradient(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::hessian(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::homomorphic_eval(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_product(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideal_sum(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::ideals_equal(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::minimize_groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::norm(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::num_vars(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator*(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator+=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator+=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator-(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator-=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator-=(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::operator/(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::partial(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::pow(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::primitive_part(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::promote(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::rebuild_groebner_pair_state(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::reduced_groebner_basis(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::s_poly(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_binary(), Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_json(), and Aleph::Gen_MultiPolynomial< Coefficient, MonomOrder >::to_str().