LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
exact_rational_determinant.cpp
浏览该文件的文档.
1
#include "
internal/exact_rational_matrix.hpp
"
2
3
#include <algorithm>
4
#include <limits>
5
#include <new>
6
7
namespace
LMCAS::detail
{
8
Result<Rational>
rational_determinant_value_impl
(
9
std::size_t dimension,
10
std::vector<Rational> values,
11
ComputationContext
&
context
,
12
const
std::string&
operation
) {
13
if
(dimension == 0 ||
14
dimension > std::numeric_limits<std::size_t>::max() / dimension ||
15
values.size() != dimension * dimension) {
16
return
Result<Rational>::failure
(
17
CasErrc::InvalidArgument
,
18
"rational determinant storage does not match its dimension"
,
19
operation
);
20
}
21
Rational sign(1);
22
Rational previous(1);
23
if
(dimension == 1)
return
Result<Rational>::success
(values[0]);
24
for
(std::size_t pivot_column = 0;
25
pivot_column + 1 < dimension; ++pivot_column) {
26
auto
budget
=
context
.consume_steps(1,
operation
);
27
if
(!
budget
)
return
Result<Rational>::failure
(
budget
.error());
28
std::size_t pivot_row = pivot_column;
29
while
(pivot_row < dimension &&
30
values[pivot_row * dimension + pivot_column] == Rational(0)) {
31
++pivot_row;
32
}
33
if
(pivot_row == dimension) {
34
return
Result<Rational>::success
(Rational(0));
35
}
36
if
(pivot_row != pivot_column) {
37
for
(std::size_t column = 0; column < dimension; ++column) {
38
std::swap(values[pivot_row * dimension + column],
39
values[pivot_column * dimension + column]);
40
}
41
sign = -sign;
42
}
43
const
Rational pivot =
44
values[pivot_column * dimension + pivot_column];
45
for
(std::size_t row = pivot_column + 1; row < dimension; ++row) {
46
for
(std::size_t column = pivot_column + 1;
47
column < dimension; ++column) {
48
values[row * dimension + column] =
49
(values[row * dimension + column] * pivot -
50
values[row * dimension + pivot_column] *
51
values[pivot_column * dimension + column]) /
52
previous;
53
}
54
values[row * dimension + pivot_column] = Rational(0);
55
}
56
previous = pivot;
57
}
58
return
Result<Rational>::success
(
59
sign * values[(dimension - 1) * dimension + (dimension - 1)]);
60
}
61
62
Result<Rational>
rational_determinant_exact
(
63
std::size_t dimension,
64
std::vector<Rational> values,
65
ComputationContext
&
context
,
66
const
std::string&
operation
) {
67
try
{
68
return
rational_determinant_value_impl
(
69
dimension, std::move(values),
context
,
operation
);
70
}
catch
(
const
std::bad_alloc&) {
71
return
Result<Rational>::failure
(
72
CasErrc::ResourceLimit
,
73
"rational determinant allocation failed"
,
74
operation
);
75
}
catch
(
const
std::exception& error) {
76
return
Result<Rational>::failure
(
77
CasErrc::InternalInvariant
, error.what(),
operation
);
78
}
79
}
80
81
}
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::Result
定义
result.hpp:39
LMCAS::Result::failure
static Result failure(CasErrc code, std::string message, std::string operation={})
定义
result.hpp:52
LMCAS::Result::success
static Result success(T value)
定义
result.hpp:48
exact_rational_matrix.hpp
LMCAS::detail
多元 Hensel 提升(单变量步)
定义
assumption_context.hpp:31
LMCAS::detail::rational_determinant_value_impl
Result< Rational > rational_determinant_value_impl(std::size_t dimension, std::vector< Rational > values, ComputationContext &context, const std::string &operation)
定义
exact_rational_determinant.cpp:8
LMCAS::detail::rational_determinant_exact
Result< Rational > rational_determinant_exact(std::size_t dimension, std::vector< Rational > values, ComputationContext &context, const std::string &operation)
定义
exact_rational_determinant.cpp:62
LMCAS::detail::operation
ComputationContext const std::string & operation
定义
exact_algebraic.hpp:32
LMCAS::detail::budget
RewriteBudget & budget
定义
expression_transform.hpp:16
LMCAS::detail::context
std::size_t std::size_t ComputationContext & context
定义
exact_algebraic.hpp:27
LMCAS::CasErrc::InvalidArgument
@ InvalidArgument
定义
result.hpp:13
LMCAS::CasErrc::InternalInvariant
@ InternalInvariant
定义
result.hpp:28
LMCAS::CasErrc::ResourceLimit
@ ResourceLimit
定义
result.hpp:25
src
exact_rational_determinant.cpp
生成于
, 为 LMCAS使用
1.18.0