Java モジュロ演算子%
は切り捨てられた除算に基づいています (ウィキペディア: モジュロ演算を参照)。
5%3
を生成します( を生成する2
ことに注意してください)5/3
1
5%(-3)
を生成します( を生成する2
ことに注意してください)5/(-3)
-1
(-5)%3
を生成します( を生成する-2
ことに注意してください)(-5)/3
-1
(-5)%(-3)
を生成します( を生成する-2
ことに注意してください)(-5)/(-3)
1
計算科学では、2 つの整数a
と> 0 が与えられた場合n
、モジュロに合同であるn
一意の整数を取得すると便利な場合がありr
ます。[a,n[
a
n
質問
モジュロのこの仕様を尊重する効率的なジェネリック演算子/メソッドは Java にありますか?
これは、必要なすべてのプロジェクトで書き直さないようにするためです...
その他
この問題について、stackoverflow で多くの質問を見つけましたが、それらのほとんどは、さまざまなモジュロ実装を混乱させていました。負の数に対する剰余演算の結果が気になる場合は、Java演算子に基づいた%
実装が役立つ可能性があります。
一般的なハック
負の除数はほとんど使用しないため、この実装は、 の場合にユークリッドまたはフロア化されたモジュロを返しますn > 0
。
static int mod(int a, int n){
return a<0 ? (a%n + n)%n : a%n;
}
mod( 5, 3)
生産する2
mod(-5, 3)
生産する1
ユークリッド法
static int euclideanModulo(int a, int n){
return n<0 ? euclideanModulo(a, -n) : mod(a, n);
}
euclideanModulo( 5, 3)
生産する2
euclideanModulo(-5, 3)
生産する1
euclideanModulo( 5,-3)
生産する2
euclideanModulo(-5,-3)
生産する1
フロアモジュロ
static int flooredModulo(int a, int n){
return n<0 ? -flooredModulo(-a, -n) : mod(a, n);
}
flooredModulo( 5, 3)
生産する2
flooredModulo(-5, 3)
生産する1
flooredModulo( 5,-3)
生産する-1
flooredModulo(-5,-3)
生産する-2