File indexing completed on 2025-04-19 09:09:49
0001 #ifndef ATOOLS_Math_Kabbala_H
0002 #define ATOOLS_Math_Kabbala_H
0003
0004 #include "ATOOLS/Math/MyComplex.H"
0005 #include "ATOOLS/Math/MathTools.H"
0006 #include "ATOOLS/Org/MyStrStream.H"
0007
0008 namespace ATOOLS {
0009 class Kabbala {
0010 std::string shem;
0011 Complex rishbon;
0012 public:
0013 Kabbala(const std::string str = std::string(""),const Complex C = Complex(0.,0.)) {
0014 shem = str;
0015 rishbon = C;
0016 }
0017 Kabbala(const Kabbala& k) {
0018 shem = k.String();
0019 rishbon = k.Value();
0020 }
0021 Kabbala& operator=(const Kabbala& k) {
0022 if (this!=&k) {
0023 shem = k.String();
0024 rishbon = k.Value();
0025 }
0026 return *this;
0027 }
0028 Kabbala& operator+=(const Kabbala& k);
0029 Kabbala& operator-=(const Kabbala& k);
0030
0031 Kabbala operator-();
0032 Kabbala operator+();
0033
0034 Kabbala& operator*=(const int& i);
0035 Kabbala& operator*=(const Kabbala& k);
0036 Kabbala& operator*=(const double& d);
0037 Kabbala& operator*=(const Complex& c);
0038 Kabbala& operator/=(const Kabbala& k);
0039
0040 const Complex &Value() const {return rishbon;}
0041 const std::string &String() const {return shem;}
0042
0043 void SetValue(Complex val) {rishbon = val;}
0044 void SetString(std::string str) {shem = str;}
0045
0046 friend int IsZero(const Kabbala& a);
0047 friend int IsEqual(const Kabbala& a,const Complex& b);
0048 };
0049
0050 inline int IsZero(const Kabbala& a) {
0051 return ATOOLS::IsZero(a.Value());
0052 }
0053
0054 inline int IsEqual(const Kabbala& a,const Complex& b) {
0055 return ATOOLS::IsEqual(a.Value(),b);
0056 }
0057
0058 inline Kabbala operator+(const Kabbala& k1,const Kabbala& k2)
0059 {
0060 Kabbala k(k1);
0061 k += k2;
0062 return k;
0063 }
0064
0065 inline Kabbala operator-(const Kabbala& k1,const Kabbala& k2)
0066 {
0067 Kabbala k(k1);
0068 k -= k2;
0069 return k;
0070 }
0071
0072 inline Kabbala operator* (const Kabbala& k1, const Kabbala& k2)
0073 {
0074 Kabbala k(k1);
0075 k *= k2;
0076 return k;
0077 }
0078
0079 inline Kabbala operator* (const int& i1, const Kabbala& k2)
0080 {
0081 Kabbala k(k2);
0082 k *= i1;
0083 return k;
0084 }
0085
0086 inline Kabbala operator* (const Kabbala& k1,const int& i2)
0087 {
0088 return i2*k1;
0089 }
0090
0091
0092 inline Kabbala operator* (const double d1, const Kabbala& k2)
0093 {
0094 Kabbala k(k2);
0095 k *= d1;
0096 return k;
0097 }
0098
0099 inline Kabbala operator* (const Kabbala& k1,const double d2)
0100 {
0101 return d2*k1;
0102 }
0103
0104 inline Kabbala operator* (const Complex c1, const Kabbala& k2)
0105 {
0106 Kabbala k(k2);
0107 k *= c1;
0108 return k;
0109 }
0110
0111 inline Kabbala operator* (const Kabbala& k1,const Complex c2)
0112 {
0113 Kabbala k(k1);
0114 k *= c2;
0115 return k;
0116 }
0117
0118 inline Kabbala operator/ (const Kabbala& k1, const Kabbala& k2)
0119 {
0120 Kabbala k(k1);
0121 k /= k2;
0122 return k;
0123 }
0124
0125 inline bool operator==(const Kabbala& k1,const Kabbala& k2)
0126 {
0127 if (k1.Value()!=k2.Value()) return false;
0128 if (k1.String()!=k2.String()) return false;
0129 return true;
0130 }
0131
0132 inline bool operator!=(const Kabbala& k1,const Kabbala& k2)
0133 {
0134 return !(k1==k2);
0135 }
0136
0137 inline Kabbala exp(const Kabbala& k1)
0138 {
0139 Kabbala k(k1);
0140
0141 k.SetValue(std::exp(k.Value()));
0142 k.SetString(std::string("exp(") + k.String() + std::string(")"));
0143
0144 return k;
0145 }
0146
0147 inline Kabbala sin(const Kabbala& k1)
0148 {
0149 Kabbala k(k1);
0150 return k;
0151 }
0152 }
0153
0154 #endif
0155
0156