div/mod と quot/rem

Haskell は負数の割り算をきちんとサポートしていて、剰余の符号が、割る数と割られる数のどっちに依存するかで2種類ある。

quotRem x y = (q,r) ならば x = qy + r
divMod x y  = (d,m) ならば x = dy + m

違いは、r の符号は x と同じ  (restoring method)
        m の符号は y と同じ  (non-restoring method)
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%B8%C0%B8%EC%A4%CE%C8%E6%B3%D3%3A%3A%C9%E9%BF%F4%A4%CE%BD%FC%BB%BB

今まで、divはマイナス無限大に向かって丸め、quotはゼロに向かって丸める*1という覚え方をしていたのですが、それは割る数(y)が正の場合の話ですね。

ちなみにRubyPythonの整数除算はHaskellのdiv/modと同じ挙動をするようです。

負数がらみの除算はたまに出会うので、注意しておく必要があります。

*1:ふつけるにそう書いてあったような気がする