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