Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 53a0b61

Browse files
committed
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‎

Lines changed: 56 additions & 14 deletions
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‎

Lines changed: 41 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /