src/math/ds/eint/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../../util/traits/others/lib.hpp" | ||
| 4 | |||
| 5 | namespace tifa_libs { | ||
| 6 | |||
| 7 | template <class T> | ||
| 8 | class eint { | ||
| 9 | T r_, i_; | ||
| 10 | |||
| 11 | public: | ||
| 12 | // $\omega$, $\omega^2$ | ||
| 13 | // $1+\omega+\omega^2=0$ | ||
| 14 | const static inline eint<T> w{0, 1}, w2{-T(1), -T(1)}; | ||
| 15 | |||
| 16 | 388708875 | CEXP eint(cT_(T) real = T{}, cT_(T) imag = T{}) NE : r_(real), i_(imag) {} | |
| 17 | |||
| 18 | 10224559662 | CEXP T CR real() CNE { return r_; } | |
| 19 | 13815146763 | CEXP T CR imag() CNE { return i_; } | |
| 20 | CEXP T norm() CNE { return r_ * (r_ - i_) + i_ * i_; } | ||
| 21 | 10866317 | CEXP T& real() NE { return r_; } | |
| 22 | 4426935 | CEXP T& imag() NE { return i_; } | |
| 23 | 15289886 | CEXP void real(cT_(T) x) NE { r_ = x; } | |
| 24 | 3392 | CEXP void imag(cT_(T) x) NE { i_ = x; } | |
| 25 | CEXP eint& operator+=(cT_(T) x) NE { | ||
| 26 | r_ += x; | ||
| 27 | return *this; | ||
| 28 | } | ||
| 29 | CEXP eint& operator-=(cT_(T) x) NE { | ||
| 30 | r_ -= x; | ||
| 31 | return *this; | ||
| 32 | } | ||
| 33 | CEXP eint& operator*=(cT_(T) x) NE { | ||
| 34 | r_ *= x, i_ *= x; | ||
| 35 | return *this; | ||
| 36 | } | ||
| 37 | 2909226132 | CEXP eint& operator+=(eint CR x) NE { | |
| 38 | 2909226132 | r_ += x.real(), i_ += x.imag(); | |
| 39 | 2909226132 | return *this; | |
| 40 | } | ||
| 41 | 134159328 | CEXP eint& operator-=(eint CR x) NE { | |
| 42 | 134159328 | r_ -= x.real(), i_ -= x.imag(); | |
| 43 | 134159328 | return *this; | |
| 44 | } | ||
| 45 | 3590587101 | CEXP eint& operator*=(eint CR x) NE { | |
| 46 | 3590587101 | T _ = r_; | |
| 47 | 3590587101 | r_ = r_ * x.real() - i_ * x.imag(), i_ = i_ * x.real() + _ * x.imag() - i_ * x.imag(); | |
| 48 | 3590587101 | return *this; | |
| 49 | } | ||
| 50 | friend CEXP eint operator+(eint x, cT_(T) y) NE { return x += y; } | ||
| 51 | friend CEXP eint operator-(eint x, cT_(T) y) NE { return x -= y; } | ||
| 52 | friend CEXP eint operator*(eint x, cT_(T) y) NE { return x *= y; } | ||
| 53 | 1636129692 | friend CEXP eint operator+(eint x, eint CR y) NE { return x += y; } | |
| 54 | 134159328 | friend CEXP eint operator-(eint x, eint CR y) NE { return x -= y; } | |
| 55 | 3489874632 | friend CEXP eint operator*(eint x, eint CR y) NE { return x *= y; } | |
| 56 | CEXP eint operator+() CNE { return *this; } | ||
| 57 | CEXP eint operator-() CNE { return eint(-r_, -i_); } | ||
| 58 | friend CEXP T norm(eint CR x) NE { return x.norm(); } | ||
| 59 | 134159328 | friend CEXP eint conj(eint CR x) NE { return eint{x.r_ - x.i_, -x.i_}; } | |
| 60 | friend CEXP bool operator==(eint CR x, eint CR y) NE { return x.real() == y.real() && x.imag() == y.imag(); } | ||
| 61 | friend auto& operator>>(istream_c auto& is, eint& x) NE { return is >> x.r_ >> x.i_; } | ||
| 62 | friend auto& operator<<(ostream_c auto& os, eint CR x) NE { return os << x.real() << ' ' << x.imag(); } | ||
| 63 | }; | ||
| 64 | |||
| 65 | } // namespace tifa_libs | ||
| 66 |