128. Complex

בהמשך לטיפ של אתמול,

טיפוס נוסף שהתווסף בFramework 4.0 לSystem.Numerics הוא הטיפוס Complex. זהו struct המייצג מספר מרוכב. הדבר נועד לחסוך מאיתנו מימוש עבודה עם מספרים מרוכבים בעצמנו.

קיימים implicit casts מהטיפוסים הנומריים הפרימיטיביים לComplex:

1
Complex myNumber = 3;

אם אנחנו בכל זאת רוצים לאתחל מספר מרוכב שאינו ממשי, נוכל להשתמש בConstructor המתאים:

1
2
Complex myNumber = new Complex(1, 1);
Console.WriteLine(myNumber); // Prints (1, 1)

שימו לב שדרסו את ToString כך שהוא ידפיס את הקואורדינאטות של המספר.

באופן צפוי, כל האופרטורים הסטנדרטיים ממומשים:

1
2
3
Complex firstNumber = new Complex(1, 2);
Complex secondNumber = firstNumber * firstNumber;
Console.WriteLine(secondNumber); // Prints (-3, 4)

שהרי $ (1 + 2i) \cdot (1 + 2i) = 1^2 + 2 \cdot 2 \cdot i + 2^2 \cdot i^2 = 1 + 4 \cdot i - 4 = -3 + 4 \cdot i $
עוד דוגמה:

1
2
3
4
Complex firstNumber = 2;
Complex secondNumber = new Complex(1, 1);
Complex quotient = firstNumber / secondNumber;
Console.WriteLine(quotient); // (1, -1)

שהרי $ \displaystyle{\frac{2}{1 + i} = 1 - i} $

נוכל גם לאתחל מספר מרוכב באמצעות הרכבת אופרטורים:

1
2
Complex number = 1 + 2 * Complex.ImaginaryOne;
Console.WriteLine(number); // (1, 2)

שימו לב שComplex.ImaginaryOne מייצג את המספר המרוכב $ i $ (היחידה המדומה).

בנוסף, נוכל לעבור הצגה פולרית בקלות:

1
2
3
Complex number = new Complex(1, 1);
Console.WriteLine("Radius: {0}, Angle: {1}", number.Magnitude, number.Phase);
// Radius: 1.4142135623731, Angle: 0.785398163397448

גם כל הפונקציות האלמנטאריות (פונקציות טריגונומטריות ואקספוננט של מספרים מרוכבים) ממומשות לנו בתור פונקציות סטטיות של המחלקה:

למשל, חישוב צמוד של מרוכב:

1
2
Complex number = new Complex(3, 4);
Console.WriteLine(Complex.Conjugate(number)); // (3, -4)

נוכל גם לבדוק את זהות אוילר:

1
2
3
4
Complex number =
Complex.Exp(Complex.ImaginaryOne * Math.PI) + 1;
Console.WriteLine(number); // Almost 0 :)

דברים שימושיים (או סתם מגניבים) שאפשר לעשות עם זה:

המשך יום מרוכב

שתף