5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ClojureAdvent Calendar 2020

Day 21

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

Last updated at Posted at 2020-12-21

はじめに

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

参考

5
0
0

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
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?