یک عدد مختلط به شکل z = a + b * i بیان میشود، که در آن:
a بخش حقیقی است (یک عدد حقیقی)،
b بخش موهومی است (آن هم یک عدد حقیقی) و
i یکهی موهومی است که در رابطهی i^2 = -1 صدق میکند.
مزدوج عدد مختلط z = a + b * i به این صورت به دست میآید:
zc = a - b * i
قدر مطلق (یا مدول) عدد z به این صورت تعریف میشود:
|z| = sqrt(a^2 + b^2)
مربع قدر مطلق برابر است با حاصلضرب z در مزدوجش zc:
|z|^2 = z * zc = a^2 + b^2
مجموع دو عدد مختلط z1 = a + b * i و z2 = c + d * i با جمع کردن بخشهای حقیقی و موهومی آنها بهطور جداگانه محاسبه میشود:
z1 + z2 = (a + b * i) + (c + d * i)
= (a + c) + (b + d) * i
تفاضل دو عدد مختلط از تفریق بخشهای متناظرشان به دست میآید:
z1 - z2 = (a + b * i) - (c + d * i)
= (a - c) + (b - d) * i
حاصلضرب دو عدد مختلط به این صورت تعریف میشود:
z1 * z2 = (a + b * i) * (c + d * i)
= (a * c - b * d) + (b * c + a * d) * i
معکوس یک عدد مختلط غیرصفر به این صورت به دست میآید:
1 / z = 1 / (a + b * i)
= a / (a^2 + b^2) - b / (a^2 + b^2) * i
تقسیم یک عدد مختلط بر عددی دیگر به این صورت است:
z1 / z2 = z1 * (1 / z2)
= (a + b * i) / (c + d * i)
= (a * c + b * d) / (c^2 + d^2) + (b * c - a * d) / (c^2 + d^2) * i
رساندن e (پایهی لگاریتم طبیعی) به توانی مختلط را میتوان با فرمول اویلر بیان کرد:
e^(a + b * i) = e^a * e^(b * i)
= e^a * (cos(b) + i * sin(b))
با توجه به اینکه نباید از پشتیبانی داخلی زبان برای اعداد مختلط استفاده کنید، این عملیات را پیادهسازی کنید:
در این تمرین باید از اشیای مبتنی بر closure استفاده کنید. میتوانید در این مقاله دربارهی این رویکرد به شیءگرایی در Lua بیشتر بخوانید.
همچنین در این تمرین باید سربارگذاری عملگر را از طریق متامتدهای metatable انجام دهید. میتوانید در Programming in Lua بیشتر دربارهی این موضوع بخوانید.