JavaScript'te Karmaşık Sayılar
giriiş
Son zamanlarda Mandelbrot Seti ile oynuyorum, bu da karmaşık sayılarla nasıl aritmetik yapacağıma dair hafızamı silmem gerektiği anlamına geliyordu. Bunları kullanarak güzel bir JavaScript sınıfı yardım yağı oluşturdum. İşte şimdi işe yarıyor (oldukça kuru bir açıklama, ama umarım faydalıdır).
Hızlı Tazeleme
İki sayıyı birbiriyle çarptığımızda, çarptığımız sayıların aşağıdaki gibi olmasına bağlı olarak sonuç tek veya çift olacaktır:
-1 * 1 = -1
1 * -1 = -1
1 * 1 = 1
-1 * -1 = 1
i ≔ √(-1)
∴ i² = -1
Karmaşık bir sayı, gerçek kısmı ve hayali kısmı olan bir sayıdır . Şeklinde yazılırlar a + bi.
0i = 0Sayı doğruları 'de buluştuğundan , 0bu sayıları bir grafik üzerinde çizebiliriz, tipik olarak x ekseni gerçek sayı doğrusudur ve y ekseni hayali olandır.
Bazı örnekler
Aritmetik
Karmaşık sayıların vektörlere çok benzediğini fark etmişsinizdir ve dikkatli olunuz i * i = -1. Tüm işlemler, bu uyarıya göre ayarlanan yalnızca normal vektör işlemleridir.
kod
Sınıf Complexyapıcısının iki parametresi vardır.
realimaginary
export class Complex {
constructor(real, imaginary) {
this.real = real;
this.imaginary = imaginary;
}
}
/***
* Generate a new <code>Complex(0,0)</code>
* @returns {Complex}
*/
static zero = () => new Complex(0, 0);
/***
* Returns a string in the form <code>a ± bi</code>.
* @returns {string}
*/
toString() {
const operator = this.imaginary < 0 ? '-' : '+';
return `${this.real} ${operator} ${Math.abs(this.imaginary)}i`;
}
/***
* Both <i>real</i> and <i>imaginary</i> parts are equal.
* @param other
* @returns {boolean}
*/
equals(other) {
return this.real === other.real && this.imaginary === other.imaginary;
}
add(other) {
return new Complex(
this.real + other.real,
this.imaginary + other.imaginary
);
}
subtract(other) {
return new Complex(
this.real — other.real,
this.imaginary — other.imaginary
);
}
/***
* Multiple this Complex with another.<br/>
* <code>(a + bi)(c + di) = (ac - bd) + (ad + bc)i</code>
* @param other
* @returns {Complex}
*/
multiply(other) {
return new Complex(
this.real * other.real - this.imaginary * other.imaginary,
this.real * other.imaginary + this.imaginary * other.real
);
}
/***
* <code>(a + bi) / (c + di) = [(ac + bd) / (c^2 + d^2)] + [(bc - ad) / (c^2 + d^2)]i<code>
* @param other
*/
divide(other) {
const otherMagnitudeSquared =
other.real * other.real + other.imaginary * other.imaginary;
const r =
(this.real * other.real + this.imaginary * other.imaginary) /
otherMagnitudeSquared;
const i =
(this.imaginary * other.real - this.real * other.imaginary) /
otherMagnitudeSquared;
return new Complex(r, i);
}
Uygulama Sınıfı
export class Complex {
constructor(real, imaginary) {
this.real = real;
this.imaginary = imaginary;
}
/***
* Generate a new <code>Complex(0,0)</code>
* @returns {Complex}
*/
static zero = () => new Complex(0, 0);
add(other) {
return new Complex(
this.real + other.real,
this.imaginary + other.imaginary
);
}
subtract(other) {
return new Complex(
this.real - other.real,
this.imaginary - other.imaginary
);
}
/***
* Multiple this Complex with another.<br/>
* <code>(a + bi)(c + di) = (ac - bd) + (ad + bc)i</code>
* @param other
* @returns {Complex}
*/
multiply(other) {
return new Complex(
this.real * other.real - this.imaginary * other.imaginary,
this.real * other.imaginary + this.imaginary * other.real
);
}
/***
* <code>(a + bi) / (c + di) = [(ac + bd) / (c^2 + d^2)] + [(bc - ad) / (c^2 + d^2)]i<code>
* @param other
*/
divide(other) {
const otherMagnitudeSquared =
other.real * other.real + other.imaginary * other.imaginary;
const r =
(this.real * other.real + this.imaginary * other.imaginary) /
otherMagnitudeSquared;
const i =
(this.imaginary * other.real - this.real * other.imaginary) /
otherMagnitudeSquared;
return new Complex(r, i);
}
magnitude() {
return Math.sqrt(
this.real * this.real + this.imaginary * this.imaginary
);
}
/***
* Returns a string in the form <code>a ± bi</code>.
* @returns {string}
*/
toString() {
const operator = this.imaginary < 0 ? '-' : '+';
return `${this.real} ${operator} ${Math.abs(this.imaginary)}i`;
}
/***
* Both <i>real</i> and <i>imaginary</i> parts are equal.
* @param other
* @returns {boolean}
*/
equals(other) {
return this.real === other.real && this.imaginary === other.imaginary;
}
}
Vitest burada kullanılır.
import { describe, it, expect } from 'vitest';
import { Complex } from './Complex.js';
describe('Calling zero()', () => {
const zero = Complex.zero();
it('should return 0 real part', () => {
expect(zero.real).toBe(0);
});
it('should return 0 imaginary part', () => {
expect(zero.imaginary).toBe(0);
});
});
describe('Creating a new number', () => {
const expectedReal = Math.random();
const expectedImaginary = Math.random();
const actual = new Complex(expectedReal, expectedImaginary);
it(`should return the expected real part (${expectedReal})`, () => {
expect(actual.real).toBe(expectedReal);
});
it(`should return the expected imaginary part (${expectedImaginary})`, () => {
expect(actual.imaginary).toBe(expectedImaginary);
});
});
it('Should correctly calculate the magnitude', () => {
const dummyReal = Math.random();
const dummyImaginary = Math.random();
const expected = Math.sqrt(
dummyReal * dummyReal + dummyImaginary * dummyImaginary
);
const actual = new Complex(dummyReal, dummyImaginary).magnitude();
console.dir({ dummyReal, dummyImaginary, actual, expected });
expect(actual).toBe(expected);
});
describe('Equality', () => {
it('should return true when equal', () => {
const complex1 = new Complex(Math.random(), Math.random());
const complex2 = new Complex(complex1.real, complex1.imaginary);
const actual = complex1.equals(complex2);
expect(actual).toBe(true);
});
it('should return false when real part differs', () => {
const complex1 = new Complex(Math.random(), Math.random());
const complex2 = new Complex(complex1.real + 1, complex1.imaginary);
const actual = complex1.equals(complex2);
expect(actual).toBe(false);
});
it('should return true when equal', () => {
const complex1 = new Complex(Math.random(), Math.random());
const complex2 = new Complex(complex1.real, complex1.imaginary + 1);
const actual = complex1.equals(complex2);
expect(actual).toBe(false);
});
});
describe('Arithmetic', () => {
const complex1 = new Complex(6, 3);
const complex2 = new Complex(7, -5);
describe('Add', () => {
const expectedReal = complex1.real + complex2.real;
const expectedImaginary = complex1.imaginary + complex2.imaginary;
const actual = complex1.add(complex2);
it(`Real part should be ${expectedReal}`, () => {
expect(actual.real).toBe(expectedReal);
});
it(`Imaginary part should be ${expectedImaginary}`, () => {
expect(actual.imaginary).toBe(expectedImaginary);
});
});
describe('Subtract', () => {
const expectedReal = complex1.real - complex2.real;
const expectedImaginary = complex1.imaginary - complex2.imaginary;
const actual = complex1.subtract(complex2);
it(`Real part should be ${expectedReal}`, () => {
expect(actual.real).toBe(expectedReal);
});
it(`Imaginary part should be ${expectedImaginary}`, () => {
expect(actual.imaginary).toBe(expectedImaginary);
});
});
describe('Multiply', () => {
const expectedReal = complex1.real + complex2.real;
const expectedImaginary = complex1.imaginary + complex2.imaginary;
const actual = complex1.add(complex2);
it(`Real part should be ${expectedReal}`, () => {
expect(actual.real).toBe(expectedReal);
});
it(`Imaginary part should be ${expectedImaginary}`, () => {
expect(actual.imaginary).toBe(expectedImaginary);
});
});
describe('Divide', () => {
const expectedReal = 27 / 74;
const expectedImaginary = 51 / 74;
const actual = complex1.divide(complex2);
it(`should have correct real`, () => {
expect(actual.real).toBe(expectedReal);
});
it(`should have correct imaginary`, () => {
expect(actual.imaginary).toBe(expectedImaginary);
});
});
});
describe('toString()', () => {
it('for positive imaginary part', () => {
const dummyReal = 1;
const dummyImaginary = 1;
const expected = `${dummyReal} + ${dummyImaginary}i`;
const actual = new Complex(dummyReal, dummyImaginary).toString();
expect(actual).toBe(expected);
});
it('for zero imaginary part', () => {
const dummyReal = 1;
const dummyImaginary = 0;
const expected = `${dummyReal} + ${dummyImaginary}i`;
const actual = new Complex(dummyReal, dummyImaginary).toString();
expect(actual).toBe(expected);
});
it('for negative imaginary part', () => {
const dummyReal = 1;
const dummyImaginary = -1;
const expected = `${dummyReal} - ${Math.abs(dummyImaginary)}i`;
const actual = new Complex(dummyReal, dummyImaginary).toString();
expect(actual).toBe(expected);
});
});
İtiraf etmeliyim ki, bu türevleri yeniden keşfetmek oldukça eğlenceliydi, uzun zamandır vektör matematiği yapmadım.
Bu tam olarak heyecan verici bir makale değildi, çok kuru ama Mandelbrot veya Julia setleriyle veya karmaşık sayılar gerektiren herhangi bir şeyle oynamak istiyorsanız fonksiyonlar önemlidir.
Okuduğunuz için teşekkürler.

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































