@@ -14,51 +14,63 @@ export default class ComplexNumber {
1414 }
1515
1616 /**
17- * @param {ComplexNumber } addend
17+ * @param {ComplexNumber|number } addend
1818 * @return {ComplexNumber }
1919 */
2020 add ( addend ) {
21+ // Make sure we're dealing with complex number.
22+ const complexAddend = this . toComplexNumber ( addend ) ;
23+
2124 return new ComplexNumber ( {
22- re : this . re + addend . re ,
23- im : this . im + addend . im ,
25+ re : this . re + complexAddend . re ,
26+ im : this . im + complexAddend . im ,
2427 } ) ;
2528 }
2629
2730 /**
28- * @param {ComplexNumber } subtrahend
31+ * @param {ComplexNumber|number } subtrahend
2932 * @return {ComplexNumber }
3033 */
3134 subtract ( subtrahend ) {
35+ // Make sure we're dealing with complex number.
36+ const complexSubtrahend = this . toComplexNumber ( subtrahend ) ;
37+
3238 return new ComplexNumber ( {
33- re : this . re - subtrahend . re ,
34- im : this . im - subtrahend . im ,
39+ re : this . re - complexSubtrahend . re ,
40+ im : this . im - complexSubtrahend . im ,
3541 } ) ;
3642 }
3743
3844 /**
39- * @param {ComplexNumber } multiplicand
45+ * @param {ComplexNumber|number } multiplicand
4046 * @return {ComplexNumber }
4147 */
4248 multiply ( multiplicand ) {
49+ // Make sure we're dealing with complex number.
50+ const complexMultiplicand = this . toComplexNumber ( multiplicand ) ;
51+
4352 return new ComplexNumber ( {
44- re : this . re * multiplicand . re - this . im * multiplicand . im ,
45- im : this . re * multiplicand . im + this . im * multiplicand . re ,
53+ re : this . re * complexMultiplicand . re - this . im * complexMultiplicand . im ,
54+ im : this . re * complexMultiplicand . im + this . im * complexMultiplicand . re ,
4655 } ) ;
4756 }
4857
4958 /**
50- * @param {ComplexNumber } divider
59+ * @param {ComplexNumber|number } divider
5160 * @return {ComplexNumber }
5261 */
5362 divide ( divider ) {
63+ // Make sure we're dealing with complex number.
64+ const complexDivider = this . toComplexNumber ( divider ) ;
65+
5466 // Get divider conjugate.
55- const dividerConjugate = this . conjugate ( divider ) ;
67+ const dividerConjugate = this . conjugate ( complexDivider ) ;
5668
5769 // Multiply dividend by divider's conjugate.
5870 const finalDivident = this . multiply ( dividerConjugate ) ;
5971
6072 // Calculating final divider using formula (a + bi)(a − bi) = a^2 + b^2
61- const finalDivider = ( divider . re ** 2 ) + ( divider . im ** 2 ) ;
73+ const finalDivider = ( complexDivider . re ** 2 ) + ( complexDivider . im ** 2 ) ;
6274
6375 return new ComplexNumber ( {
6476 re : finalDivident . re / finalDivider ,
@@ -67,9 +79,12 @@ export default class ComplexNumber {
6779 }
6880
6981 /**
70- * @param {ComplexNumber } complexNumber
82+ * @param {ComplexNumber|number } number
7183 */
72- conjugate ( complexNumber ) {
84+ conjugate ( number ) {
85+ // Make sure we're dealing with complex number.
86+ const complexNumber = this . toComplexNumber ( number ) ;
87+
7388 return new ComplexNumber ( {
7489 re : complexNumber . re ,
7590 im : - 1 * complexNumber . im ,
@@ -96,6 +111,18 @@ export default class ComplexNumber {
96111 phase = - ( Math . PI - phase ) ;
97112 } else if ( this . re > 0 && this . im < 0 ) {
98113 phase = - phase ;
114+ } else if ( this . re === 0 && this . im > 0 ) {
115+ phase = Math . PI / 2 ;
116+ } else if ( this . re === 0 && this . im < 0 ) {
117+ phase = - Math . PI / 2 ;
118+ } else if ( this . re < 0 && this . im === 0 ) {
119+ phase = Math . PI ;
120+ } else if ( this . re > 0 && this . im === 0 ) {
121+ phase = 0 ;
122+ } else if ( this . re === 0 && this . im === 0 ) {
123+ // More correctly would be to set 'indeterminate'.
124+ // But just for simplicity reasons let's set zero.
125+ phase = 0 ;
99126 }
100127
101128 if ( ! inRadians ) {
@@ -115,4 +142,19 @@ export default class ComplexNumber {
115142 phase : this . getPhase ( inRadians ) ,
116143 } ;
117144 }
145+
146+ /**
147+ * Convert real numbers to complex number.
148+ * In case if complex number is provided then lefts it as is.
149+ *
150+ * @param {ComplexNumber|number } number
151+ * @return {ComplexNumber }
152+ */
153+ toComplexNumber ( number ) {
154+ if ( number instanceof ComplexNumber ) {
155+ return number ;
156+ }
157+
158+ return new ComplexNumber ( { re : number } ) ;
159+ }
118160}
0 commit comments