36#ifndef LIB2GEOM_SEEN_POLY_H
37#define LIB2GEOM_SEEN_POLY_H
50class Poly :
public std::vector<double>{
62 const unsigned out_size = std::max(
size(), p.size());
63 const unsigned min_size = std::min(
size(), p.size());
66 for(
unsigned i = 0; i < min_size; i++) {
67 result.push_back((*
this)[i] + p[i]);
69 for(
unsigned i = min_size; i <
size(); i++)
70 result.push_back((*
this)[i]);
71 for(
unsigned i = min_size; i < p.size(); i++)
73 assert(
result.size() == out_size);
78 const unsigned out_size = std::max(
size(), p.size());
79 const unsigned min_size = std::min(
size(), p.size());
82 for(
unsigned i = 0; i < min_size; i++) {
83 result.push_back((*
this)[i] - p[i]);
85 for(
unsigned i = min_size; i <
size(); i++)
86 result.push_back((*
this)[i]);
87 for(
unsigned i = min_size; i < p.size(); i++)
89 assert(
result.size() == out_size);
93 const unsigned out_size = std::max(
size(), p.size());
94 const unsigned min_size = std::min(
size(), p.size());
97 for(
unsigned i = 0; i < min_size; i++) {
100 for(
unsigned i = min_size; i < out_size; i++)
106 const unsigned out_size =
size();
109 for(
unsigned i = 0; i < out_size; i++) {
110 result.push_back((*
this)[i]);
119 for(
unsigned i = 0; i <
size(); i++) {
126 const unsigned out_size =
size();
129 for(
unsigned i = 0; i < out_size; i++) {
130 result.push_back((*
this)[i]*p);
132 assert(
result.size() == out_size);
138 size_type
const out_size =
size() + terms;
141 result.resize(terms, 0.0);
142 result.insert(
result.end(), this->begin(), this->end());
144 assert(
result.size() == out_size);
149 template <
typename T>
152 for(
int k =
size()-1; k >= 0; k--) {
153 r = r*x + T((*
this)[k]);
158 template <
typename T>
166 Poly(
const double a) {push_back(a);}
169 template <
class T,
class U>
173 int nd = pd.size() - 1;
174 for(
unsigned j = 1; j < pd.size(); j++)
176 for(
int i = nc -1; i >= 0; i--) {
177 int nnd = std::min(nd, nc-i);
178 for(
int j = nnd; j >= 1; j--)
179 pd[j] = pd[j]*x +
operator[](i);
180 pd[0] = pd[0]*x + operator[](i);
183 for(
int i = 2; i <= nd; i++) {
210std::vector<std::complex<double> >
solve(
const Poly & p);
237inline std::ostream &operator<< (std::ostream &out_file,
const Poly &in_poly) {
238 if(in_poly.size() == 0)
241 for(
int i = (
int)in_poly.size()-1; i >= 0; --i) {
243 out_file <<
"" << in_poly[i] <<
"*x";
246 out_file <<
"" << in_poly[i] <<
"*x^" << i;
249 out_file << in_poly[i];
Various utility functions.
Polynomial in canonical (monomial) basis.
Poly operator-=(const Poly &p)
Poly operator+(const Poly &p) const
Poly shifted(unsigned const terms) const
Poly operator*(const double p) const
static Poly linear(double ax, double b)
void val_and_deriv(T x, U &pd) const
Poly operator-(const Poly &p) const
Poly operator-(const double k) const
Integral and real coordinate types and some basic utilities.
double Coord
Floating point type used to store coordinates.
Various utility functions.
std::vector< Coord > solve_quartic(Coord a, Coord b, Coord c, Coord d, Coord e)
Analytically solve quartic equation.
SBasisN< n > divide(SBasisN< n > const &a, SBasisN< n > const &b, int k)
Poly gcd(Poly const &a, Poly const &b, const double tol=1e-10)
std::vector< Coord > solve_quadratic(Coord a, Coord b, Coord c)
Analytically solve quadratic equation.
Bezier operator*(Bezier const &f, Bezier const &g)
std::vector< Coord > solve_cubic(Coord a, Coord b, Coord c, Coord d)
Analytically solve cubic equation.
D2< T > compose(D2< T > const &a, T const &b)
std::vector< double > solve_reals(const Poly &p)
std::vector< std::complex< double > > solve(const Poly &p)
Bezier integral(Bezier const &a)
Bezier derivative(Bezier const &a)
Poly divide_out_root(Poly const &p, double x)
double polish_root(Poly const &p, double guess, double tol)