私は大規模な整数計算を行っており、BigInteger を別の BigInteger の累乗にする必要があります。.pow() メソッドは私が望むことを行いますが、引数として int 値を取ります。.modPow メソッドは BigInteger を引数として取りますが、計算しようとしている値に一致する答えは必要ありません。
BigInteger 指数が大きすぎて int として表すことができません。この制限を回避する方法を提案できますか?
私は大規模な整数計算を行っており、BigInteger を別の BigInteger の累乗にする必要があります。.pow() メソッドは私が望むことを行いますが、引数として int 値を取ります。.modPow メソッドは BigInteger を引数として取りますが、計算しようとしている値に一致する答えは必要ありません。
BigInteger 指数が大きすぎて int として表すことができません。この制限を回避する方法を提案できますか?
非常に大きな数の累乗を別の非常に大きな数で計算しようとしないでください。結果の数値は、膨大な量のメモリを使用します。計算a.pow(b)
すると、おおよそlog(a)*b
の桁数になります。b
が大きすぎて整数に収まらない場合a
、結果の値が非常に小さい場合でも、数十億桁になります。
達成しようとしていることと、この操作を行わずに達成する方法を再考してください。
実際の解決策は、指数を BigInteger から int に変換することです。
指数が大きすぎるためにこれができない場合、そのアルゴリズムは実装できません。結果の数値は、BigInteger として表すには大きすぎることはほぼ確実です。(BigInteger はバイト配列を使用して数値を表します。Java 配列の最大サイズは2**31 - 1
、ヒープの大きさに関係なく要素です。)また、数値を表す「BiggerInteger」クラスを実装したとしても、間もなく、マシンの物理メモリ サイズの限界に達します。(そして、計算にかかる時間N.pow(M)
は... NPトリッキーです...O((MlogN)^M)
私は思います)。
もちろん、乗数が0
、1
または-1
の場合、結果は簡単に に収まりBigInteger
ます。しかし、そのような場合、電力を計算するためのより良い方法があります:-)。