原です。

divmod の話は Integer#/ と独立に考えられるので、サブジェクトを
変えました。ついでに 5.divmod(-2) だと混乱しそうなので、
7.divmod(-3) で議論しましょう。

(-7).divmod(3) の方は [-3, 2] である([-2, -1] でない)という現
在の仕様は好ましいというのは、ごとけんさんの [ruby-math:00535]
における「x.divmod(a) は、x の定義されている整数全域について周
期的であった方がきれいだ」という説で、ほぼ決着がついていると思
います。

で、今度は

   7.divmod(-3)

なんですけど、これ、(-7).divmod(3) に比べると、これこそマニアッ
クな話で、こっちが絶対いい、というのはないと思うのですが、放っ
て置くわけにもいかず、これが問題になるケースがありそうな気もし
ないでもない、、、

In message [ruby-math:00544]
>正木です。
>
>In message [ruby-math:00534] Re: 5/2 == 2 or 2.5 に
>     on 11/08/2001    Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp> writes:
>
>|なるほど。でも、あえて法を負に取ることの意図が、標準形を負に取る
>|というスイッチだと考えると、必ずしも先の rule からはずれてはいな
>|いとも言えます。現在のこのケースでの仕様は悪くないと思う。しかし、
>|ますます恣意的な仕様だと言わざるを得ないですね。
>
>divmod で本質的なのは剰余の方なので、剰余に関して自然な
>a = q*b + r, 0 <= r < |b|
>を採用すべきで、現在の Ruby の仕様は好ましくないと思っています。

現在の Ruby の仕様は 7.divmod(-3) は [-3, -2] なんですけど、正
木さんは [-2, 1] であるべきという主張なんですね。これは納得いき
ます。特に 7.divmod(3) の剰余と 7.divmod(-3) の剰余が一致すると
うこと、つまり法 3 で考えることが法 -3 で考えることと同値ににな
るということが、ユーザーにちょっと安心感を与える気がします。

ただ論拠として

>a = q*b + r, 0 <= r < |b|

が自然であるからというのは、そんな気もするけど、そうでない気も
する。(^^; Euclid 環の枠組みからいうと比較すべきは、r と N(b)
ではなく、N(r) と N(b) ですから。例えば多項式なら、

   a = q*b + r,  r == 0 または deg(r) < deg(b)

なわけで、それをまねれば、整数では

   a = q*b + r, r == 0 または |r| < |b|

が「自然」ともいえる。そうするとやはり r の正負は決定できない
わけです。もちろんここで Enuclid 環ジェネリックな話を持ってく
るのが適当かどうかという問題もあるけど。


結局、今のところ、

ユーザ「余りが負とはなんたることか。全然余ってないやん。」
Ruby 「んなこと言うならそもそも負数で割るなっちゅーの。」
ユーザ「だって割りたいんだもーん。」

みたいな感じで、ほとんど気分の問題になってしまってる。(^^;
もう少し divmod(負数) をする現場でユーザーが何を求めている
のか、具体的な例で考える必要があるのではないでしょうか。


今一つ思いついたのは、a と b の最大公約数 gcd(a, b) のユーク
リッド互除法による素直な実装

   def gcd(a, b)
     until b.zero?
       a, b = b, a.divmod(b)[1]
     end
     a
   end

を考えると、現在の Ruby の仕様では gcd(7, -3) が -1 になっ
てしまってよろしくない、というはどうでしょう。gcd(-3, 7) は 1 
なのに。正木案だと両方 1 で気持ちがいい。

でも、これもまあ gcd(7, -3) と gcd(-3, 7) が共に 1 である必然
性は?と問われるとなかなか辛いのですが、私はとりあえず正木案
に一票かな。