LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

Clojureの剰余を求める関数、remとmodの違い

はじめに

FizzBuzzの実装のため、色々とリファレンスや技術記事を調べ、読み込んでいったのですが、
剰余を求める関数が『rem』『mod』と複数存在していることを知り、その違いについて戸惑ってしまいました。

今回は、これら2つの関数の違いについて調べたことを書きます。

remとmodの違いとは

結論から先に述べます。

remとmodでは、剰余の正負の符号決定のされ方が異なっており、
remでは被除数、modでは除数と同じ符号となるように剰余が計算されます。

そもそも負の数が割り算にでてくるってどういうこと?

"そもそも負の数を割る、負の数で割るってなんなんだ!" という方は、
下記サイトが参考になりましたので、ぜひ御覧ください。
私も数学に明るくないため、今回FizzBuzzを実装するまで知りませんでした。

負の数の割り算と余り ~整数と余りの問題【数学まるかじり】

remとmodで、挙動が同じ(ように見える)とき

"なんか適当に、かんたんな割り算の式を頭に思い浮かべてみてよ!"と言われたら、
皆さんはどんなものを想像しますか?

私なら、30 ÷ 3 = 10とか、
あるいは剰余の話をさきほど行ったので、30 ÷ 4 = 7 余り2
のようなものを想像します。

このような正の数 ÷ 正の数の場合、remとmodでは挙動に違いが見えません。

user=> (rem 30 4) ;; 被除数である30に依存し、剰余の符号は正となる
2
user=> (mod 30 4) ;; 除数である4に依存し、剰余の符号は正となる
2

remとmodで、異なる結果となるとき

remとmodの挙動の違いが見えてくるのは、
被除数(割られる数)や除数(割る数)に負の数が入るときです。

rem, modは同じ剰余を求める関数ではあるものの、
前述のように、remでは被除数、modでは除数との符号と一致するように、それぞれ剰余が決定されます。

そのため、正の数÷負の数負の数÷正の数のケースでは、remとmodはそれぞれ異なる結果を示すこととなります。

下記に具体的な例として、
(-10) ÷ 310 ÷ (-3)のremとmodでの挙動の違いについて示します。

user=> (rem -10 3) ;; 剰余の符号は被除数である-10に依存し、負となる
-1
user=> (mod -10 3) ;; 剰余の符号は除数である3に依存し、正となる
2
user=> (rem 10 -3) ;; 剰余の符号は被除数である10に依存し、正となる
1
user=> (mod 10 -3) ;; 剰余の符号は除数である-3に依存し、負となる
-2

その他の様々な具体例は、#参考に示した ClojureDocs というサイトにたくさんまとまっていますので、
参照していただけたらと思います。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0