#include "Polinom.hpp"
using namespace std;


Polinom::Polinom(const vector<float>& koef){
	_koeficijenti.resize(koef.size());
	for (int i=0; i<koef.size();i++)
		_koeficijenti[i] = koef[i];
}

Polinom* Polinom::operator + (const Polinom& p) const{
	unsigned min;
	vector<float> koef;

	if (_koeficijenti.size()<p._koeficijenti.size()){
		min = _koeficijenti.size();
		koef.resize(p._koeficijenti.size());
		for (int i=min; i<p._koeficijenti.size();i++)
			koef[i] = p._koeficijenti[i];
		
		
	} else{
                min = p._koeficijenti.size();
		koef.resize(_koeficijenti.size());
		for (int i=min; i<_koeficijenti.size();i++)
			koef[i] = _koeficijenti[i];
	}
	for (int i=0; i< min;i++){
		koef[i] = p._koeficijenti[i]+_koeficijenti[i];
	}
	return new Polinom(koef);
}


Polinom* Polinom::operator - (const Polinom& p) const{
	unsigned min;
	vector<float> koef;

	if (_koeficijenti.size()<p._koeficijenti.size()){
		min = _koeficijenti.size();
		koef.resize(p._koeficijenti.size());
		for (int i=min; i<p._koeficijenti.size();i++)
			koef[i] = p._koeficijenti[i];
		
		
	} else{
                min = p._koeficijenti.size();
		koef.resize(_koeficijenti.size());
		for (int i=min; i<_koeficijenti.size();i++)
			koef[i] = _koeficijenti[i];
	}
	for (int i=0; i< min;i++){
		koef[i] = p._koeficijenti[i]-_koeficijenti[i];
	}
	return new Polinom(koef);
}


Polinom* Polinom::integral(const float& slobodni) const{
	vector<float> koef;
	koef.resize(_koeficijenti.size()+1);
	koef[0] = slobodni;
	for (int i=1; i< _koeficijenti.size();i++)
		koef[i] = _koeficijenti[i-1] / (i+1);
	return new Polinom(koef);
}

void Polinom::ispisiSe() const{
	//cout<<"pozvana";
	for (int i=0;i<_koeficijenti.size();i++){
		if (i!=0) {
			if (_koeficijenti[i]>0)
				cout<<"+";
			if (_koeficijenti[i]==-1)
				cout<<"-";
			if (_koeficijenti[i]!=1 && _koeficijenti[i]!=-1 && _koeficijenti[i]!=0)
				cout<<_koeficijenti[i];
		if (i==1) cout<<"x";
                else      cout<<"x"<<"^"<<i;

	} else cout<<_koeficijenti[0];
	
       }

}

ostream& operator << (ostream& out, const Polinom& p){
	p.ispisiSe();
        return out;
}

Polinom* Polinom::operator * (const Polinom& p) const{
    //Polinom result;
    vector<float> koef;
    koef.resize(_koeficijenti.size()+p._koeficijenti.size());
    for (int i=0; i<_koeficijenti.size();i++)
       for (int j=0;j<p._koeficijenti.size();j++)
            koef[i+j]=0;
    for (int i=0; i<_koeficijenti.size();i++)
       for (int j=0;j<p._koeficijenti.size();j++)
            koef[i+j]+=_koeficijenti[i]*p._koeficijenti[j];
    return new Polinom(koef);
}

bool  Polinom::operator == (const Polinom& p) const{
     if (_koeficijenti.size()!=p._koeficijenti.size())
           return false;
     for (int i=0;i<_koeficijenti.size();i++)
        if (_koeficijenti[i]!=p._koeficijenti[i])
            return false;
     return true;
}
      
Polinom* Polinom::izvod() const{
   //Polinom result;
   vector<float> koef;
   koef.resize(_koeficijenti.size()-1);
   for (int i=1;i<_koeficijenti.size();i++)
      koef[i-1]=_koeficijenti[i]*i;
   return new Polinom(koef);
}


float Polinom::operator [] (const float& tacka) const{
   float suma=0;
   for (int i=0;i<_koeficijenti.size();i++){
       float pomocni=1;
       for (int j=0;j<i;j++){
           pomocni*=tacka;
       }
       suma+=_koeficijenti[i]*pomocni;
   }
   return suma;
}

Polinom* Polinom::unarniMinus() const{
    //Polinom result;
    vector<float> koef;
    koef.resize(_koeficijenti.size());
    for (int i=0; i<_koeficijenti.size();i++)
       koef[i]=-1*_koeficijenti[i];
    return new Polinom(koef);
}


