13 #ifndef eli_mutil_poly_polynomial_hpp
14 #define eli_mutil_poly_polynomial_hpp
20 #include "eli/code_eli.hpp"
30 template<
typename data__>
47 polynomial(
const data_type &root1,
const data_type &root2,
const data_type &root3) {
set_roots(root1, root2, root3);}
48 polynomial(
const data_type &root1,
const data_type &root2,
const data_type &root3,
const data_type &root4){
set_roots(root1, root2, root3, root4);}
49 template<
typename itroot__>
54 coefficient_type a_new(1);
93 coefficient_type a_new;
95 for (i=this->
degree(); i>0; --i)
97 if (
a(i)!=static_cast<data_type>(0))
110 for (index_type i=0; i<this->
size(); ++i)
112 if (std::abs(
a(i))<small)
113 a(i)=
static_cast<data_type
>(0);
120 coefficient_type a_new(2);
127 void set_roots(
const data_type &root1,
const data_type &root2)
129 coefficient_type a_new(3);
132 a_new(1)=-(root1+root2);
133 a_new(0)=root1*root2;
137 void set_roots(
const data_type &root1,
const data_type &root2,
const data_type &root3)
139 coefficient_type a_new(4);
142 a_new(2)=-(root1+root2+root3);
143 a_new(1)=root1*root2+root1*root3+root2*root3;
144 a_new(0)=-root1*root2*root3;
148 void set_roots(
const data_type &root1,
const data_type &root2,
const data_type &root3,
const data_type &root4)
150 coefficient_type a_new(5);
153 a_new(3)=-(root1+root2+root3+root4);
154 a_new(2)=root1*root2+root1*root3+root1*root4+root2*root3+root2*root4+root3*root4;
155 a_new(1)=-(root1*root2*root3+root1*root2*root4+root1*root3*root4+root2*root3*root4);
156 a_new(0)=root1*root2*root3*root4;
164 template<
typename itroot__>
168 coefficient_type a_new(n);
169 std::vector<data_type> root(deg);
170 std::vector<int> index(deg);
175 for (itroot__ it=its; it!=ite; ++it, ++i)
184 a_new[deg-j]=
static_cast<data_type
>(0);
187 data_type term(root[index[0]]);
190 term*=root[index[i]];
199 data_type
f(
const data_type &t)
const
210 index_type i, n(this->
degree());
221 data_type
fp(
const data_type &t)
const
233 n=
static_cast<index_type
>(this->
degree());
236 rtn=t*(
static_cast<data_type
>(i)*
a(i)+rtn);
239 rtn+=
static_cast<data_type
>(i)*
a(i);
244 data_type
fpp(
const data_type &t)
const
256 n=
static_cast<index_type
>(this->
degree());
259 rtn=t*(
static_cast<data_type
>(i)*static_cast<data_type>(i-1)*
a(i)+rtn);
262 rtn+=
static_cast<data_type
>(i)*static_cast<data_type>(i-1)*
a(i);
267 data_type
fppp(
const data_type &t)
const
279 n=
static_cast<index_type
>(this->
degree());
282 rtn=t*(
static_cast<data_type
>(i)*static_cast<data_type>(i-1)*
static_cast<data_type
>(i-2)*
a(i)+rtn);
285 rtn+=
static_cast<data_type
>(i)*static_cast<data_type>(i-1)*
static_cast<data_type
>(i-2)*
a(i);
303 index_type new_deg(this->
degree()-1), deg(this->
degree());
304 coefficient_type a_new(new_deg+1);
305 for (index_type i=1; i<=deg; ++i)
306 a_new(i-1)=
static_cast<data_type
>(i)*
a(i);
316 index_type new_deg(this->
degree()-2), deg(this->
degree());
317 coefficient_type a_new(new_deg+1);
318 for (index_type i=2; i<=deg; ++i)
319 a_new(i-2)=
static_cast<data_type
>(i)*static_cast<data_type>(i-1)*
a(i);
329 index_type new_deg(this->
degree()-3), deg(this->
degree());
330 coefficient_type a_new(new_deg+1);
331 for (index_type i=3; i<=deg; ++i)
332 a_new(i-3)=
static_cast<data_type
>(i)*static_cast<data_type>(i-1)*
static_cast<data_type
>(i-2)*
a(i);
340 index_type deg1(p1.
degree()), deg2(p2.
degree()), deg, n, i;
342 deg=std::max(deg1, deg2);
344 coefficient_type a_new(n);
350 a_new(i)=
static_cast<data_type
>(0);
363 index_type deg1(p1.
degree()), deg2(p2.
degree()), deg, n, i;
365 deg=std::max(deg1, deg2);
367 coefficient_type a_new(n);
373 a_new(i)=
static_cast<data_type
>(0);
386 index_type deg1(p1.
degree()), deg2(p2.
degree()), deg, n, j1, j2;
390 coefficient_type a_new(n);
392 for (j1=0; j1<=deg1; ++j1)
394 for (j2=0; j2<=deg2; ++j2)
396 a_new(j1+j2)+=p1.
a(j1)*p2.
a(j2);
406 for (index_type i=0; i<this->
size(); ++i)
413 index_type deg1(p1.
degree()), deg2(p2.
degree()), deg, n, j, j1, j2, nz;
419 coefficient_type a_new(1);
426 for (j=0; j<=deg2; ++j)
428 if (p2.
a(deg2-j)!=
static_cast<data_type
>(0))
436 coefficient_type a_new(1);
437 a_new(1)=std::numeric_limits<data__>::quiet_NaN();
446 coefficient_type a_new(n);
455 for (j=0; j<=deg; ++j)
458 a_new(j1)=p1_copy.
a(deg2+j1)/p2.
a(deg2);
459 for (j2=0; j2<=deg2; ++j2)
461 p1_copy.
a(j2+j1)-=a_new(j1)*p2.
a(j2);
465 index_type nrem(deg2+nz);
466 coefficient_type a_rem(nrem);
467 for (j=0; j<nrem; ++j)
468 a_rem(j)=p1_copy.
a(j);
477 for (index_type i=0; i<this->
size(); ++i)
483 for (index_type i=0; i<this->
size(); ++i)
484 a[i]*=static_cast<data_type>(-1);
void set_roots(itroot__ its, itroot__ ite)
Definition: polynomial.hpp:165
data_type coefficient(const index_type &i) const
Definition: polynomial.hpp:77
void adjust_zero(const data_type &small)
Definition: polynomial.hpp:108
polynomial< data_type > * fppp() const
Definition: polynomial.hpp:324
Derived1__::Scalar distance(const Eigen::MatrixBase< Derived1__ > &p1, const Eigen::MatrixBase< Derived2__ > &p2)
Definition: distance.hpp:33
polynomial< data_type > * fp() const
Definition: polynomial.hpp:298
polynomial(const coefficient_type &c)
Definition: polynomial.hpp:43
polynomial(const polynomial< data__ > &p)
Definition: polynomial.hpp:44
polynomial< data_type > * f() const
Definition: polynomial.hpp:290
void set_coefficients(const coefficient_type &ain)
Definition: polynomial.hpp:81
polynomial(const data_type &root1, const data_type &root2, const data_type &root3, const data_type &root4)
Definition: polynomial.hpp:48
polynomial(const data_type &root1, const data_type &root2, const data_type &root3)
Definition: polynomial.hpp:47
void set_roots(const data_type &root1, const data_type &root2, const data_type &root3)
Definition: polynomial.hpp:137
void set_roots(const data_type &root1, const data_type &root2, const data_type &root3, const data_type &root4)
Definition: polynomial.hpp:148
data_type fp(const data_type &t) const
Definition: polynomial.hpp:221
polynomial(const data_type &root1, const data_type &root2)
Definition: polynomial.hpp:46
coefficient_type a
Definition: polynomial.hpp:39
void multiply(const polynomial< data_type > &p1, const polynomial< data_type > &p2)
Definition: polynomial.hpp:383
data_type f(const data_type &t) const
Definition: polynomial.hpp:199
Definition: polynomial.hpp:31
polynomial(const data_type &root)
Definition: polynomial.hpp:45
Eigen::Matrix< data_type, Eigen::Dynamic, 1 > coefficient_type
Definition: polynomial.hpp:35
polynomial< data__ > & operator=(const polynomial< data__ > &p)
Definition: polynomial.hpp:62
void set_roots(const data_type &root)
Definition: polynomial.hpp:118
polynomial< data__ > & operator=(const data_type &d)
Definition: polynomial.hpp:52
index_type degree() const
Definition: polynomial.hpp:72
void subtract(const polynomial< data_type > &p1, const polynomial< data_type > &p2)
Definition: polynomial.hpp:360
void multiply(const data_type &d)
Definition: polynomial.hpp:404
void add(const polynomial< data_type > &p1, const polynomial< data_type > &p2)
Definition: polynomial.hpp:337
polynomial(itroot__ its, itroot__ ite)
Definition: polynomial.hpp:50
void negative()
Definition: polynomial.hpp:481
data_type fpp(const data_type &t) const
Definition: polynomial.hpp:244
index_type size() const
Definition: polynomial.hpp:488
void get_coefficients(coefficient_type &aout) const
Definition: polynomial.hpp:86
polynomial()
Definition: polynomial.hpp:42
void divide(polynomial< data_type > &prem, const polynomial< data_type > &p1, const polynomial< data_type > &p2)
Definition: polynomial.hpp:410
data_type fppp(const data_type &t) const
Definition: polynomial.hpp:267
coefficient_type::Index index_type
Definition: polynomial.hpp:36
void divide(const data_type &d)
Definition: polynomial.hpp:475
bool next_combination(const it__ itb, it__ itk, const it__ ite, comp__ comp)
Definition: combination.hpp:35
void set_roots(const data_type &root1, const data_type &root2)
Definition: polynomial.hpp:127
void compress()
Definition: polynomial.hpp:91
data__ data_type
Definition: polynomial.hpp:34
polynomial< data_type > * fpp() const
Definition: polynomial.hpp:311