12using namespace std::complex_literals;
21 template<
typename ... T>
24 return ((!std::isfinite(t)) || ...);
33 return !std::isfinite(re_a) || !std::isfinite(im_a) || (fabs(re_a) >
big) || (fabs(im_a) >
big);
38 template<
typename ... T>
41 return ((t.imag() > 0) || ...);
49 return std::any_of(vec.begin(), vec.end(), [](complex<T> t){return t.imag() > 0;});
55 template <
typename number>
62 template <
typename number>
65 return fma(a,
b, tmp) +
fma(d, c, tmp);
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) {
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())
81 template<
typename number>
82 inline complex<number>
fma(complex<number> a, complex<number>
b, complex<number> c) {
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()))
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())};
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())};
108 template <
typename number>
110 return {std::fma(a,
b,c.real()),c.imag()};
116 template <
typename number>
118 return {std::fma(a.real(),
b,c),a.imag()*
b};
123 template <
typename number>
125 for (
number i: vec) std::cout << i <<
" ";
132 template <
typename number,
typename T>
135 for (T i: vec) res.push_back(
static_cast<number>(i));
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);
150 ret.erase(ret.begin());
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");
166 std::vector<T> quotient_coeffs(dividend.size() - divisor.size() + 1, 0);
169 while (dividend.size() >= divisor.size()) {
170 int degree_diff = dividend.size() - divisor.size();
171 T coeff = dividend.back() / divisor.back();
174 tmp = std::vector<T>(degree_diff + 1, 0);
178 for (
int i = 0; i <= divisor.size()-1; ++i) {
179 dividend[i + degree_diff] -= coeff * divisor[i];
184 quotient_coeffs[degree_diff] = coeff;
187 quotient = quotient_coeffs;
188 remainder = dividend;
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");
200 while (dividend.size() >= divisor.size()) {
201 int degree_diff = dividend.size() - divisor.size();
202 T coeff = dividend.back() / divisor.back();
205 tmp = std::vector<T>(degree_diff + 1, 0);
209 for (
int i = 0; i <= divisor.size()-1; ++i) {
210 dividend[i + degree_diff] -= coeff * divisor[i];
214 remainder = dividend;
#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 > "ient, 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