Skip to content

Commit 53a0b61

Browse files
committedAug 15, 2018
Fix bug with converting complex number into polar form.
1 parent 4bdac18 commit 53a0b61

File tree

2 files changed

+97
-14
lines changed

2 files changed

+97
-14
lines changed
 

‎src/algorithms/math/complex-number/ComplexNumber.js

+56-14
Original file line numberDiff line numberDiff line change
@@ -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
}

‎src/algorithms/math/complex-number/__test__/ComplexNumber.test.js

+41
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,16 @@ describe('ComplexNumber', () => {
3333

3434
const complexNumber3 = complexNumber.add(realNumber);
3535
const complexNumber4 = realNumber.add(complexNumber);
36+
const complexNumber5 = complexNumber.add(3);
3637

3738
expect(complexNumber3.re).toBe(1 + 3);
3839
expect(complexNumber3.im).toBe(2);
3940

4041
expect(complexNumber4.re).toBe(1 + 3);
4142
expect(complexNumber4.im).toBe(2);
43+
44+
expect(complexNumber5.re).toBe(1 + 3);
45+
expect(complexNumber5.im).toBe(2);
4246
});
4347

4448
it('should subtract complex numbers', () => {
@@ -61,12 +65,16 @@ describe('ComplexNumber', () => {
6165

6266
const complexNumber3 = complexNumber.subtract(realNumber);
6367
const complexNumber4 = realNumber.subtract(complexNumber);
68+
const complexNumber5 = complexNumber.subtract(3);
6469

6570
expect(complexNumber3.re).toBe(1 - 3);
6671
expect(complexNumber3.im).toBe(2);
6772

6873
expect(complexNumber4.re).toBe(3 - 1);
6974
expect(complexNumber4.im).toBe(-2);
75+
76+
expect(complexNumber5.re).toBe(1 - 3);
77+
expect(complexNumber5.im).toBe(2);
7078
});
7179

7280
it('should multiply complex numbers', () => {
@@ -75,12 +83,16 @@ describe('ComplexNumber', () => {
7583

7684
const complexNumber3 = complexNumber1.multiply(complexNumber2);
7785
const complexNumber4 = complexNumber2.multiply(complexNumber1);
86+
const complexNumber5 = complexNumber1.multiply(5);
7887

7988
expect(complexNumber3.re).toBe(-11);
8089
expect(complexNumber3.im).toBe(23);
8190

8291
expect(complexNumber4.re).toBe(-11);
8392
expect(complexNumber4.im).toBe(23);
93+
94+
expect(complexNumber5.re).toBe(15);
95+
expect(complexNumber5.im).toBe(10);
8496
});
8597

8698
it('should multiply complex numbers by themselves', () => {
@@ -106,9 +118,13 @@ describe('ComplexNumber', () => {
106118
const complexNumber2 = new ComplexNumber({ re: 4, im: -5 });
107119

108120
const complexNumber3 = complexNumber1.divide(complexNumber2);
121+
const complexNumber4 = complexNumber1.divide(2);
109122

110123
expect(complexNumber3.re).toBe(-7 / 41);
111124
expect(complexNumber3.im).toBe(22 / 41);
125+
126+
expect(complexNumber4.re).toBe(1);
127+
expect(complexNumber4.im).toBe(1.5);
112128
});
113129

114130
it('should return complex number in polar form', () => {
@@ -136,5 +152,30 @@ describe('ComplexNumber', () => {
136152
expect(complexNumber5.getPolarForm().radius).toBeCloseTo(8.60);
137153
expect(complexNumber5.getPolarForm().phase).toBeCloseTo(0.95);
138154
expect(complexNumber5.getPolarForm(false).phase).toBeCloseTo(54.46);
155+
156+
const complexNumber6 = new ComplexNumber({ re: 0, im: 0.25 });
157+
expect(complexNumber6.getPolarForm().radius).toBeCloseTo(0.25);
158+
expect(complexNumber6.getPolarForm().phase).toBeCloseTo(1.57);
159+
expect(complexNumber6.getPolarForm(false).phase).toBeCloseTo(90);
160+
161+
const complexNumber7 = new ComplexNumber({ re: 0, im: -0.25 });
162+
expect(complexNumber7.getPolarForm().radius).toBeCloseTo(0.25);
163+
expect(complexNumber7.getPolarForm().phase).toBeCloseTo(-1.57);
164+
expect(complexNumber7.getPolarForm(false).phase).toBeCloseTo(-90);
165+
166+
const complexNumber8 = new ComplexNumber();
167+
expect(complexNumber8.getPolarForm().radius).toBeCloseTo(0);
168+
expect(complexNumber8.getPolarForm().phase).toBeCloseTo(0);
169+
expect(complexNumber8.getPolarForm(false).phase).toBeCloseTo(0);
170+
171+
const complexNumber9 = new ComplexNumber({ re: -0.25, im: 0 });
172+
expect(complexNumber9.getPolarForm().radius).toBeCloseTo(0.25);
173+
expect(complexNumber9.getPolarForm().phase).toBeCloseTo(Math.PI);
174+
expect(complexNumber9.getPolarForm(false).phase).toBeCloseTo(180);
175+
176+
const complexNumber10 = new ComplexNumber({ re: 0.25, im: 0 });
177+
expect(complexNumber10.getPolarForm().radius).toBeCloseTo(0.25);
178+
expect(complexNumber10.getPolarForm().phase).toBeCloseTo(0);
179+
expect(complexNumber10.getPolarForm(false).phase).toBeCloseTo(0);
139180
});
140181
});

0 commit comments

Comments
 (0)
Please sign in to comment.