8#ifndef model_RationalMatrix_cpp_
9#define model_RationalMatrix_cpp_
11#include <RationalMatrix.h>
17 typename RationalMatrix<dim>::IntValueType RationalMatrix<dim>::gcd(
const IntValueType &
a,
const IntValueType &
b)
19 return b > 0 ? gcd(
b,
a %
b) :
a;
24 typename RationalMatrix<dim>::IntValueType RationalMatrix<dim>::lcm(
const IntValueType &
a,
const IntValueType &
b)
26 return a *
b / gcd(
a,
b);
31 std::pair<typename RationalMatrix<dim>::MatrixInt,
typename RationalMatrix<dim>::IntValueType> RationalMatrix<dim>::compute(
const MatrixDimD &R)
38 IntValueType
sigma = 1;
39 for (
int i = 0;
i <
dim; ++
i)
41 for (
int j = 0;
j <
dim; ++
j)
46 sigma = lcm(sigma, bra.den);
50 MatrixInt im(MatrixInt::Zero());
51 for (
int i = 0;
i <
dim; ++
i)
53 for (
int j = 0;
j <
dim; ++
j)
59 const double error = (im.template cast<double>() /
sigma - R).norm() / (
dim *
dim);
60 if (error > 100.0 * DBL_EPSILON)
62 std::cout <<
"error=" << error << std::endl;
63 std::cout <<
"maxDen=" << maxDen << std::endl;
65 << std::setprecision(15) << std::scientific << im.template cast<double>() /
sigma << std::endl;
66 std::cout <<
"= 1/" <<
sigma <<
"*\n"
67 << std::setprecision(15) << std::scientific << im << std::endl;
69 << std::setprecision(15) << std::scientific << R << std::endl;
70 assert(
false &&
"Rational Matrix failed, check maxDen.");
73 return std::make_pair(im, sigma);
80 sigma(returnPair.second)
RationalMatrix(const MatrixDimD &R)
const MatrixInt & integerMatrix
const IntValueType & sigma