#include #include class Complex { public: Complex(double = 0., double = 0.); double real() const; double imag() const { return m_imag; } double mag() const ; double mag2() const ; Complex coniugate() const ; Complex inverse() const ; Complex& operator+=(Complex const& rhs); private: double m_real; double m_imag; }; inline double Complex::real() const{ return m_real; } Complex operator+(Complex const& lhs, Complex const& rhs); Complex operator-(Complex const& lhs, Complex const& rhs); Complex operator*(Complex const& lhs, Complex const& rhs); Complex operator/(Complex const& lhs, Complex const& rhs); Complex operator-(Complex const& lhs); double abs(Complex const& c); std::ostream& operator<<(std::ostream&, Complex const&); Complex::Complex(double re, double im) : m_real(re), m_imag(im){ } Complex& Complex::operator+=(Complex const& rhs) { m_real += rhs.m_real; m_imag += rhs.m_imag; return *this; } Complex operator-(Complex const& rhs){ return Complex(-rhs.real(), -rhs.imag()); } Complex operator+(Complex const& lhs, Complex const& rhs){ return Complex(lhs.real() + rhs.real(), lhs.imag() + rhs.imag()); } Complex operator-(Complex const& lhs, Complex const& rhs){ return Complex(lhs.real() - rhs.real(), lhs.imag() - rhs.imag()); } std::ostream& operator<<(std::ostream& os, Complex const& c){ //(re,im) os << c.real() << "+i" << c.imag() ; return os; } Complex operator*(Complex const& lhs, Complex const& rhs){ return Complex(lhs.real()*rhs.real()-lhs.imag()*rhs.imag(), lhs.imag()*rhs.real()+ rhs.imag()*lhs.real()); } Complex operator/(Complex const& lhs, Complex const& rhs){ return lhs*rhs.inverse(); } Complex Complex::coniugate() const { return Complex(real(),-imag()); } Complex Complex::inverse() const { return 1./mag2()*coniugate(); } double Complex::mag2() const { return (real()*real()+imag()*imag()); } double Complex::mag() const { return sqrt(real()*real()+imag()*imag()); }