はじめに
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) ÷ 3
と10 ÷ (-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 というサイトにたくさんまとまっていますので、
参照していただけたらと思います。