template <class Type> polynomial<Type>::polynomial() { dimen= 1; ord= 0; } template <class Type> polynomial<Type>::polynomial(int dim, int order) { dimen= dim; ord= order; coeff.resize(coeff_size()); org.resize(dim); } template <class Type> polynomial<Type>::polynomial(int dim, int order, tnvector<Type>& a, tnvector<Type>& origin) { dimen= dim; ord= order; coeff= a; org= origin; } template <class Type> polynomial<Type>::polynomial(polynomial<Type>& p) { dimen= p.dimen; ord= p.ord; coeff= p.coeff; org= p.org; } template <class Type> polynomial<Type>::polynomial(istream& is) { read(is); } template <class Type> polynomial<Type>::~polynomial() { } template <class Type> void polynomial<Type>::resize(int dim, int order) { dimen= dim; ord= order; coeff.resize(coeff_size()); org.resize(dim); } template <class Type> int polynomial<Type>::dim() { return dimen; } template <class Type> int polynomial<Type>::order() { return ord; } template <class Type> int polynomial<Type>::coeff_size() { int sz; if (dimen > 1) { sz= (int) pow(dimen, ord+1)-1; sz/= dimen-1; } else { sz= ord+1; } return sz; } template <class Type> Type polynomial<Type>::value(tnvector<Type> x) { assert(dimen == x.dim()); tnvector<int> idx; int level; Type result= coeff[0]; Type buf; x-= org; for(int order= 1; order <= ord; order++) { idx.resize(order); level= 0; idx.set(0, -1); while(level != -1) { idx.set(level, idx[level]+1); if (idx[level] == dimen) { level--; } else { if (level == order-1) { buf= coefficient(idx); for(int j= 0; j < order; j++) { buf*= x[idx[j]]; } result+= buf; } else { level++; idx.set(level, -1); } } } } return result; } template <class Type> Type polynomial<Type>::coefficient(tnvector<int> i) { int pos; if (dimen > 1) { pos= (int) pow(dimen, i.dim())-1; pos/= dimen-1; } else { pos= i.dim(); } int base= 1; for(int k= 0; k < i.dim(); k++) { pos+= i[i.dim()-k-1]*base; base*= dimen; } return coeff[pos]; } template <class Type> void polynomial<Type>::set_coeff_vec(tnvector<Type> co) { assert(coeff_size() == co.dim()); coeff= co; } template <class Type> void polynomial<Type>::set_coeff_direct(int pos, Type value) { assert(coeff_size() > pos); coeff.set(pos, value); } template <class Type> tnvector<Type> polynomial<Type>::coeff_vec() { return coeff; } template <class Type> void polynomial<Type>::set_origin(tnvector<Type> orig) { assert(orig.dim() == dimen); org= orig; } template <class Type> tnvector<Type> polynomial<Type>::origin() { return org; } template <class Type> void polynomial<Type>::read(istream& is) { char pk; pk= is.peek(); while((pk == '#') || (pk == '\n')) { is.ignore(80, '\n'); pk= is.peek(); } is.ignore(80,' '); is >> dimen; is.ignore(80,' '); is >> ord; is.ignore(80,' '); org.resize(dimen); is >> org; pk= is.peek(); is.ignore(80,'\n'); coeff.resize(coeff_size()); is >> coeff; } template <class Type> istream& operator>>(istream& is, polynomial<Type>& p) { p.read(is); } template <class Type> void polynomial<Type>::nice_output(ostream& os) { os << "dimension: " << dimen << endl; os << "order: " << ord << endl; os << "origin: "; os << org; os << endl; os << "coefficients: " << endl; clock clk; for (int order= 0; order <= ord; order++) { clk.reset(0, 0, dimen-1, 0, order); while(clk.advance()) { os << clk.all(); os << ": "; os << coefficient(clk.all()); os << endl; } os << endl; } os << endl; } template <class Type> ostream& operator<<(ostream& os, polynomial<Type>& p) { os << "dimension: " << p.dimen << endl; os << "order: " << p.ord << endl; os << "origin: "; os << p.org; os << endl; os << "coefficients: " << endl; os << p.coeff; os << endl; return os; }