ごとけんです

# まだ東京にいます。

In message "[ruby-math:00339] Re: quotient, remainder, modulo"
    on 00/07/31, NAGAE Takanori <tnagae / neofield.co.jp> writes:
>ながえともうします.

ながえさんこんにちわ。

えっと、単純なのがよかろうってことで次のような定義を考えました。

  class Fixnum
    def /(other)
      a,b = self,other
      (a.to_f/b.to_f).floor
    end

    def %(other)
      a,b = self,other
      a - b*(a.quotient(b))
    end
  end

んで、これは以下のCに相当します:

>                           Ruby                   Python
>      a     b  |   a/b   a%b  a.remainder(b) |    a/b      a%b
>   ============|=============================|=================
>A    13     4  |    3     1       1          |     3        1   
>B    13    -4  |   -3    -3       1          |    -4       -3
>C   -13     4  |   -3     3      -1          |    -4        3
>D   -13    -4  |    3    -1      -1          |     3       -1

つまり、

>C の場合,-13 は 4 を法として 3 と合同ですから,3 が剰余であり,
>その結果,商は -4 となるべきです.つまり Python が正しいことに
>なります.

ってわけです。

少なくとも現状の/と%の関係は全く持って分からないという元々の
疑問には賛成です。ただしこの問題は最終的に好みくらいしか基準
が無いので、

    (a わる b) いこーる (q あまり r)

  iff

    (b かける q) いこーる (a ひく b)

をまず認め、加えて、

   「a わる b」という演算は数直線上で b の向きを正の向きとして
   a のなかに b がいくつ入るかを調べる行為

と思えば上述の定義になり、Pythonに一致します。

remainderの意義は僕には分からないのでobsoleteに一票です。
quotientも導入しないのが良いでしょう。

そうでなければ、演算子のほうをRubyをコンパイルした処理系の 
int の挙動にあわせるというのがプロトタイピング向きかも知れま
せん。数学的には解決しない問題なのでそれはそれで悪くないよう
な気もしますが、ポータビリチーも売りの一つであるスクリプト言
語という点では言語仕様に含めたほうが良いと思うので、やっぱり
[/,%]はPythonと同じに一票です。

-- gotoken