tmn/complex/
mod.rs

1//!Complex Numbers
2
3
4///Structure for storing complex numbers
5///
6/// Структура для хранения комплексных чисел
7#[derive(Copy, Clone)]
8pub struct CNum {
9    r:f32,
10    i:f32
11}
12
13impl CNum {
14    ///The function for creating a complex number from the real and imaginary parts
15    ///
16    ///Функция для создания комплексного числа из действительной и мнимой части
17    ///
18    /// # Example
19    ///
20    ///```
21    /// use tmn::complex::CNum;
22    /// let a = CNum::make(4_f32, -2_f32);
23    /// assert_eq!((4_f32, -2_f32), a.get());
24    /// ```
25    pub fn make(r:f32, i:f32)->Self{ Self{r,i } }
26    /// The method that returns a tuple consisting of the real and imaginary parts of a complex number
27    ///
28    /// Метод, возвращающий кортеж состоящий из действительной и мнимой части комплексного числа
29    ///
30    /// # Example
31    /// ```
32    /// use tmn::cnum;
33    /// use tmn::complex::CNum;
34    /// let a = cnum!(43_f32, 21_f32);
35    /// assert_eq!((43_f32, 21_f32), a.get());
36    /// ```
37    pub fn get(&self) -> (f32, f32){ (self.r, self.i) }
38    /// The method that returns a complex conjugate number
39    ///
40    /// Метод, возвращающий комплексно сопряженное число
41    ///
42    /// # Example
43    /// ```
44    /// use tmn::cnum;
45    /// use tmn::complex::CNum;
46    /// let a = cnum!(1_f32, 1_f32);
47    /// let c = a.conj();
48    /// assert_eq!((1_f32, -1_f32), c.get());
49    /// ```
50    pub fn conj(&self) -> CNum{CNum{r:self.r, i:-self.i}}
51    ///The method that returns the modulus of a complex number
52    ///
53    ///Метод, возвращающий модуль комплексного числа
54    ///
55    /// # Example
56    ///```
57    /// use tmn::cnum;
58    /// use tmn::complex::CNum;
59    /// let a = cnum!(3_f32, 4_f32);
60    /// assert_eq!(5_f32, a.modl());
61    /// ```
62    pub fn modl(&self) -> f32{
63        let mut temp = self.clone();
64        temp.mult(&self.conj());
65        temp.r.powf(0.5)
66    }
67    ///A method that adds another complex number to a given one
68    ///
69    ///Метод, прибавляющий другое комплексное число к данному
70    ///
71    /// # Example
72    ///```
73    /// use tmn::cnum;
74    /// use tmn::complex::CNum;
75    /// let mut a = cnum!(6_f32, 2_f32);
76    /// a.add(&cnum!(4_f32, 8_f32));
77    /// assert_eq!((10_f32, 10_f32), a.get());
78    /// ```
79    pub fn add(&mut self, v: &CNum){
80        self.r += v.r;
81        self.i += v.i;
82    }
83    /// The method that multiplies another complex number to a given one
84    ///
85    /// Метод, умножающий другое комплексное число к данному
86    /// # Example
87    /// ```
88    /// use tmn::cnum;
89    /// use tmn::complex::CNum;
90    /// let mut a = cnum!(3_f32, 2_f32);
91    /// a.mult(&cnum!(5_f32, 3_f32));
92    /// assert_eq!((9_f32, 19_f32), a.get());
93    /// ```
94    pub fn mult(&mut self, v:&CNum){
95        let (r, i) = self.get();
96        self.r = r * v.r - i * v.i;
97        self.i = r * v.i + v.r * i;
98    }
99    ///The method that divides another complex number to a given one
100    ///
101    /// Метод, делящий данное комплексное число на другое
102    /// # Example
103    ///```
104    /// use tmn::cnum;
105    /// use tmn::complex::CNum;
106    /// let mut a = cnum!(3_f32, 2_f32);
107    /// a.div(&cnum!(5_f32, 3_f32));
108    /// assert_eq!((21_f32/34_f32, 1_f32/34_f32), a.get());
109    /// ```
110    pub fn div(&mut self, v:&CNum){
111        let mut vtemp = v.clone();
112        vtemp.mult(&v.conj());
113        let divisor = vtemp.r;
114        let mut numerator = self.clone();
115        numerator.mult(&v.conj());
116        numerator.mult(&CNum::make(1_f32/divisor, 0.0));
117        self.r = numerator.r;
118        self.i = numerator.i;
119    }
120    /// The method for raising a complex number to a power. Degrees less than one (roots) are counted with k = 0
121    ///
122    /// Метод для возведения комплексного числа в степень. Степени меньше единицы (корни) считаются с k = 0
123    ///
124    /// # Example
125    /// ```
126    /// use tmn::cnum;
127    /// use tmn::complex::CNum;
128    /// let mut a = cnum!(3_f32, 2_f32);
129    /// a.pow(2_f32);
130    /// let (r, i) = a.get();
131    /// assert!((r-5_f32).abs() < 0.000001);
132    /// assert!((i-12_f32).abs() < 0.000001);
133    /// ```
134    pub fn pow(&mut self, v:f32){
135        let (r, i) = (self.r, self.i);
136        let l = self.modl();
137        self.r = l.powf(v)*(v * i.atan2(r)).cos();
138        self.i = l.powf(v)*(v * i.atan2(r)).sin();
139    }
140    ///The method that replaces r value
141    ///
142    ///Метод заменяющий r значение
143    /// # Example
144    ///```
145    /// use tmn::cnum;
146    /// use tmn::complex::CNum;
147    /// let mut a = cnum!(1_f32, 1_f32);
148    /// a.set_r(0.0);
149    /// assert_eq!((0_f32, 1_f32), a.get());
150    /// ```
151    pub fn set_r(&mut self, v:f32){
152        self.r = v;
153    }
154    ///The method that replaces i value
155    ///
156    ///Метод заменяющий i значение
157    /// # Example
158    ///```
159    /// use tmn::cnum;
160    /// use tmn::complex::CNum;
161    /// let mut a = cnum!(1_f32, 1_f32);
162    /// a.set_i(0.0);
163    /// assert_eq!((1_f32, 0_f32), a.get());
164    /// ```
165    pub fn set_i(&mut self, v:f32){
166        self.i = v;
167    }
168
169    ///The method that normalizes complex number
170    ///
171    ///Метод нормализирующий комлпексное число
172    /// # Example
173    ///```
174    /// use tmn::cnum;
175    /// use tmn::complex::CNum;
176    /// let mut a = cnum!(1_f32, 1_f32);
177    /// a.unit();
178    /// let (r, i) = a.get();
179    /// //Ожидаемый ответ (0.707~, 0.707~)
180    /// assert!((r-0.707).abs() < 0.001);
181    /// assert!((i-0.707).abs() < 0.001);
182    /// ```
183    pub fn unit(&mut self){
184        let l = self.modl();
185        self.r /= l;
186        self.i /= l;
187    }
188}
189
190///The macros that creates complex number
191///
192///Макрос создающий комплексное число
193/// # Example
194///```
195/// use tmn::cnum;
196/// use tmn::complex::CNum;
197/// let mut a = cnum!(1_f32, 1_f32);
198/// assert_eq!((1_f32, 1_f32), a.get());
199/// ```
200#[macro_export]
201macro_rules! cnum {
202    ($r:expr) => {
203        CNum::make(($r) as f32, 0f32)
204    };
205    ($r:expr, $i:expr) => {
206        CNum::make(($r) as f32, ($i) as f32)
207    };
208}
209
210impl PartialEq for CNum{
211    fn eq(&self, other: &Self) -> bool {
212        self.get()==other.get()
213    }
214}