16MultiPoly MultiPoly::eval(
const std::string& var,
const Rational& val)
const
19 for (
size_t i = 0; i < vars_.size(); ++i) {
20 if (vars_[i] == var) {
21 var_idx =
static_cast<int>(i);
29 std::vector<std::string> new_vars;
30 new_vars.reserve(vars_.size() - 1);
31 for (
size_t i = 0; i < vars_.size(); ++i) {
32 if (
static_cast<int>(i) != var_idx) {
33 new_vars.push_back(vars_[i]);
37 std::vector<Term> new_terms;
38 new_terms.reserve(terms_.size());
40 for (
const auto& term : terms_) {
41 int exp = (
static_cast<size_t>(var_idx) < term.first.size())
42 ? term.first[var_idx] : 0;
49 new_coeff = new_coeff * val.power(BigInt(
exp));
52 reduced_mono.reserve(vars_.size() - 1);
53 for (
size_t i = 0; i < term.first.size(); ++i) {
54 if (
static_cast<int>(i) != var_idx) {
55 reduced_mono.push_back(term.first[i]);
59 new_terms.emplace_back(std::move(reduced_mono), std::move(new_coeff));
62 return MultiPoly(std::move(new_terms), std::move(new_vars), order_);
73MultiPoly MultiPoly::eval(
const std::map<std::string, Rational>& substitution)
const
75 MultiPoly result = *
this;
76 for (
const auto& [var, val] : substitution) {
77 result = result.eval(var, val);
94 if (!is_univariate()) {
95 throw std::invalid_argument(
96 "MultiPoly::to_univariate: polynomial is not univariate");
103 for (
size_t vi = 0; vi < vars_.size(); ++vi) {
104 for (
const auto& term : terms_) {
105 if (vi < term.first.size() && term.first[vi] != 0) {
106 active_idx =
static_cast<int>(vi);
110 if (active_idx >= 0)
break;
112 std::string var_name = vars_.empty() ?
"x" : vars_[0];
113 if (active_idx < 0) {
118 var_name = vars_[
static_cast<size_t>(active_idx)];
121 for (
const auto& term : terms_) {
122 int exp = term.first[
static_cast<size_t>(active_idx)];
123 if (
exp > max_deg) max_deg =
exp;
125 std::vector<Rational> coeffs(
static_cast<size_t>(max_deg + 1),
Rational(0));
126 for (
const auto& term : terms_) {
127 int exp = term.first[
static_cast<size_t>(active_idx)];
128 coeffs[
static_cast<size_t>(
exp)] = term.second;
144 const std::string& var)
146 std::vector<std::string>
vars = {var};
148 if (poly.is_zero()) {
149 return MultiPoly(std::vector<Term>{},
vars);
152 std::vector<Term> terms;
153 for (
size_t i = 0; i < poly.coeffs.size(); ++i) {
154 if (!poly.coeffs[i].is_zero()) {
155 Monomial mono = {
static_cast<int>(i)};
156 terms.emplace_back(std::move(mono), poly.coeffs[i]);
160 return MultiPoly(std::move(terms), std::move(
vars));
多元多项式类 MultiPoly,稀疏表示,支持任意数量变量上的环运算。
ExprResult exp(const ExprPtr &expression, ComputationContext &context)
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数
__attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorField gradient(const std const std::vector< std::string > & vars
@ Rational
Rational numbers
const VectorField const VectorField & c