nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

分数の割り算で余りを求める

分数の割り算で、余りを求める方法がわからなかったという内容です。
どうも小学校の算数の内容らしいですが、わからなかったのだから仕方がない。
あと「帯分数」というモノを初めて知りました。 習った記憶が全くない。

Common Lispでは、truncate関数を使うことによって求められます。
では計算方法はどうなるのでしょうか。

例えば「100/3 ÷ 7/3」の商と余りはいくつになるでしょう。
素直に割り算すると100/7になるので、 「14 余り 2/7」が答えになりそうですが違います。 これだと割り算の結果を、ただ整数と分数の部分に分けているだけです。 つまりはこんな感じ。

* (truncate (/ 100/3 7/3))
14 ; 2/7

正しい回答を出力してみます。

* (truncate 100/3 7/3)
14 ; 2/3

商の14までは合っていますが、余りが違います。 この余りをちゃんと求めるには、商と余りの関係を式で表す必要があります。

割り算

a ÷ b = 商...余り

のとき、書き換えると

余り = a - b×商

なので、

余り = 100/3 - (7/3)×14

計算をすると余り = 2/3となります。

この分数の余りの求め方はfloor, ceiling, truncate, round, mod, remのすべてで使っています。

当たり前と言えばそうなんですが、実装面だと割り算で分数を扱うときに 初めて上記の計算が必要になります。 分数以外の型であるfixnum, bignum, floatは別の方法で求めるので、 この計算を自分でしなくてもいいというのがなんとなく不思議な感じがします。