Laguerre polynomials
Loading...
Searching...
No Matches
ExtendedFunctions.h
Go to the documentation of this file.
1#ifndef EXTENDEDFMA_H
2#define EXTENDEDFMA_H
3
4#include <cmath>
5#include <numbers>
6#include <vector>
7#include <complex>
8#include <iostream>
9#include <algorithm>
10#include <iomanip>
11
12using namespace std::complex_literals;
13
14namespace Laguerre{
15 using std::complex;
16 using std::vector;
17 using std::fma;
18
21 template<typename ... T>
22 inline bool anynotfinite(T && ... t)
23 {
24 return ((!std::isfinite(t)) || ...);
25 }
26
29 template <typename T>
30 bool complexnotfinite(complex<T> a, T big){
31 T re_a = real(a);
32 T im_a = imag(a);
33 return !std::isfinite(re_a) || !std::isfinite(im_a) || (fabs(re_a) > big) || (fabs(im_a) > big);
34 }
35
38 template<typename ... T>
39 inline bool anycomplex(T && ... t)
40 {
41 return ((t.imag() > 0) || ...);
42 }
43
46 template<typename T>
47 inline bool anycomplex(vector<complex<T>> vec)
48 {
49 return std::any_of(vec.begin(), vec.end(), [](complex<T> t){return t.imag() > 0;});
50 }
51
52
55 template <typename number>
56 inline int sign(number val) {
57 return (number(0) < val) - (val < number(0));
58 }
59
62 template <typename number>
63 inline number fms(number a, number b, number c, number d) {
64 auto tmp = -d * c;
65 return fma(a, b, tmp) + fma(d, c, tmp);
66 }
67
70 template <typename number>
71 inline complex<number> fms(std::complex<number> a, std::complex<number> b, std::complex<number> c,std::complex<number> d) {
72 return {
73 fms(a.real(),b.real(),c.real(),d.real())+fms(c.imag(),d.imag(),a.imag(),b.imag()),
74 fms(a.real(),b.imag(),c.real(),d.imag())+fms(b.real(),a.imag(),d.real(),c.imag())
75 };
76 }
77
81 template<typename number>
82 inline complex<number> fma(complex<number> a, complex<number> b, complex<number> c) {
83 return {
84 fms(a.real(), b.real(), a.imag(), b.imag()) + c.real(),
85 fma(a.real(), b.imag(), fma(a.imag(), b.real(), c.imag()))
86 };
87 }
88
92 template <typename number>
93 inline complex<number> fma(std::complex<number> a, std::complex<number> b, number c){
94 return {std::fma(a.real(),b.real(),std::fma(-b.imag(),a.imag(),c)),fms(a.real(),b.imag(),-b.real(),a.imag())};
95 }
96
100 template <typename number>
101 inline complex<number> fma(complex<number> a, number b, complex<number> c){
102 return {std::fma(a.real(),b,c.real()),std::fma(a.imag(),b,c.imag())};
103 }
104
108 template <typename number>
109 inline complex<number> fma(number a,number b, complex<number> c){
110 return {std::fma(a,b,c.real()),c.imag()};
111 }
112
116 template <typename number>
117 inline complex<number> fma(complex<number> a,number b, number c){
118 return {std::fma(a.real(),b,c),a.imag()*b};
119 }
120
123 template <typename number>
124 inline void printVec(vector<number> vec){
125 for (number i: vec) std::cout << i << " ";
126 std::cout << "\n";
127 }
128
132 template <typename number, typename T>
133 inline vector<number> castVec(vector<T> vec){
134 vector<number> res;
135 for (T i: vec) res.push_back(static_cast<number>(i));
136 return res;
137 }
138
142 template <typename T>
143 inline vector<T> diff(vector<T> coeffs, int deg=1){
144 std::vector ret = coeffs;
145 for(int j = 0; j < deg; ++j){
146 for (int i = 1; i < ret.size(); ++i) {
147 ret[i] *= static_cast<T>(i);
148 }
149 if (ret.size()) {
150 ret.erase(ret.begin());
151 }
152 else break;
153 }
154 return ret;
155 }
156
159 template <typename T>
160 inline void divide(vector<T> dividend, vector<T> divisor,
161 vector<T>& quotient, vector<T>& remainder) {
162 if (divisor.size() > dividend.size()) {
163 throw std::invalid_argument("The degree of the divisor is greater than the dividend");
164 }
165
166 std::vector<T> quotient_coeffs(dividend.size() - divisor.size() + 1, 0);
167 std::vector<T> tmp;
168
169 while (dividend.size() >= divisor.size()) {
170 int degree_diff = dividend.size() - divisor.size();
171 T coeff = dividend.back() / divisor.back();
172
173 // Update the temporary polynomial for subtraction
174 tmp = std::vector<T>(degree_diff + 1, 0);
175 tmp.back() = coeff;
176
177 // Subtract and update the dividend
178 for (int i = 0; i <= divisor.size()-1; ++i) {
179 dividend[i + degree_diff] -= coeff * divisor[i];
180 }
181 dividend.pop_back();
182
183 // Update the quotient
184 quotient_coeffs[degree_diff] = coeff;
185 }
186
187 quotient = quotient_coeffs;
188 remainder = dividend;
189 }
190
193 template <typename T>
194 inline void getRemainder(vector<T> dividend, vector<T> divisor, vector<T>& remainder) {
195 if (divisor.size() > dividend.size()) {
196 throw std::invalid_argument("The degree of the divisor is greater than the dividend");
197 }
198
199 std::vector<T> tmp;
200 while (dividend.size() >= divisor.size()) {
201 int degree_diff = dividend.size() - divisor.size();
202 T coeff = dividend.back() / divisor.back();
203
204 // Update the temporary polynomial for subtraction
205 tmp = std::vector<T>(degree_diff + 1, 0);
206 tmp.back() = coeff;
207
208 // Subtract and update the dividend
209 for (int i = 0; i <= divisor.size()-1; ++i) {
210 dividend[i + degree_diff] -= coeff * divisor[i];
211 }
212 dividend.pop_back();
213 }
214 remainder = dividend;
215 }
216}
217#endif
#define number
Definition L13_test.cpp:5
const double big
Definition L18_or.h:11
p2 de j *z j
Definition Laguerre15m_or.h:23
cohn_schur ra local deg
Definition Laguerre15m_or.h:3
cohn_schur ra local b
Definition Laguerre15m_or.h:3
Definition ExtendedFunctions.h:14
void getRemainder(vector< T > dividend, vector< T > divisor, vector< T > &remainder)
Divide vectors (coefficients of polynomials)
Definition ExtendedFunctions.h:194
bool complexnotfinite(complex< T > a, T big)
Check if a complex number contains NaN or Inf values.
Definition ExtendedFunctions.h:30
void divide(vector< T > dividend, vector< T > divisor, vector< T > &quotient, vector< T > &remainder)
Divide vectors (coefficients of polynomials)
Definition ExtendedFunctions.h:160
int sign(number val)
Sign.
Definition ExtendedFunctions.h:56
bool anynotfinite(T &&... t)
Check if at least one number is not finite.
Definition ExtendedFunctions.h:22
void printVec(vector< number > vec)
Print out vector.
Definition ExtendedFunctions.h:124
number fms(number a, number b, number c, number d)
Fused multiply-substract a*b+(-d*c)+d*c+(-d*c)
Definition ExtendedFunctions.h:63
complex< number > fma(complex< number > a, complex< number > b, complex< number > c)
Fused multiply-add for complex numbers.
Definition ExtendedFunctions.h:82
vector< number > castVec(vector< T > vec)
Convert vector<T> to vector<number>
Definition ExtendedFunctions.h:133
vector< T > diff(vector< T > coeffs, int deg=1)
Diff vector.
Definition ExtendedFunctions.h:143
bool anycomplex(T &&... t)
Check if at least one complex number has imaginary part.
Definition ExtendedFunctions.h:39