ながえともうします.

On Thu, 08 Jun 2000 20:12:27 +0900
matz / netlab.co.jp (Yukihiro Matsumoto) wrote:

> In message "[ruby-math:00309] Re: quotient, remainder, modulo"
>     on 00/06/08, GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp> writes:
> 
> |In message "[ruby-math:00303] quotient, remainder, modulo"
> |    on 00/06/07, Yukihiro Matsumoto <matz / netlab.co.jp> writes:
> |>すいません。どなたか私に整数の
> |>
> |>  quotient
> |>  remainder
> |>  modulo
> |>
> |>の「あるべき姿」を指南してくださいませんでしょうか?
> |
> |「あるべき姿」は無いと思います。まわりのやつに聞いたら、「そ
> |んなのは未定義」と言われました。
> 
> うーん、やっぱり。合意はなさそうってのはruby-talkから想像つ
> いてました。あとはどう決めるかですね。今月末くらいまでは待て
> ますから。

すいませんとんでもなく時期はずれな返事で.最近読み始めて気になって
しまったものですから.

Ruby は -1 を 7 で割ったあまりが 6 になりますが,これはとても
ステキな仕様だと思います.多くの言語では -1 を 7 で割ると商 (quotient)
が 0 で剰余 (residue) が -1 になりますが,これはムカツキます.
商が「-1」で,剰余が「6」になるべきなんです.
これは日曜日が 0 で土曜日が 6,-1 と 6 が 7 を法 (modulus) として
「合同 (congruent)」だと考えると納得できますよね?

# しかし残念ながら 1/7 = 0 なのに -1/7 = -1 というのは
# 多くの人の直感に反することだと思います.

それからどうでも良いことですが,modulo は前置詞扱いだったと思います.
名詞(単数)は modulus だと思います.

「a ≡ r mod m」「a is congruent to r modulo m」
「a は m を法として r と合同」と言います.そしてこのとき,
a, r, m から商 q が a = r + m * q を満たす整数として一意にもとまります.

# r = a mod m という「演算子」のような表記は 
# もともとの意味からするとおかしいような気がする….

通常「法」は 2 以上の整数です.そして m が法ならば,
「剰余の代表」は {0,.., m - 1} になり,その要素の個数は m です.

# m が負の整数だったり,「複素整数(代数的整数)」だったりすると
# さらに直感から遠ざかって行きますが,このときは法に対して「剰余の代表」を
# なんらかの方法で決めてやらないと商を一意に決めることはできません.
# ややこしくなり過ぎるのでコメントアウト,でもこの辺りが実はおもしろい.

[ruby-talk:3109] の例で説明しますと,
                           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

ここでは b が法ですが,B と D の場合は b が負なので,「通常」の意味
では「未定義」或いは「合意なし」です.

# 精神的に受け入れられやすそうな合意は二通りあります.つまり,
# -4 の「剰余の代表」を {0, 1, 2, 3} にする場合と,
# {0, -1, -2, -3} にする場合です.この点に関して Python と
# Ruby は一致して {0, -1, -2, -3} を選んでいます.
# 精神的にはかなり受け入れ難いかもしれませんが,恣意的に
# {-3, 0, 2, 7} のような剰余の代表を決めることもできます.
# なぜなら剰余の代表の要素のどの二つも 4 を法として合同ではない
# からです.

A は当たり前です.
C の場合,-13 は 4 を法として 3 と合同ですから,3 が剰余であり,
その結果,商は -4 となるべきです.つまり Python が正しいことに
なります.
--
NAGAE Takanori <tnagae / neofield.co.jp>