Polynomial& operator*=(const Polynomial &q) { Polynomial u; int k=(deg()+q.deg()); u.setA(k,0); double w=0; int i=0; int j=0; for(i=0; i<=deg(); i++) { for( j=0; j<=q.deg(); j++) { u.setA(i+j,u.getA(i+j)+getA(i)*q.getA(j)) ; } j=0; } for(i=0; i<=k; i++) { setA(i,u.getA(i)); } }
double value(Polynomial p, double x) { //wartoϾ w a = reszcie z p/(x-a) double m=p.getA(p.deg()); for(int i = p.deg()-1; i >= 0; i--) m=m*x+p.getA(i); return m; }
void div(const Polynomial &W, const Polynomial &P, Polynomial &Q, Polynomial &R){ R = W; for(int i=R.deg();i>=0 && R.deg()>=P.deg();i--){ Q.setA(i-P.deg(), R.getA(i)/P.getA(P.deg())); for(int a=P.deg();a>=0;a--){ R.setA((i-P.deg())+a, R.getA((i-P.deg())+a)-( P.getA(a) * Q.getA(i-P.deg()) ) ); } } }
Polynomial add(Polynomial q, Polynomial p) { int stW; stW = max(q.deg(), p.deg()); Polynomial w; for(int i=0; i <= stW; i++) w.setA(i, p.getA(i)+q.getA(i)); return w; }
void div(Polynomial p, Polynomial q, Polynomial &wynik, Polynomial &reszta) { int b = p.deg(); Polynomial l; Polynomial prev_wynik; for(int i = b-q.deg(); p.deg() >= q.deg(); i--) { wynik.setA(i, p.getA(p.deg())/q.getA(q.deg())); l = mult(q, add(wynik, mult2(prev_wynik, -1))); p = add(p, mult2(l, -1)); prev_wynik = wynik; } reszta = p; }
Polynomial mult2(Polynomial p, double x) //mnozy wielomian przez liczbe { Polynomial v; for(int i = 0; i <= p.deg(); i++) v.setA(i, p.getA(i)*x); return v; }
bool operator!=(const Polynomial &q) const { if (deg()==q.deg()) {return false;} for(int i=1; i<= deg(); i++) { if (getA(i)==q.getA(i)) return false; } return true; }
const Polynomial operator*(const Polynomial &q) const { Polynomial u; int k=(deg()+q.deg()); u.setA(k,0); double w=0; int i=0; int j=0; for(i=0; i<=deg(); i++) { for( j=0; j<=q.deg(); j++) { u.setA(i+j,u.getA(i+j)+getA(i)*q.getA(j)) ; } j=0; } return u; }
const Polynomial operator+(const Polynomial &q) const { Polynomial w; int k=max(deg(), q.deg()); w.setA(k,0); for(int i=0; i<=k; i++) { w.setA(i,getA(i)+q.getA(i)); } return w; }
bool operator==(const Polynomial &q) const { if(deg() != q.deg()) { return false; } for(int i = 0; i < deg(); i++) { if(a[i] != q.getA(i)) { return false; } } return true; }
vector<double> Polynomial :: rational_roots(Polynomial q) { cout<<endl<<"będę zaokrąglał niecałkowite współczynniki"<<endl; vector<double> r; vector<int> z; vector<int> o; for(int i = 0; i < q.getA(0); i++) { if( (int)q.getA(0) % 1 == 0 && (int)q.getA(0) % i == 0) { z.push_back(i); z.push_back(-i); } } for(int i = 0; i < q.getA(q.deg() + 1); i++) { if((int)q.getA(q.deg() + 1) % 1 == 0 && (int) q.getA(q.deg() + 1) % i == 0) { o.push_back(i); o.push_back(-i); } } for(int i = 0; i < z.size(); i++) { for(int j = 0; j < o.size(); j++) { if(value(q, j/i) == 0) { r.push_back(j/i); } } } return r; }