2011-07-20 6 views
1

私は以前、モジュラス演算子が除算の残りの部分を返したという(ナイーブな)仮定の下にいました。私は明らかに間違っていました。-2%5は3を返します。私は、5が-2で-2回を-2で除算したと考えました。負の係数演算子の結果の目的は何ですか?

この操作の仕組みについて理解していますが、私の質問はなぜですか?誰かが私に、モジュラスと残余がなぜ同義でないのかを説明する何かへのリンクを与えることができますか、それが有用な状況の例ですか?

+0

-2%5を置くとMacでなぜそれが分かるのですか?答えは-2と3ではなくですか? ありがとう – makaed

+0

これらの回答の1つを受け入れる必要があります。個人的に、私はエンボスが好きです。 –

答えて

2

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

aがabの倍数ならば、x * c = )いくつかの整数xに対して。

など。

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モッズ5合同である: ...、-12、-7、 - ...

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

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

0

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

+0

あなたは 'y%x'を記述していると思います。 –

1

あなたが得る基本的な保証は符号付きの値についてはその

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

で、符号はモジュロまたは除算演算の好ましい結果のいずれかである必要があり理由はありません。言語によってはフォームを修正するものもあれば、実装に残すものもあれば、ハードウェアが提供する方法を使用できる実装があります。ハードウェア命令は、符号付き整数のハードウェア表現を効率的に操作するために選択されている場合があります。

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

2

a = n (mod m)は、a = n + m*tと定義され、負の数にも同様に適用されます。慣例である5(すなわち、T = -1)

-

-2 = 3(5 MOD)ので-2 = 3(他はそれを見てはa = n (mod m)(a - n)mの倍数であることを意味するということです) modulo mの結果は0とm - 1の間の数値です

+0

また、 '-2 = -2 + 0'、つまり' t = 0'なので、これはどのように役立ちますか? –

+0

あなたの声明は自明なので、何も述べていません。モジュロがどのように定義されているかを述べました。 –

0

私はそれはあなたがあなたの結果は切り捨てまたは0に向けて丸めるかどうかによって異なり推測:
-2/5 = -0.4 = 5*0 + -2のに対し、両方のケースで

2/5 = 0.4 = 5*0 + 2作品、あなたは0(切り捨て)に向けて丸めている場合は、
-2/5 = -0.4 = 5*-1 + 3場合あなたは丸めている(床)。

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

又は角度を正規化する:結果は、第二の場合には(正の除数の場合)は常に正であり、配列インデックスを計算するとき、それは、例えば、有用であろうこと

注:

angle = angle % 360; //0-359

は、それは実際に私がトラブル:)

のための実用的な例を見つけることを抱えている他のケースであります

-

ああ、には素晴らしいグラフがいくつかあります。残りの部分は、常にフロア分割の除数と同じ符号を持つことに注意してください。

関連する問題