유리수

유리수

보통

지침

유리수는 두 정수 a와 b의 몫으로 정의해요. 여기서 a는 분자, b는 분모라고 하고, b != 0이에요.

Note

수학적으로 분모는 0이 될 수 없다는 점에 유의해요. 하지만 많은 유리수 구현에서는 분모가 0이 되는 것을 허용하고, 부동소수점 수의 양의 무한대나 음의 무한대와 비슷하게 동작해요. 그런 경우에도 일반적으로 분모와 분자가 동시에 0이 될 수는 없어요.

유리수 r = a/b의 절댓값 |r|은 |a|/|b|와 같아요.

두 유리수 r₁ = a₁/b₁과 r₂ = a₂/b₂의 합은 r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂)와 같아요.

두 유리수 r₁ = a₁/b₁과 r₂ = a₂/b₂의 차는 r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂)와 같아요.

두 유리수 r₁ = a₁/b₁과 r₂ = a₂/b₂의 곱(곱셈)은 r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂)와 같아요.

a₂가 0이 아니라면, 유리수 r₁ = a₁/b₁을 다른 유리수 r₂ = a₂/b₂로 나눈 값은 r₁ / r₂ = (a₁ * b₂) / (a₂ * b₁)이에요.

유리수 r = a/b의 음이 아닌 정수 n제곱은 r^n = (a^n)/(b^n)이에요.

유리수 r = a/b의 음의 정수 n제곱은 r^n = (b^m)/(a^m)이에요. 여기서 m = |n|이에요.

유리수 r = a/b의 실수(부동소수점) x제곱은 몫 (a^x)/(b^x)이고, 이는 실수예요.

실수 x의 유리수 r = a/b제곱은 x^(a/b) = root(x^a, b)예요. 여기서 root(p, q)는 p의 q제곱근이에요.

다음 연산을 구현해요:

  • 두 유리수의 덧셈, 뺄셈, 곱셈, 나눗셈,
  • 절댓값, 주어진 유리수의 정수 제곱, 주어진 유리수의 실수(부동소수점) 제곱, 실수의 유리수 제곱.

유리수 구현은 항상 기약분수로 약분되어 있어야 해요. 예를 들어, 4/4는 1/1로, 30/60은 1/2로, 12/8은 3/2로 약분되어야 해요. 유리수 r = a/b를 약분하려면, a와 b를 a와 b의 최대공약수(gcd)로 나눠요. 예를 들어, gcd(12, 8) = 4이므로 r = 12/8은 (12/4)/(8/4) = 3/2로 약분할 수 있어요. 약분된 유리수는 "표준형"이어야 해요 (분모는 항상 양의 정수여야 해요). 분모가 음의 정수인 경우에는, 분자와 분모에 모두 -1을 곱해서 표준형이 되도록 해요. 예를 들어, 3/-4는 -3/4로 약분되어야 해요.

사용하는 프로그래밍 언어에는 유리수 구현이 없다고 가정해요.

유리수를 실수로 거듭제곱하려면 수를 정수가 아닌 지수로 거듭제곱해야 하는데, WebAssembly에는 이런 기능이 기본으로 들어 있지 않아요.

하지만 x ^ y는 x ^ y = exp(y * ln(x))로도 나타낼 수 있어요.

그리고 다행히 지수 함수와 자연로그는 여러 가지 급수를 이용해 계산할 수 있어요.

지수 함수

지수 함수를 계산하는 가장 좋은 방법은 테일러 급수예요.

exp(x) ≃ 1 + x + x ^ 2 / 2! + x ^ 3 / 3! + x ^ 4 / 4! + ... + x ^ n / n!

로그 함수 (x가 양수일 때)

자연로그를 효율적으로 계산하는 방법은 여러 가지가 있어요. 그중 하나는 역쌍곡선 탄젠트를 기반으로 한 급수예요.

ln(x) / 2 ≃ y + y ^ 3 / 3 + y ^ 5 / 5 + ... + y ^ n / n where y = (x - 1) / (x + 1)

자연로그를 계산하는 또 다른 테일러 급수도 있어요.

ln(x) = (x - 1) - (x - 1) ^ 2 / 2 + (x  - 1) ^ 3 / 3 - (x - 1) ^ 4 / 4 ... + (x - 1) ^ n / n

이 급수는 x가 0과 2 사이일 때만 정확해요. 하지만 ln(x) = - ln(1 / x)를 사용할 수도 있어요.

정수 거듭제곱

정수 거듭제곱에는 성능과 정밀도 모두를 위해 곱셈과 루프 또는 재귀를 사용하는 게 좋아요. 성능을 더 높이려면 호너 방법으로 곱셈 횟수를 줄일 수 있어요.


출처

Wikipedia링크가 새 창이나 탭에서 열려요
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
WebAssembly Exercism

유리수 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 WebAssembly 트랙을 연습 문제 87개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.