高速電力弾性アルゴリズムの導入は、多数の小数から弾性率をとる素朴なアルゴリズムの制限によって提案されています。素朴な方法では、コンピューティングリソースを非常に消費する5^1003%31などの数値を計算します。計算プロセス全体で最も厄介なことは、5^1003プロセスです。
欠点1:インデックスを計算する過程で、計算された数値がすべて増加するわけではなく、多くのコンピューティングリソース(主に時間とスペース)を占める
欠点2:計算の数値は非常に大きいため、既存のコンピューターはこのような長いデータを記録できないため、この問題を解決するためのより効率的な方法を考える必要があります。
AB%Cを計算するとき、最も便利な方法は、数学関数のPOWメソッドを呼び出すことです。ただし、bの電力に対するAの数が大きすぎる場合があり、ダブルサイジョンダブルでさえオーバーフローします。この時点で、AB%Cの結果を取得するために、Fast Power Modulusアルゴリズムを使用して、必要な結果を簡単かつ迅速に取得することを選択します。
数値があふれないようにし、複雑さを減らすためには、次の式を使用する必要があります。
abmod c =(a mod c)bmod c
この式の意味は次のとおりです。製品は、残りを製品に等しくします。この式が推移的であることがわかります。そのため、オーバーフローを防ぐために残りを絶えず取ることでますます小さくすることができます。
理論的には、この式では、コードを書くことができます。常にAをモジュロすることにより、結果がオーバーフローしないようにします。これにより、実際には、パワーの弾性率をより大きなパワーに計算できますが、この方法の複雑さはまだo(n)であり、高速ではありません。
パワーの弾性率をより迅速に計算するには、次の式にも依存する必要があります。
ab mod c =(a2)b/2 mod c、bは偶数です
ab mod c =((a2)b/2・a)mod c、bは奇数です
この式は非常に簡単です。原則は、BをAの正方形に常に置き、Bを元の半分に置き換えることです。最初の式を通して、数値のモジュールに同じ電力があることがわかっているからです(この文は少し混乱しているため、フォーミュラワンを意味します)。次に、aの代わりに*a%Cの結果を使用する効果は同じです。
したがって、上記の式によれば、複雑さo(logn)で高速電力を計算する方法を取得します。
import java.util.scanner; public class main {public static void main(string [] args){scanner in = new scanner(system.in); int a = in.nextint()、b = in.nextint()、c = in.nextint(); int res = 1; A%= C; for(; b!= 0; b /= 2){if(b%2 == 1)res =(res * a)%c; a =(a * a)%c; } system.out.println(res); }}このアルゴリズムはほぼこのようなものです。最初のステップは、A*Aが初めて実行されたときに数値がオーバーフローするのを防ぐためにA%= Cを減らすことです。 for loopでは、bが奇数の場合、res = res*aとし、最初に結果にAを掛けてから処理します。数のオーバーフローを防ぐために、res*aの結果mod cが直接操作されます。これでは、ループの場合、遅かれ早かれ、Bは1に等しく、IFブランチに入り、最後にRESの値を計算し、MOD Cはforループを終了し、次に最終結果を計算します。
要約します
上記は、Java言語の高速電力弾性アルゴリズムの実装に関するこの記事のすべての詳細な説明です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!