doctree icon indicating copy to clipboard operation
doctree copied to clipboard

Numeric に「除法と商・剰余」の節を追加

Open scivola opened this issue 5 years ago • 9 comments

除法関係のメソッド(quo, div, divmod, modulo, remainder など)の全体像を把握するのが難しいので、Numeric のページに概観を解説した節が必要と感じた。

scivola avatar Oct 21 '18 01:10 scivola

これはあるといいと思います。 3年間止まってますが、是非。

foomin10 avatar Nov 05 '22 00:11 foomin10

まとめられてて素晴らしい内容だと思うのでマージした方がいいと思います。

たぶんmrknさんのコメントに返してない点があるので、止まってるのかなと思います。 この点、自分は「(商は不要で)剰余が欲しいから剰余を求めてる」と思って単体での%をよく書きますし、わかりやすく問題ないと思っています。 逆に、「剰余を考える除法の場合、商は必ず整数になるので、とくに整商と言います。」のような本文中の記述は、何も限定せずに"必ず"といえば間違いだろうと思います。

なお、英単語の「modulo」に剰余という意味はありません。

それから、自分はこの表現に少しひっかかりました。辞書的な意味で少なくとも形容詞で「剰余の」の意味は確かめられ、modulo operationの訳が剰余演算であろうことを踏まえると、moduloは広い意味で「剰余」の意味があると思います。

(個人的に気になる点については、マージされればIssueなりPRなり別途立てようと思いますので、マージでいいのかなって思ってます)

universato avatar Nov 05 '22 13:11 universato

この点、自分は「(商は不要で)剰余が欲しいから剰余を求めてる」と思って単体での%をよく書きますし、わかりやすく問題ないと思っています。

3年前なのでコメントを入れたときの思考を覚えていません。なんとか推測すると、私がコメントを入れた部分の直前で除法について「その背景にある理論について説明します。」と書かれていることが肝なんだと思いました。理論を説明するのですから、特に剰余ではなく除法についての背景の理論を説明するのですから、「整除算の余り」という剰余の定義を無視する説明は避けた方が良いでしょう。

除法には、剰余(余り;remainder)を考えるものと考えないものの二通りがあります。

特に私がコメントを入れたこの説明では、剰余が整数となるような定義も作れそうに思えます。例えば、a を被除数で b を除数、余り r は 0 以上除数未満の整数とし、商 q は a = q * b + r を満たす実数とするような定義をいあ思いつきました。この定義に従って a = 11.45、b = 3 とすると 11.45 = 3.15 * 3 + 2 なので q = 3.15, r = 2 となります (いま咄嗟に考えた定義なので、他の例では問題があるかもしれません。r に任意性があるので使い物にはならない定義だとは思います。)。しかしその後の方の説明で

剰余を考える除法の場合、商は必ず整数になるので、

と商の範囲を天下り的に整数に限定しています。「剰余を考える」というだけでは商が整数かどうかは限定できないのに、どうして剰余を考える除法では商は必ず整数になるのでしょうか?その理由を説明するとしたら、それは「商が整数」であることが剰余より先に決まっているからではないでしょうか。だとすると、「余りを考えるかどうか」ではなく「商を整数とするかどうか」という説明をするのが良いと思うのです。

mrkn avatar Nov 05 '22 14:11 mrkn

問題の箇所について @universato さんと @mrkn さんの仰っていること,理解できたと思います。修正の方向で考えたいと思います。 (GitHub のやり方も忘れましたし,良い修正案を書く自信もありませんが)

私が「除法には…(中略)…二通りがあります。」と書いたとき,おそらく Ruby の演算だけを念頭に置いていたので,文脈とちぐはぐになっているように思います。 また,「剰余を考えるから商が整数になるのだ」という誤解も招きそうです(これは既に書いたとおり,そういう意図ではないのですが)。

modulo の語義の件は,いま英辞郎を見たら確かに形容詞(「剰余の」)も載ってました。 ただ,名詞(「剰余」)は英辞郎にも載ってませんし,やはり無いのではないでしょうか。 私がこの一文をわざわざ入れた理由は,modulo というメソッド名とその働きから remainder の同義語と勘違いする人が後を絶たないだろうと思ったことです。というか,私はこのメソッドを見て「modulo は余りっていう意味があるのか」とかつて勘違いしました。 まあ誤解してもプログラミングで困ることはたぶん無いので削除でもいいですが。

scivola avatar Nov 06 '22 13:11 scivola

コメントを書いた段階で辞書的な意味でremainderと同じ名詞として剰余の意味はないと思ってます。 ネットで辞書を引いて見て考えた結果そういうことを書きたい文なのだと思いました。

ただ、moduloとremainderを名詞として同一視してしまうだろうから書いておこうという暗黙の前提・文脈があったり、単に「剰余」と書いて「名詞としての剰余」を表しているのが不親切に思ったのです。

広い意味で「剰余」の意味があるとコメントしたのは、形容詞的な「剰余の」「~法として」も含んだ剰余の概念として書きました。

そのため、次ぐらい書かないと、言いたいことが初見で通じない人も少なくないだろうと思いました。 「なお、remainderと違いmoduloに英語として名詞の「剰余」という辞書的な意味はなく、「剰余の」「~法として」という意味です。」

universato avatar Nov 06 '22 16:11 universato

大変遅くなりましたが,ようやっと修正しました。

ご指摘いただいた箇所以外にもいろいろ手を入れたので,新たな問題が生まれているかもしれませんが,よろしくお願いします。

修正の主なポイントは以下のとおりです。

  • 「背景にある理論」という表現を避けた。
  • 「剰余を考える除法」「剰余を考えない除法」を「整除法」「普通の除法」とした。
  • 「整除法」「普通の除法」における商として「整商」「普通の商」を導入した。
  • ただし「普通の除法」「普通の商」はここだけの呼び方という形で導入した。
  • 「なお、英単語の「modulo」に剰余という意味はありません。」を削除。
  • Ruby 3.2.0 以降の分岐を設け新しい整商メソッド Integer#ceildiv について記載した。

ceildiv はサンプルコードを付け,用途例も簡単に記述しましたが,これは Integer#ceildiv のページの役割かもしれません。

Ruby 3.2 で ceildiv が導入されたことは Ruby 3.2 未満のページにも記載があったほうがよい(つまり分岐を設けないほうがよい)という考えもあったのですが,そうすると Integer#ceildiv へのリンクが張れなくなってしまい,サンプルコードの実行もできなくなってしまうので,とりあえず分岐を設けました。

scivola avatar Jan 04 '23 07:01 scivola

Some checks were not successful と出ているのですが,Failing の詳細を見ても,何をどうしてよいのか分かりません。 アドバイスをいただければと思います。

scivola avatar Jan 04 '23 08:01 scivola

CI の失敗は master を merge するか git rebase master で master に rebase するとどうでしょうか。

znz avatar Jan 10 '23 02:01 znz

master を merge したらうまくいったようです。 なるほどそういうことですか。 元が古すぎるブランチではこういうことが起こるわけですね。 ありがとうございました。

scivola avatar Jan 10 '23 03:01 scivola

これはもうほっといてもしょうがないので入れましょう。

ohai avatar Jun 08 '24 10:06 ohai