有理数

有理数

中級

説明

有理数は、2つの整数aとbの商として定義されます。aとbはそれぞれ分子と分母と呼ばれ、b != 0です。

Note

数学的には、分母を0にすることはできません。 ただし、有理数の実装によっては、浮動小数点数の正の無限大や負の無限大に似た振る舞いで、分母に0を許しているものもあります。 そのような場合でも、通常は分母と分子の両方を同時に0にすることはできません。

有理数r = a/bの絶対値|r|は、|a|/|b|に等しくなります。

2つの有理数r₁ = a₁/b₁とr₂ = a₂/b₂の和は、r₁ + r₂ = a₁/b₁ + a₂/b₂ = (a₁ * b₂ + a₂ * b₁) / (b₁ * b₂)です。

2つの有理数r₁ = a₁/b₁とr₂ = a₂/b₂の差は、r₁ - r₂ = a₁/b₁ - a₂/b₂ = (a₁ * b₂ - a₂ * b₁) / (b₁ * b₂)です。

2つの有理数r₁ = a₁/b₁とr₂ = a₂/b₂の積(掛け算)は、r₁ * r₂ = (a₁ * a₂) / (b₁ * b₂)です。

有理数r₁ = a₁/b₁を別の有理数r₂ = a₂/b₂で割った結果は、a₂が0でない場合、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乗根です。

次の演算を実装してください。

  • 2つの有理数の加算、減算、掛け算、割り算
  • 絶対値、与えられた有理数を整数で累乗すること、与えられた有理数を実数(浮動小数点数)で累乗すること、実数を有理数で累乗すること

有理数の実装は、常に約分して最も簡単な形にしてください。 たとえば、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に約分されます。

使っているプログラミング言語には、有理数の実装がないものとします。

ワード

numeratorとdenominatorのスロットを持つratタプルを定義してください。 <rat>は、引数を約分して、符号を分子に付けます(そのため、分母は常に正になります)。

  • <rat> ( numerator denominator -- rat )は、約分された有理数を作ります。
  • >rat ( pair -- rat )は、{ numerator denominator }からratを作ります。
  • rat>pair ( rat -- pair )は、{ numerator denominator }を返します。
  • r+ ( a b -- c )、r- ( a b -- c )、r* ( a b -- c )、r/ ( a b -- c )は、2つの有理数に対する四則演算を行います。
  • r-abs ( a -- |a| )は、絶対値を返します。
  • r^ ( a n -- a^n )は、有理数を整数乗します(負の指数も使えます)。
  • real^r ( x a -- y )は、実数を有理数乗して、小数を返します。

FactorのMATH:ジェネリック(+、-、*、/)は、組み込みの数値階層に対してしかディスパッチできないため、この演習では、それらのジェネリックにメソッドを定義するのではなく、専用のワード名を使います。


出典

Wikipediaリンクは新しいウィンドウまたはタブで開きます
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Factor Exercism

有理数を始める準備はできましたか?

Exercismに登録すれば、47個のコンセプト163個の演習、そして本物の人間によるメンタリングとともに、Factorを学んでマスターできます。すべて無料です。