복소수는 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
0이 아닌 복소수의 역수는 다음과 같아요:
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))
복소수에 대한 내장 지원을 사용하지 않아야 하므로, 다음 연산을 구현해야 해요:
이 연습 문제는 객체 지향 방식으로 풀어요. ComplexNumbers를 클래스로 구현해요.
테스트에서는 두 복소수 인스턴스가 서로 같은지 비교해요. 그러려면 클래스에서 __eq 메타메서드를 구현해야 해요.
테스트는 복소수에 대한 산술 연산도 하기 때문에, 구현해야 할 산술 메타메서드도 있어요.
복소수 함수 중 일부는 부동소수점 수로 계산해요. 여러분이 만드는 "같음" 비교는 숫자가 거의 같을 때도 처리해야 해요.
Exercism에 가입하고 MoonScript 트랙을 연습 문제 126개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.