#include "Polynomial.h"

// *************    Polynomial *********************************

Polynomial::Polynomial(double coeff, unsigned int degree)
:	_coefficients(degree + 1, 0.0),
	_degree((coeff == 0)? 0:degree)
{	_coefficients[degree] = coeff;
}

Polynomial::Polynomial(unsigned int maximumDegree) // private 
:	_coefficients(maximumDegree+1, 0.0),
	_degree(maximumDegree)
{
}

/*
Polynomial::Polynomial(const Monomial &m)
:	_coefficients(m.degree()+1, 0.0),
	_degree(m.degree())
{	_coefficients[_degree] = m.coefficient(); 
}

Polynomial::Polynomial(const Polynomial& p)
:	_coefficients(p._coefficients),
	_maximumDegree(p._maximumDegree),
	_degree(p._degree)
{
}

Polynomial::~Polynomial()
{	// nothing
}

Polynomial Polynomial::operator =( const Polynomial& p)
{	if(this != &p)
	{	_coefficients = p._coefficients;
		_degree = p._degree;
	}
	return *this;
}
*/

unsigned int Polynomial::degree() const 
{	return _degree;
}

double Polynomial::coefficient(unsigned int term) const 
{	if(term > _degree) return 0.0;
	return _coefficients[term];
}

double Polynomial::evaluate(double x) const
{	double result = 0.0;
	for(int i = _degree; i >= 0; i--)
	{	result = result*x + _coefficients[ i];
	}
	return result;
}

Polynomial Polynomial::differentiate() const
{	Polynomial result(_degree-1);
	for(int i = 0; i<= result._degree; i++)
	{	result._coefficients[i] = _coefficients[i+1] * (i+1);
	}
	return result;
}

Polynomial Polynomial::operator +(const Polynomial& p) const
{	unsigned int degree = (_degree < p._degree) ? p._degree : _degree;
	unsigned int i;
	Polynomial result(degree);
	for(i = 0; i <= p._degree; i++)
		result._coefficients[i] =  p._coefficients[i];
	for (i = 0; i<= _degree; i++)
		result._coefficients[i] += _coefficients[i] ;
	return result;
}

ostream& operator <<(ostream& os, const Polynomial& p)
{	if(p._degree == 0)
		cout << "0.0x^0";
	else
	{	for(int i = 0; i<=p._degree; i++)
		{	if(i < p._degree && p._coefficients[i+1] > 0.0) cout << "+";
			if(p._coefficients[i] != 0.0)
			{	os << p._coefficients[i] <<"x^"<<i<<' ';
			}
		}
	}
	return os;
}

