LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
exact_rational_determinant.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <limits>
5#include <new>
6
7namespace LMCAS::detail {
9 std::size_t dimension,
10 std::vector<Rational> values,
12 const std::string& operation) {
13 if (dimension == 0 ||
14 dimension > std::numeric_limits<std::size_t>::max() / dimension ||
15 values.size() != dimension * dimension) {
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 }
59 sign * values[(dimension - 1) * dimension + (dimension - 1)]);
60}
61
63 std::size_t dimension,
64 std::vector<Rational> values,
66 const std::string& operation) {
67 try {
69 dimension, std::move(values), context, operation);
70 } catch (const std::bad_alloc&) {
73 "rational determinant allocation failed",
74 operation);
75 } catch (const std::exception& error) {
78 }
79}
80
81}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
多元 Hensel 提升(单变量步)
Result< Rational > rational_determinant_value_impl(std::size_t dimension, std::vector< Rational > values, ComputationContext &context, const std::string &operation)
Result< Rational > rational_determinant_exact(std::size_t dimension, std::vector< Rational > values, ComputationContext &context, const std::string &operation)
ComputationContext const std::string & operation
std::size_t std::size_t ComputationContext & context