template <class Type>
dpolynom<Type>::dpolynom()
{
dimen= 1;
ord= 0;
}
template <class Type>
dpolynom<Type>::dpolynom(int dim, int order)
{
dimen= dim;
ord= order;
coeff.resize(coeff_size());
org.resize(dim);
}
template <class Type>
dpolynom<Type>::dpolynom(int dim, int order, tnvector<Type>& a,
tnvector<Type>& origin)
{
dimen= dim;
ord= order;
coeff= a;
org= origin;
}
template <class Type>
dpolynom<Type>::dpolynom(dpolynom<Type>& p)
{
dimen= p.dimen;
ord= p.ord;
coeff= p.coeff;
org= p.org;
}
template <class Type>
dpolynom<Type>::dpolynom(istream& is)
{
read(is);
}
template <class Type>
dpolynom<Type>::~dpolynom()
{
}
template <class Type>
void dpolynom<Type>::resize(int dim, int order)
{
dimen= dim;
ord= order;
coeff.resize(coeff_size());
org.resize(dim);
}
template <class Type>
int dpolynom<Type>::dim()
{
return dimen;
}
template <class Type>
int dpolynom<Type>::order()
{
return ord;
}
template <class Type>
int dpolynom<Type>::coeff_size()
{
int sz= 0;
dclock clk(-dimen, 1, dimen-1, 0, ord-1);
while(clk.advance())
{
sz++;
}
clk.reset(-dimen, 1, dimen-1, 0, ord);
while(clk.advance())
{
sz++;
}
return sz;
}
template <class Type>
Type dpolynom<Type>::value(tnvector<Type> x)
{
assert(dimen == x.dim());
dclock clk;
int pos= 0, ibuf;
Type buf;
Type result= 0;
x-= org;
for(int order= ord-1; order <= ord; order++)
{
clk.reset(-dimen, 1, dimen-1, 0, order);
while(clk.advance())
{
buf= coeff[pos];
for(int j= 0; j < order; j++)
{
ibuf= clk[j];
if (ibuf < 0)
{
ibuf= abs(ibuf)-1;
if (fabs(x[ibuf]) > epsilon)
{
buf/= x[ibuf];
}
else
{
return 0;
}
}
else
{
buf*= x[ibuf];
}
}
result+= buf;
pos++;
}
}
return result;
}
template <class Type>
Type dpolynom<Type>::coefficient(tnvector<int> i)
{
assert((i.dim() == ord-1) || (i.dim() == ord));
int pos= 0;
dclock clk;
for (int order= ord-1; order <= ord; order++)
{
clk.reset(-dimen, 1, dimen-1, 0, order);
while(clk.advance())
{
if (i == clk.all())
{
return coeff[pos];
}
else
{
pos++;
}
}
}
return 0;
}
template <class Type>
void dpolynom<Type>::set_coeff_vec(tnvector<Type> co)
{
assert(coeff_size() == co.dim());
coeff= co;
}
template <class Type>
void dpolynom<Type>::set_coeff_direct(int pos, Type value)
{
assert(coeff_size() > pos);
coeff.set(pos, value);
}
template <class Type>
tnvector<Type> dpolynom<Type>::coeff_vec()
{
return coeff;
}
template <class Type>
void dpolynom<Type>::set_origin(tnvector<Type> orig)
{
assert(orig.dim() == dimen);
org= orig;
}
template <class Type>
tnvector<Type> dpolynom<Type>::origin()
{
return org;
}
template <class Type>
void dpolynom<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>
void dpolynom<Type>::nice_output(ostream& os)
{
os << "dimension: " << dimen << endl;
os << "order: " << ord << endl;
os << "origin: ";
os << org;
os << endl;
os << "coefficients: " << endl;
dclock clk;
int pos= 0;
for (int order= ord-1; order <= ord; order++)
{
clk.reset(-dimen, 1, dimen-1, 0, order);
while(clk.advance())
{
os << clk.all();
os << ": ";
os << coeff[pos];
os << endl;
pos++;
}
os << endl;
}
os << endl;
}
template <class Type>
istream& operator>>(istream& is, dpolynom<Type>& p)
{
p.read(is);
}
template <class Type>
ostream& operator<<(ostream& os, dpolynom<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;
}