Guest User

Untitled

a guest
Jan 3rd, 2011
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include "polynomial.h"
  2. #include <limits>
  3.  
  4. Term::Term(double a, int n) : a(a), n(n) {}
  5.  
  6. Complex::Complex(double a, double b) : a(a), b(b) {}
  7. Complex::Complex(double a) : a(a), b(0) {}
  8. Complex::Complex() : a(0), b(0) {}
  9.  
  10. Complex operator + (Complex A, Complex B){
  11.     return Complex(A.a+B.a, A.b+B.b);
  12. }
  13. Complex operator - (Complex A, Complex B){
  14.     return Complex(A.a-B.a, A.b-B.b);
  15. }
  16. Complex operator * (Complex A, Complex B){
  17.     return Complex(A.a*B.a - A.b*B.b, A.a*B.b + A.b*B.a);
  18. }
  19. Complex operator / (Complex A, Complex B){
  20.     return Complex( (A.a*B.a+A.b*B.b) / (B.a*B.a+B.b*B.b), (A.b*B.a-A.a*B.b) / (B.a*B.a+B.b*B.b) );
  21. }
  22. bool operator == (Complex A, Complex B){
  23.     return abs(A.a-B.a) < std::numeric_limits<double>::epsilon()*256
  24.         && abs(A.b-B.b) < std::numeric_limits<double>::epsilon()*256;
  25. }
  26.  
  27. std::ostream& operator << (std::ostream& out, Complex c){
  28.     out << "(" << c.a << ", " << c.b << "i)";
  29.     return out;
  30. }
  31.  
  32. Complex pow(Complex c, int n){
  33.     if(n == 0) return 1;
  34.     if(n == 1) return c;
  35.     return pow(c, n/2) * pow(c, n/2 + n%2);
  36. }
  37.  
  38. //f(x)
  39. Complex Polynomial::eval(Complex x){
  40.     Complex sum = 0;
  41.     for(unsigned i = 0; i < p.size(); i++)
  42.         sum = sum + p[i].a * pow(x, p[i].n);
  43.     return sum;
  44. }
  45.  
  46. //highest power of x
  47. int Polynomial::degree(){
  48.     int max = 0;
  49.     for(unsigned i = 0; i < p.size(); i++)
  50.         max = max > p[i].n ? max : p[i].n;
  51.     return max;
  52. }
  53.  
  54. //Durand–Kerner method
  55. std::vector<Complex> Polynomial::solve(){
  56.     std::vector<Complex> approx;
  57.  
  58.     Term max(0, 0);
  59.     for(unsigned i = 0; i < p.size(); i++)
  60.         if(i == 0 || max.n < p[i].n) max = p[i];
  61.    
  62.     for(unsigned i = 0; i < p.size(); i++)
  63.         p[i].a /= max.a;
  64.  
  65.     for(unsigned i = 0; i < max.n; i++)
  66.         approx.push_back( Complex( rand()%32768/65536.0, rand()%32768/65536.0 ) );
  67.  
  68.     while(1){
  69.         std::vector<Complex> root(approx.size());
  70.  
  71.         bool end = true;
  72.  
  73.         for(unsigned i = 0; i < approx.size(); i++){
  74.             root[i] = 1;
  75.             for(unsigned j = 0; j < approx.size(); j++)
  76.                 if(i != j) root[i] = root[i] * (approx[i]-approx[j]);
  77.             root[i] = approx[i] - eval(approx[i])/root[i];
  78.  
  79.             end &= root[i] == approx[i];
  80.         }
  81.  
  82.         if(end) return root;
  83.         else approx = root;
  84.     }
  85. }
  86.  
  87. std::ostream& operator << (std::ostream& out, Polynomial p){
  88.     for(unsigned i = 0; i < p.p.size(); i++){
  89.         if(i != 0 && p.p[i].a > 0) out << "+";
  90.         out << p.p[i].a << "*x^" << p.p[i].n << " ";
  91.     }
  92.     return out;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment