LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::multivariate_checked_detail 命名空间参考

类

struct  LinearAssignments
struct  LinearSamples

函数

static Result< void > append_primitive_factor (MultiFactorResult &result, const MultiPoly &raw, int multiplicity)
MultiFactorCheckedResult assemble_checked_factorization (const MultiPoly &original, const std::vector< MultiPoly > &factors, const std::vector< int > &multiplicities, Completeness completeness, std::string reason)
static Result< bool > collect_linear_samples (const LinearSamples &input, std::vector< std::vector< Rational > > &samples)
static Result< bool > enumerate_linear_assignments (LinearAssignments &search, size_t index)
std::optional< MultiFactorCheckedResult > factor_evaluated_linear (const MultiPoly &original, const MultiPoly &primitive, const std::string &main_variable, ComputationContext &context)
static std::optional< MultiFactorCheckedResult > factor_linear_assignments (const MultiPoly &original, const LinearSamples &input)
static std::optional< MultiFactorCheckedResult > factor_linear_hensel (const MultiPoly &poly, const MultiPoly &primitive, const std::string &main_variable, const std::vector< std::string > &auxiliary_variables, const std::map< std::string, Rational > &zero_evaluation, MathResult< std::vector< Polynomial< Rational > > > &base_value, ComputationContext &context)
static MultiPoly linear_assignment_factor (const LinearAssignments &search, size_t factor_index)
static bool restore_specialization_unit (const MultiPoly &poly, const std::string &main_var, const std::map< std::string, Rational > &eval_points, std::vector< Polynomial< Rational > > &univariate_factors)
static Result< bool > verify_linear_assignment (LinearAssignments &search)

类说明

◆ LMCAS::multivariate_checked_detail::LinearAssignments

struct LMCAS::multivariate_checked_detail::LinearAssignments

在文件 multivariate_factor_evaluation.cpp 第 65 行定义.

LMCAS::multivariate_checked_detail::LinearAssignments 的协作图:
类成员
vector< vector< size_t > > assignments
vector< MultiPoly > found_factors
const LinearSamples & input
const vector< vector< Rational > > & samples

◆ LMCAS::multivariate_checked_detail::LinearSamples

struct LMCAS::multivariate_checked_detail::LinearSamples

在文件 multivariate_factor_evaluation.cpp 第 33 行定义.

LMCAS::multivariate_checked_detail::LinearSamples 的协作图:
类成员
const vector< string > & auxiliary
const vector< Rational > & base_constants
ComputationContext & context
const string & main_variable
const MultiPoly & primitive
const map< string, Rational > & zero_evaluation

函数说明

◆ append_primitive_factor()

Result< void > LMCAS::multivariate_checked_detail::append_primitive_factor ( MultiFactorResult & result,
const MultiPoly & raw,
int multiplicity )
static

在文件 multivariate_factor_checked.cpp 第 12 行定义.

13 {
14 if (multiplicity <= 0) {
16 "因子重数必须为正", "factor_multivariate");
17 }
18 if (raw.is_zero() || raw.is_constant()) return Result<void>::success();
19 MultiPoly factor = raw.make_primitive();
20 if (!factor.terms().empty() && factor.terms()[0].second < Rational(0)) {
21 factor = factor * Rational(-1);
22 }
23 auto existing = std::find(result.factors.begin(), result.factors.end(), factor);
24 if (existing == result.factors.end()) {
25 result.factors.push_back(std::move(factor));
26 result.multiplicities.push_back(multiplicity);
27 } else {
28 const auto index = static_cast<size_t>(existing - result.factors.begin());
29 result.multiplicities[index] += multiplicity;
30 }
31 return Result<void>::success();
32}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
std::size_t std::size_t multiplicity
std::vector< MultiPoly > factors
精确因子列表(各因子本原)
std::vector< int > multiplicities
各因子的重数

引用了 append_primitive_factor(), LMCAS::MultiFactorResult::factors, LMCAS::Result< T >::failure(), LMCAS::InternalInvariant, LMCAS::MultiFactorResult::multiplicities , 以及 LMCAS::Result< T >::success().

被这些函数引用 append_primitive_factor() , 以及 assemble_checked_factorization().

函数调用图:
这是这个函数的调用关系图:

◆ assemble_checked_factorization()

MultiFactorCheckedResult LMCAS::multivariate_checked_detail::assemble_checked_factorization ( const MultiPoly & original,
const std::vector< MultiPoly > & factors,
const std::vector< int > & multiplicities,
Completeness completeness,
std::string reason )

在文件 multivariate_factor_checked.cpp 第 34 行定义.

40{
41 constexpr const char* operation = "factor_multivariate";
42 if (original.is_zero()) {
43 if (!raw_factors.empty()) {
45 CasErrc::InternalInvariant, "零多项式收到非空因子列表", operation);
46 }
49 MultiFactorResult{Rational(0), {}, {}},
50 completeness, std::move(reason)});
51 }
52
53 MultiFactorResult result;
54 for (size_t i = 0; i < raw_factors.size(); ++i) {
55 const int multiplicity = i < raw_multiplicities.size() ? raw_multiplicities[i] : 1;
56 auto appended = append_primitive_factor(result, raw_factors[i], multiplicity);
57 if (!appended) return MultiFactorCheckedResult::failure(appended.error());
58 }
59 MultiPoly product(Rational(1), original.variables());
60 for (size_t i = 0; i < result.factors.size(); ++i) {
61 for (int power = 0; power < result.multiplicities[i]; ++power) {
62 product = product * result.factors[i];
63 }
64 }
65 MultiPoly quotient = original.exact_div(product);
66 if (!quotient.is_constant() || quotient.terms().empty()) {
69 "因子乘积与输入只差常数的不变量失效", operation);
70 }
71 result.constant = quotient.terms()[0].second;
72 if (product * result.constant != original) {
74 CasErrc::InternalInvariant, "最终因子未精确重构输入", operation);
75 }
77 MathResult<MultiFactorResult>{
78 std::move(result), completeness, std::move(reason)});
79}
static Result< void > append_primitive_factor(MultiFactorResult &result, const MultiPoly &raw, int multiplicity)
@ Rational
Rational numbers

引用了 append_primitive_factor(), assemble_checked_factorization(), LMCAS::MultiFactorResult::constant, LMCAS::MultiFactorResult::factors, LMCAS::Result< MathResult< MultiFactorResult > >::failure(), LMCAS::InternalInvariant, LMCAS::MultiFactorResult::multiplicities , 以及 LMCAS::Result< MathResult< MultiFactorResult > >::success().

被这些函数引用 assemble_checked_factorization(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_binomial_power(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_common_monomial(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_difference_of_squares(), LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_embedded_univariate(), factor_linear_assignments(), factor_linear_hensel(), LMCAS::factor_multivariate_checked() , 以及 LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_multivariate_impl().

函数调用图:
这是这个函数的调用关系图:

◆ collect_linear_samples()

Result< bool > LMCAS::multivariate_checked_detail::collect_linear_samples ( const LinearSamples & input,
std::vector< std::vector< Rational > > & samples )
static

在文件 multivariate_factor_evaluation.cpp 第 42 行定义.

43 {
44 const size_t factor_count = input.base_constants.size();
45 for (const auto& variable : input.auxiliary) {
46 auto sample = input.zero_evaluation;
47 sample[variable] = Rational(1);
48 MultiPoly evaluated = input.primitive.eval(sample);
49 if (evaluated.degree(input.main_variable) != input.primitive.degree(input.main_variable)) {
50 return Result<bool>::success(false);
51 }
52 auto factored = factor_univariate_bridge_checked(evaluated.to_univariate(), input.context);
53 if (!factored) { return Result<bool>::failure(factored.error()); }
54 if (factored.value().value.size() != factor_count) { return Result<bool>::success(false); }
55 std::vector<Rational> constants;
56 for (const auto& factor : factored.value().value) {
57 if (factor.degree() != 1) { return Result<bool>::success(false); }
58 constants.push_back(factor.make_monic().coeffs[0]);
59 }
60 samples.push_back(std::move(constants));
61 }
62 return Result<bool>::success(true);
63}
const std::string & variable
UnivariateFactorResult factor_univariate_bridge_checked(const Polynomial< Rational > &polynomial, ComputationContext &context)

引用了 LMCAS::multivariate_checked_detail::LinearSamples::auxiliary, LMCAS::multivariate_checked_detail::LinearSamples::base_constants, collect_linear_samples(), LMCAS::multivariate_checked_detail::LinearSamples::context, LMCAS::factor_univariate_bridge_checked(), LMCAS::Result< T >::failure(), LMCAS::multivariate_checked_detail::LinearSamples::main_variable, LMCAS::multivariate_checked_detail::LinearSamples::primitive, LMCAS::Result< T >::success(), LMCAS::variable , 以及 LMCAS::multivariate_checked_detail::LinearSamples::zero_evaluation.

被这些函数引用 collect_linear_samples() , 以及 factor_linear_assignments().

函数调用图:
这是这个函数的调用关系图:

◆ enumerate_linear_assignments()

Result< bool > LMCAS::multivariate_checked_detail::enumerate_linear_assignments ( LinearAssignments & search,
size_t index )
static

在文件 multivariate_factor_evaluation.cpp 第 117 行定义.

117 {
118 if (index == search.assignments.size()) { return verify_linear_assignment(search); }
119 auto& permutation = search.assignments[index];
120 std::sort(permutation.begin(), permutation.end());
121 do {
122 auto found = enumerate_linear_assignments(search, index + 1);
123 if (!found || found.value()) { return found; }
124 } while (std::next_permutation(permutation.begin(), permutation.end()));
125 return Result<bool>::success(false);
126}
static Result< bool > enumerate_linear_assignments(LinearAssignments &search, size_t index)
static Result< bool > verify_linear_assignment(LinearAssignments &search)

引用了 LMCAS::multivariate_checked_detail::LinearAssignments::assignments, enumerate_linear_assignments(), LMCAS::Result< T >::success() , 以及 verify_linear_assignment().

被这些函数引用 enumerate_linear_assignments() , 以及 factor_linear_assignments().

函数调用图:
这是这个函数的调用关系图:

◆ factor_evaluated_linear()

std::optional< MultiFactorCheckedResult > LMCAS::multivariate_checked_detail::factor_evaluated_linear ( const MultiPoly & original,
const MultiPoly & primitive,
const std::string & main_variable,
ComputationContext & context )

在文件 multivariate_factor_evaluation.cpp 第 182 行定义.

184 {
185 const auto& variables = primitive.variables();
186 std::vector<std::string> auxiliary_variables;
187 for (const auto& variable : variables) {
188 if (variable != main_variable) { auxiliary_variables.push_back(variable); }
189 }
190 std::map<std::string, Rational> zero_evaluation;
191 for (const auto& variable : auxiliary_variables) {
192 zero_evaluation[variable] = Rational(0);
193 }
194 MultiPoly evaluated = primitive.eval(zero_evaluation);
195 if (evaluated.degree(main_variable) != primitive.degree(main_variable)) { return std::nullopt; }
196 Polynomial<Rational> base_poly = evaluated.to_univariate();
197 auto base_result =
199 if (!base_result) {
200 return MultiFactorCheckedResult::failure(base_result.error());
201 }
202 auto base_value = std::move(base_result.value());
203 bool all_linear = base_value.value.size() > 1;
204 for (const auto& factor : base_value.value) {
205 all_linear = all_linear && factor.degree() == 1;
206 }
207 if (!all_linear) { return std::nullopt; }
208 if (auxiliary_variables.size() == 1) {
209 auto hensel = factor_linear_hensel(poly, primitive, main_variable,
210 auxiliary_variables, zero_evaluation, base_value, context);
211 if (hensel) { return hensel; }
212 }
213 std::vector<Rational> base_constants;
214 for (const auto& factor : base_value.value) {
215 base_constants.push_back(factor.make_monic().coeffs[0]);
216 }
217 LinearSamples input{primitive, main_variable, auxiliary_variables,
218 zero_evaluation, base_constants, context};
219 return factor_linear_assignments(poly, input);
220}
static std::optional< MultiFactorCheckedResult > factor_linear_hensel(const MultiPoly &poly, const MultiPoly &primitive, const std::string &main_variable, const std::vector< std::string > &auxiliary_variables, const std::map< std::string, Rational > &zero_evaluation, MathResult< std::vector< Polynomial< Rational > > > &base_value, ComputationContext &context)
static std::optional< MultiFactorCheckedResult > factor_linear_assignments(const MultiPoly &original, const LinearSamples &input)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context

引用了 LMCAS::context, factor_evaluated_linear(), factor_linear_assignments(), factor_linear_hensel(), LMCAS::factor_univariate_bridge_checked(), LMCAS::Result< MathResult< MultiFactorResult > >::failure() , 以及 LMCAS::variable.

被这些函数引用 factor_evaluated_linear() , 以及 LMCAS::anonymous_namespace{multivariate_factor_checked.cpp}::factor_multivariate_impl().

函数调用图:
这是这个函数的调用关系图:

◆ factor_linear_assignments()

std::optional< MultiFactorCheckedResult > LMCAS::multivariate_checked_detail::factor_linear_assignments ( const MultiPoly & original,
const LinearSamples & input )
static

在文件 multivariate_factor_evaluation.cpp 第 128 行定义.

129 {
130 std::vector<std::vector<Rational>> samples;
131 auto collected = collect_linear_samples(input, samples);
132 if (!collected) { return MultiFactorCheckedResult::failure(collected.error()); }
133 if (!collected.value()) { return std::nullopt; }
134 LinearAssignments search{input, samples,
135 std::vector<std::vector<size_t>>(input.auxiliary.size(),
136 std::vector<size_t>(input.base_constants.size())), {}};
137 for (auto& assignment : search.assignments) {
138 for (size_t i = 0; i < assignment.size(); ++i) assignment[i] = i;
139 }
140 auto found = enumerate_linear_assignments(search, 0);
141 if (!found) { return MultiFactorCheckedResult::failure(found.error()); }
142 if (!found.value()) { return std::nullopt; }
143 return assemble_checked_factorization(original, search.found_factors,
144 std::vector<int>(search.found_factors.size(), 1), Completeness::Complete, {});
145}
static Result< bool > collect_linear_samples(const LinearSamples &input, std::vector< std::vector< Rational > > &samples)
MultiFactorCheckedResult assemble_checked_factorization(const MultiPoly &original, const std::vector< MultiPoly > &factors, const std::vector< int > &multiplicities, Completeness completeness, std::string reason)

引用了 assemble_checked_factorization(), LMCAS::multivariate_checked_detail::LinearAssignments::assignments, LMCAS::multivariate_checked_detail::LinearSamples::auxiliary, LMCAS::multivariate_checked_detail::LinearSamples::base_constants, collect_linear_samples(), LMCAS::Complete, enumerate_linear_assignments(), factor_linear_assignments(), LMCAS::Result< MathResult< MultiFactorResult > >::failure() , 以及 LMCAS::multivariate_checked_detail::LinearAssignments::found_factors.

被这些函数引用 factor_evaluated_linear() , 以及 factor_linear_assignments().

函数调用图:
这是这个函数的调用关系图:

◆ factor_linear_hensel()

std::optional< MultiFactorCheckedResult > LMCAS::multivariate_checked_detail::factor_linear_hensel ( const MultiPoly & poly,
const MultiPoly & primitive,
const std::string & main_variable,
const std::vector< std::string > & auxiliary_variables,
const std::map< std::string, Rational > & zero_evaluation,
MathResult< std::vector< Polynomial< Rational > > > & base_value,
ComputationContext & context )
static

在文件 multivariate_factor_evaluation.cpp 第 147 行定义.

151 {
152 constexpr const char* operation = "factor_multivariate";
153 const auto& variables = primitive.variables();
154 auto hensel_step = context.consume_steps(
155 static_cast<size_t>(
156 std::max(1, primitive.degree(auxiliary_variables[0]))),
157 operation);
158 if (!hensel_step) {
159 return MultiFactorCheckedResult::failure(hensel_step.error());
160 }
161 std::vector<Polynomial<Rational>> prepared = base_value.value;
163 primitive, main_variable, zero_evaluation, prepared)) { return std::nullopt; }
164 auto lifted = multivariate_hensel_lift(
165 primitive, prepared, auxiliary_variables[0], Rational(0),
166 primitive.degree(auxiliary_variables[0]));
167 MultiPoly lifted_product(Rational(1), variables);
168 for (const auto& factor : lifted) {
169 lifted_product = lifted_product * factor;
170 }
171 if (lifted.size() > 1 && lifted_product == primitive) {
172 const bool all_linear = std::all_of(lifted.begin(), lifted.end(),
173 [](const MultiPoly& factor) { return factor.total_degree() == 1; });
175 poly, lifted, std::vector<int>(lifted.size(), 1),
177 all_linear ? std::string{} : "提升因子的不可约性尚未证明");
178 }
179 return std::nullopt;
180}
static bool restore_specialization_unit(const MultiPoly &poly, const std::string &main_var, const std::map< std::string, Rational > &eval_points, std::vector< Polynomial< Rational > > &univariate_factors)
std::vector< MultiPoly > multivariate_hensel_lift(const MultiPoly &poly, const std::vector< Polynomial< Rational > > &univariate_factors, const std::string &lift_var, const Rational &eval_point, int degree_bound)
多元 Hensel 提升(单变量步)

引用了 assemble_checked_factorization(), LMCAS::Complete, LMCAS::context, factor_linear_hensel(), LMCAS::Result< MathResult< MultiFactorResult > >::failure(), LMCAS::Inconclusive, LMCAS::multivariate_hensel_lift() , 以及 restore_specialization_unit().

被这些函数引用 factor_evaluated_linear() , 以及 factor_linear_hensel().

函数调用图:
这是这个函数的调用关系图:

◆ linear_assignment_factor()

MultiPoly LMCAS::multivariate_checked_detail::linear_assignment_factor ( const LinearAssignments & search,
size_t factor_index )
static

在文件 multivariate_factor_evaluation.cpp 第 72 行定义.

72 {
73 const auto& variables = search.input.primitive.variables();
74 std::vector<MultiPoly::Term> terms;
75 Monomial main_monomial(variables.size(), 0);
76 const size_t main_index = static_cast<size_t>(std::find(
77 variables.begin(), variables.end(), search.input.main_variable) - variables.begin());
78 main_monomial[main_index] = 1;
79 terms.emplace_back(main_monomial, Rational(1));
80 Monomial constant_monomial(variables.size(), 0);
81 const auto& constant = search.input.base_constants[factor_index];
82 if (!constant.is_zero()) terms.emplace_back(constant_monomial, constant);
83 for (size_t variable_index = 0; variable_index < search.input.auxiliary.size(); ++variable_index) {
84 Rational coefficient = search.samples[variable_index]
85 [search.assignments[variable_index][factor_index]] - constant;
86 if (coefficient.is_zero()) { continue; }
87 Monomial monomial(variables.size(), 0);
88 const size_t index = static_cast<size_t>(std::find(
89 variables.begin(), variables.end(), search.input.auxiliary[variable_index]) - variables.begin());
90 monomial[index] = 1;
91 terms.emplace_back(std::move(monomial), coefficient);
92 }
93 return MultiPoly(std::move(terms), variables);
94}
std::vector< int > Monomial
单项式类型,以整数向量表示各变量的指数

引用了 LMCAS::multivariate_checked_detail::LinearAssignments::assignments, LMCAS::multivariate_checked_detail::LinearSamples::auxiliary, LMCAS::multivariate_checked_detail::LinearSamples::base_constants, LMCAS::multivariate_checked_detail::LinearAssignments::input, linear_assignment_factor(), LMCAS::multivariate_checked_detail::LinearSamples::main_variable, LMCAS::multivariate_checked_detail::LinearSamples::primitive , 以及 LMCAS::multivariate_checked_detail::LinearAssignments::samples.

被这些函数引用 linear_assignment_factor() , 以及 verify_linear_assignment().

函数调用图:
这是这个函数的调用关系图:

◆ restore_specialization_unit()

bool LMCAS::multivariate_checked_detail::restore_specialization_unit ( const MultiPoly & poly,
const std::string & main_var,
const std::map< std::string, Rational > & eval_points,
std::vector< Polynomial< Rational > > & univariate_factors )
static

在文件 multivariate_factor_evaluation.cpp 第 12 行定义.

17{
18 if (univariate_factors.empty()) { return false; }
19 const Polynomial<Rational> specialized = poly.eval(eval_points).to_univariate();
20 if (specialized.variable_name != main_var) { return false; }
21 Polynomial<Rational> product({Rational(1)}, main_var);
22 for (const auto& factor : univariate_factors) {
23 if (factor.variable_name != main_var || factor.is_zero()) { return false; }
24 product = product * factor;
25 }
26 auto [unit, remainder] = specialized.div_mod(product);
27 if (!remainder.is_zero() || unit.is_zero() || unit.degree() != 0) { return false; }
28 if (!(product * unit == specialized)) { return false; }
29 univariate_factors[0] = univariate_factors[0] * unit;
30 return true;
31}
一元多项式模板类
std::pair< Polynomial, Polynomial > div_mod(const Polynomial &other) const
多项式带余除法
std::string variable_name
变量名
const std::string & unit
const std::string & main_var

引用了 LMCAS::Polynomial< CoeffType >::div_mod(), LMCAS::main_var, restore_specialization_unit(), LMCAS::unit , 以及 LMCAS::Polynomial< CoeffType >::variable_name.

被这些函数引用 factor_linear_hensel() , 以及 restore_specialization_unit().

函数调用图:
这是这个函数的调用关系图:

◆ verify_linear_assignment()

Result< bool > LMCAS::multivariate_checked_detail::verify_linear_assignment ( LinearAssignments & search)
static

在文件 multivariate_factor_evaluation.cpp 第 96 行定义.

96 {
97 auto step = search.input.context.consume_steps(1, "factor_multivariate");
98 if (!step) { return Result<bool>::failure(step.error()); }
99 std::vector<MultiPoly> candidates;
100 for (size_t i = 0; i < search.input.base_constants.size(); ++i) {
101 candidates.push_back(linear_assignment_factor(search, i));
102 }
103 MultiPoly product(Rational(1), search.input.primitive.variables());
104 for (const auto& candidate : candidates) product = product * candidate;
105 MultiPoly unit;
106 try {
107 unit = search.input.primitive.exact_div(product);
108 } catch (const std::runtime_error&) {
109 return Result<bool>::success(false);
110 }
111 if (unit.is_zero() || !unit.is_constant() ||
112 product * unit != search.input.primitive) { return Result<bool>::success(false); }
113 search.found_factors = std::move(candidates);
114 return Result<bool>::success(true);
115}
Result< void > consume_steps(std::size_t amount=1, const std::string &operation={})
static MultiPoly linear_assignment_factor(const LinearAssignments &search, size_t factor_index)

引用了 LMCAS::multivariate_checked_detail::LinearSamples::base_constants, LMCAS::ComputationContext::consume_steps(), LMCAS::multivariate_checked_detail::LinearSamples::context, LMCAS::Result< T >::failure(), LMCAS::multivariate_checked_detail::LinearAssignments::found_factors, LMCAS::multivariate_checked_detail::LinearAssignments::input, linear_assignment_factor(), LMCAS::multivariate_checked_detail::LinearSamples::primitive, LMCAS::Result< T >::success(), LMCAS::unit , 以及 verify_linear_assignment().

被这些函数引用 enumerate_linear_assignments() , 以及 verify_linear_assignment().

函数调用图:
这是这个函数的调用关系图: