効率的なべき乗演算
参考:データ構造とアルゴリズムの分析-Java言語の説明
(米)Mark Allen Weiss
整数のべき乗XNを計算する の一般的なアルゴリズムはN-1を用いる 二乗自乗しかし、より良いアルゴリズムを見つけることができます.Nが偶数の場合、XN=XN/2*XN/2 , Nが奇数の場合、XN=X(N−1)/2*X(N−1)/2*Xがある.
このアルゴリズムがなぜより効率的なのかを説明するために、例を挙げます.例えばX 62の計算 ,最初の一般的なアルゴリズムで61回の自乗をします.2番目のアルゴリズムでは9回の乗算を行います.
X3=(X2)X , X7=(X3)2X , X15=(X7)2X , X31=(X15)2X , X62=(X31)2
X 3を求めるから X7 X15 X31 それぞれ2回ずつ乗算して、最後にX 62を求めてまた1回乗算して、全部で9回です.
コードは次のとおりです.
べき乗演算で得られる数は大きいかもしれません.任意の大きな整数を処理するためにjavaのBigIntegerクラスを使用することができます.上記のコードを変更します.
~完~
(米)Mark Allen Weiss
整数のべき乗XNを計算する の一般的なアルゴリズムはN-1を用いる 二乗自乗しかし、より良いアルゴリズムを見つけることができます.Nが偶数の場合、XN=XN/2*XN/2 , Nが奇数の場合、XN=X(N−1)/2*X(N−1)/2*Xがある.
このアルゴリズムがなぜより効率的なのかを説明するために、例を挙げます.例えばX 62の計算 ,最初の一般的なアルゴリズムで61回の自乗をします.2番目のアルゴリズムでは9回の乗算を行います.
X3=(X2)X , X7=(X3)2X , X15=(X7)2X , X31=(X15)2X , X62=(X31)2
X 3を求めるから X7 X15 X31 それぞれ2回ずつ乗算して、最後にX 62を求めてまた1回乗算して、全部で9回です.
コードは次のとおりです.
public long pow(long x,int n){
if(n==0)
return 1;
else{
// n
if(n%2==0)
return pow(x*x, n/2);
else
return pow(x*x, (n-1)/2)*x;
}
}
べき乗演算で得られる数は大きいかもしれません.任意の大きな整数を処理するためにjavaのBigIntegerクラスを使用することができます.上記のコードを変更します.
public BigInteger pow2(BigInteger x,int n){
if(n==0)
return BigInteger.valueOf(1);
else {
if(n%2==0)
return pow2(x.multiply(x), n/2);
else
return pow2(x.multiply(x), (n-1)/2).multiply(x);
}
}
~完~