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