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}