2

私は以前、剰余演算子が除算の余りを返すという(素朴な)仮定の下にありました。-2%5は3を返すので、私は明らかに間違っていました。5は-2を0回除算し、余りは-2だと思っていたでしょう。

これで、この操作がどのように実行されるかのメカニズムが理解できましたが、私の質問はなぜですか?モジュラスと剰余が同義ではない理由を説明する何かへのリンク、またはそれが役立つ状況の例を誰かに教えてもらえますか?

4

5 に答える 5

3

a = n (mod m) として定義されa = n + m*t 、負の数にも同様に適用されます。(別の見方としては、 が の倍数であることをa = n (mod m)意味します)(a - n)m

-2 = 3 (mod 5) -2 = 3 - 5 (つまり、t = -1)

慣例では、a の結果はmodulo m 0 から m - 1 (両端を含む) の数値になります。

于 2011-07-20T01:16:04.083 に答える
3

結果は完全に正しいです。モジュラー算術は次のように定義します (3 行で等号を入力できないため、"congruent" を使用します)

合同 b mod c iff ab は c の倍数、つまり、ある整数 x に対して x * c = (ab) です。

例えば

0 congruent 0 mod 5 (0 * 5 = 0-0)
1 congruent 1 mod 5 (0 * 5 = 1-1)
2 congruent 2 mod 5 (0 * 5 = 2-2)
3 congruent 3 mod 5 (0 * 5 = 3-3)
4 congruent 4 mod 5 (0 * 5 = 4-4)
5 congruent 0 mod 5 (1 * 5 = 5-0)
6 congruent 1 mod 5 (1 * 5 = 6-1)
...

同じことを負の整数に拡張できます。

-1 congruent 4 mod 5 (-1 * 5 = -1-4)
-2 congruent 3 mod 5 (-1 * 5 = -2-3)
-3 congruent 2 mod 5 (-1 * 5 = -3-2)
-4 congruent 1 mod 5 (-1 * 5 = -4-1)
-5 congruent 5 mod 5 (-1 * 5 = -5-0)
-6 congruent 4 mod 5 (-2 * 5 = -6-4)
-7 congruent 3 mod 5 (-2 * 5 = -7-3)
...

ご覧のとおり、多くの整数は合同 3 mod 5 です: ..., -12, -7, -2, 3, 8, 13, ...

数学では、これらの数の集合を同値関係「合同」によって導かれる同値類と呼びます。剰余の理解と「mod」関数の定義は、この等価クラスに基づいています。「剰余」または mod 計算の結果は、等価クラスの代表的な要素です。宣言により、負でない最小の要素を選択しました (つまり、-2 は有効な候補ではありません)。

したがって、-2 mod 5 = x を読み取ると、合同の定義と一致して、「y * 5 = -2 - x の整数 y が存在するように、負でない最小の x を見つける」と解釈されます。y の他の値を試すだけでわかるように、解は y=1 と x = 3 です。

于 2011-07-20T01:45:13.150 に答える
1

あなたが得る基本的な保証は、

(a % b) + b * (a / b)  == a

符号付きの値の場合、剰余演算または除算演算の結果として符号が優先される理由はありません。1 つの形式を修正する言語もあれば、ハードウェアがたまたま提供する方法を実装が使用できるように実装に任せる言語もあります。次に、ハードウェア命令は、符号付き整数のハードウェア表現を効率的に操作するために選択された可能性があります。

一般に、符号付き整数を除算、剰余、およびビット シフト操作と一緒に使用する場合は、十分に注意してください。

于 2011-07-20T01:15:43.310 に答える
0

モジュロは、x ペグの円の周りに長さ y (y % x に関して) の線をラップする演算子と考えてください。x に完全に回り込まない線の残りの長さは結果です。

于 2011-07-20T01:15:32.030 に答える
0

結果を切り捨てるか、0 に向かって丸めるかによって異なると思います。

2 / 5 = 0.4 = 5*0 + 2どちらの場合でも機能し
-2 / 5 = -0.4 = 5*0 + -2ますが、0 に向かって丸めている場合 (切り捨て)、切り捨て
-2 / 5 = -0.4 = 5*-1 + 3ている場合 (床)。

2 番目のケースでは、結果は常に正 (正の除数の場合) であり、配列インデックスを計算する場合などに役立つことに注意してください。

hashmapBuckets[getIntHash(obj) % hashmapBuckets.size].add(obj)

または角度の正規化:

angle = angle % 360; //0-359

実際、実際の例を見つけるのに苦労している他のケースです:)

--

ああ、モジュロ演算に関するウィキペディアのページには、いくつかの素晴らしいグラフがあります。剰余は常に床除算の除数と同じ符号を持つことに注意してください。

于 2011-07-20T02:10:09.697 に答える