37 std::enable_if_t<!traits::has_size<Number>::value, Number>
40 for (
const auto& c : rf.first) {
44 for (
const auto& c : rf.second) {
54 std::enable_if_t<traits::has_size<Container<Number>>::value, Container<Number>>
56 Container<Number> result(xx.size());
57#if defined(_OPENMP) && !defined(ALFI_DISABLE_OPENMP)
58#pragma omp parallel for
60 for (
SizeT i = 0; i < xx.size(); ++i) {
75 std::enable_if_t<!traits::has_size<Number>::value, Number>
77 const auto& numerator = rf.first;
78 const auto& denominator = rf.second;
80 for (
auto i = numerator.rbegin(); i != numerator.rend(); ++i) {
84 for (
auto i = denominator.rbegin(); i != denominator.rend(); ++i) {
87 const auto numerator_degree = numerator.empty() ? 0 : numerator.size() - 1;
88 const auto denominator_degree = denominator.empty() ? 0 : denominator.size() - 1;
89 if (numerator_degree >= denominator_degree) {
100 std::enable_if_t<traits::has_size<Container<Number>>::value, Container<Number>>
102 Container<Number> result(xx.size());
103#if defined(_OPENMP) && !defined(ALFI_DISABLE_OPENMP)
104#pragma omp parallel for
106 for (
SizeT i = 0; i < xx.size(); ++i) {
107 result[i] =
val_div(rf, xx[i]);
118 std::enable_if_t<!traits::has_size<Number>::value, Number>
120 if (std::abs(x) <= 1) {
131 std::enable_if_t<traits::has_size<Container<Number>>::value, Container<Number>>
133 Container<Number> result(xx.size());
134#if defined(_OPENMP) && !defined(ALFI_DISABLE_OPENMP)
135#pragma omp parallel for
137 for (
SizeT i = 0; i < xx.size(); ++i) {
138 result[i] =
val(rf, xx[i]);
171 if constexpr (std::is_signed_v<SizeT>) {
172 if (n < 0 || m < 0) {
179 Container<Number> Xnm1(n + m + 2, 0);
185 Container<Number> old_r, r, old_t, t;
186 if (Xnm1.size() >= P.size()) {
187 old_r = std::move(Xnm1), r = std::move(P);
188 old_t = {0}, t = {1};
190 old_r = std::move(P), r = std::move(Xnm1);
191 old_t = {1}, t = {0};
196 while (old_r.size() > n + 1) {
200 const auto new_t_size = std::max(old_t.size(), qt.size());
201 Container<Number> new_t(new_t_size, 0);
202 for (
SizeT i = 0, offset = new_t_size - old_t.size(); i < old_t.size(); ++i) {
203 new_t[offset+i] = old_t[i];
205 for (
SizeT i = 0, offset = new_t_size - qt.size(); i < qt.size(); ++i) {
206 new_t[offset+i] -= qt[i];
209 old_r = std::move(r);
210 r = std::move(new_r);
211 old_t = std::move(t);
212 t = std::move(new_t);
219 if (old_t.size() > m + 1 || std::abs(old_t[old_t.size()-1]) <= epsilon) {
223 return std::make_pair(old_r, old_t);
Namespace providing support for rational functions.
std::pair< Container< Number >, Container< Number > > RationalFunction
Represents a rational function , where and are polynomials.
Definition ratf.h:26
RationalFunction< Number, Container > pade(Container< Number > P, SizeT n, SizeT m, const Number &epsilon=std::numeric_limits< Number >::epsilon())
Computes the [n / m] Pade approximant of the polynomial P about the point .
Definition ratf.h:170
std::enable_if_t<!traits::has_size< Number >::value, Number > val_div(const RationalFunction< Number, Container > &rf, const Number &x)
Evaluates the rational function at a scalar point by factoring out powers of x.
Definition ratf.h:76
std::enable_if_t<!traits::has_size< Number >::value, Number > val(const RationalFunction< Number, Container > &rf, const Number &x)
Evaluates the rational function at a scalar point.
Definition ratf.h:119
std::enable_if_t<!traits::has_size< Number >::value, Number > val_mul(const RationalFunction< Number, Container > &rf, const Number &x)
Evaluates the rational function at a scalar point using Horner's method.
Definition ratf.h:38
Number binpow(Number x, ExponentType n)
Computes the power of a number using binary exponentiation.
Definition numeric.h:26
void normalize(Container< Number > &p, const Number &epsilon=std::numeric_limits< Number >::epsilon())
Normalizes a polynomial by removing leading zero coefficients.
Definition poly.h:27
std::pair< Container< Number >, Container< Number > > div(const Container< Number > ÷nd, const Container< Number > &divisor, const Number &epsilon=std::numeric_limits< Number >::epsilon())
Divides one polynomial by another.
Definition poly.h:90
Container< Number > mul(const Container< Number > &p1, const Container< Number > &p2)
Multiplies two polynomials.
Definition poly.h:56
ALFI_DEFAULT_NUMBER DefaultNumber
Definition config.h:17
ALFI_SIZE_TYPE SizeT
Definition config.h:22
ALFI_DEFAULT_CONTAINER< Number > DefaultContainer
Definition config.h:20