13

Java モジュロ演算子%は切り捨てられた除算に基づいています (ウィキペディア: モジュロ演算を参照)。

  • 5%3を生成します( を生成する2ことに注意してください)5/31
  • 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[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)生産する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
4

2 に答える 2

-1

このコードはどうですか

public static int gcd(int p, int q) {
    if(count == 0) 
        System.out.print("Gcd for " + p + " and " + q);
    if (q == 0) {
           System.out.println(" returns " + p + " after " + count + " iterations");
        return p;
    }
    count++;
    return gcd(q, p % q);
}
public static void main(String[] args) {
    count = 0;
    gcd(4, 16);
    count = 0;
    gcd(4, 16);
    count = 0;
    gcd(16, 4);
    count = 0;
    gcd(15, 60);
    count = 0;
    gcd(15, 65);
    count = 0;
    gcd(1052, 52);
}
于 2013-02-08T10:07:28.170 に答える