3

これは Remainder/Mod を扱う際に最も聞かれることのようで、私はそれで壁にぶつかっています。私は教科書と C コードのチャックを使ってプログラミングを独学しています。

「いや、いや、実際こうなるんだ」と言ってくれる先生がなかなかいないので、ここでやってみようと思いました。ただし、これの数学的部分に対する決定的な答えは見つかりませんでした。

だから...これはかなりまれな出来事であるという印象を受けていますが、光沢のあるコンパイルの下で何が起こっているのかを知りたいです. さらに、この教科書では、C89 標準に従って、負の剰余を使用する場合に可能なすべての値を提供してほしいと考えています。誰かがこの数学が正しいかどうかを確認できるかどうかを尋ねるのは大変でしょうか?

1) 9%4
9 - (2) * 4 = 1     //this is a value based on x - (x/y) * y
(2) * 4 + (1) = 9     //this is a check based on (x/y) * y + (x%y) = x

2) -9%4
9 - (2) * 4 = 1; 9 - (3) * 4 = -3   //these are the possible values
(2) * 4 + (1) = 9; (3) * 4 + (-3) = 9    //these are the checks

3) 9%-4
Same values as #2?? 

式にマイナスを入れて計算してみたところ、17 や -33 などとんでもないものが出てきました。#3 も 1 と -3 ですか??

4) -9%-4
Same as #1??

代数除算では、マイナス記号は「キャンセル」します。彼らはここでも同じことをしていますか、それとも何か他のことが起こっていますか?

私を最も混乱させるのはネガだと思います。私が学校で代数を学んだ方法 (5 ~ 6 年前) では、代数はその数に「執着」しています。プログラミングでは単項演算子なので、そうではありませんか?例: #2 の x の値を入力する場合、x = -9 ではなく x = 9 となります。

どんな助けにも心から感謝します。

4

2 に答える 2

1

バーマーのリンクされた回答のように、数学的な意味でのモジュラスは、リングの数値が同じクラスであることを意味します(私の代数理論は少しさびているので、用語が少し大まかに使用されている可能性があります:))。

したがって、モジュラス 5 は、サイズ 5 のリングがあることを意味します。つまり、0、1、2、3、4 に 1 を 4 に追加すると、ゼロに戻ります。したがって、-9、-4、1、6、11、16 はすべて同等であるため、5 を法としてすべて同じです。これは実際にはさまざまな代数定理にとって非常に重要ですが、通常のプログラマーにとってはほとんど役に立ちません。

基本的に標準は指定されていないため、負の数に対して返されるモジュラスは、それらの同等のクラスの数値でなければなりません。余りではありません。このような状況での最善の策は、基本的な整数除算が必要な場合、モジュロ演算子を実行するときに絶対値を操作することです。より高度な技術 (公開鍵暗号化など) を使用している場合は、おそらく数学をもう少し磨く必要があります。

今のところ、この場合はまだ正の int を使用して、何か興味深いプログラミングを楽しんでください。

于 2013-09-14T05:11:44.743 に答える