読者です 読者をやめる 読者になる 読者になる

はわわーっ

はわわわわっ

quot と rem と div と mod

haskell

商と余りを求める関数に quot と rem や div と mod があるけど、違いがわからなかったのでまとめてみる。型は同じで

quot :: Integral a => a -> a -> a
rem  :: Integral a => a -> a -> a
div  :: Integral a => a -> a -> a
mod  :: Integral a => a -> a -> a

あと、商と余りを同時に出してくれる quotRem や divMod っていうのもある。

quotRem :: Integral a => a -> a -> (a, a)
divMod  :: Integral a => a -> a -> (a, a)

quot と rem 、 div と mod は

(x `quot` y)*y + (x `rem` y) == x
(x `div`  y)*y + (x `mod` y) == x

を満たしている。
違いは割り切れない時に0の方に切り捨てるのが quot で、負の無限大の方に切り捨てるのが div。

まず、割り切れる時には2つに違いはない。

> quotRem 4 2
(2,0)
> divMod 4 2
(2,0)
> 4 `quotRem` 2
(2,0)
> 4 `divMod` 2
(2,0)
> (-4) `quotRem` 2
(-2,0)
> (-4) `divMod` 2
(-2,0)
> 4 `quotRem` (-2)
(-2,0)
> 4 `divMod` (-2)
(-2,0)
> (-4) `quotRem` (-2)
(2,0)
> (-4) `divMod` (-2)
(2,0)

で、次に割り切れないとき

> 5 `quotRem` 2
(2,1)
> 5 `divMod` 2
(2,1)
> (-5) `quotRem` 2
(-2,-1)
> (-5) `divMod` 2
(-3,1)
> 5 `quotRem` (-2)
(-2,1)
> 5 `divMod` (-2)
(-3,-1)
> (-5) `quotRem` (-2)
(2,-1)
> (-5) `divMod` (-2)
(2,-1)

商が負になるときは結果が変わるので注意。