数論学習日記
ああ......時間がない更新番号論ロング、最近そこに見ていたが、数論Niubiポイントの多くは理解して(あるいは、あまりにも食器)していない残っている、それはまだゆっくりしてから電源を取るために、今日すぐにそれを記録、段階的に来ていますモジュラスアルゴリズムそれ。
我々は必要が同様の多数を使用するには、このタイプA ^ Bの%cの方法を、64%5 3 ^を算出4 ^ 3 16%にしたいときに高速べき乗剰余です。
まず第一に、当然のことながら、時間の速いモジュロさらに大きなポイントの電力を必要としない、我々は暴力の問題を解決することができ、そのような^ 2 2 ^ 3,3などの一部の比較的小さなデータのために、あなたは長い長い、時には特別なデータを使用することができます巨大な、私たちは、私たちが必要なものをカウントするために小さなデータにビッグデータを置くことで、我々はそれの少しは出て働きやすい知っている、いくつかの処理を行う必要があります。それでは、どのように小さなデータにビッグデータにそれを行くのですか?
基本的なコードとの最初は、このパターンを見て計算されます。
#include <iostreamの> する#include <conio.h> 長い長い FPM(長い長い、長い長い B、長い長いC) { 長い長い和= 1 。=%のC、 以下のために(int型 i = 1 ; iはB <I ++の) { 合計 =(SUM * A)%のCと、 } 戻り値の和。 } int型のmain(int型 ARGC、CONST のchar * { ARGV []) 長い 長い、B、C; std :: cinを >> A >> B >> C。 std :: COUT << FPM(A、B、C)。 _getch()。 リターン 0 ; }
このアルゴリズムは、少し大きめの数は、我々が直接、その後の乗算剰余続け、答えのサイズを小さくすることが可能であるが、bが十分な大きさで、かつ十分に大きい場合には、このアプローチは、スタックを破裂されます。
私たちは、Bのサイズを小さくしたい場合はそのため、我々はそれが奇数の場合のような64 ^ 5 ^ 32私たちは25になることができ、その後、このアイデアに沿って、我々はパリティ判断を行って、私達はちょうどする必要があり、これを最適化する必要がありますラインの抽出物は、Bが奇数であると仮定すると、我々は*(A ^ 2)^(B / 2)、最適化されたコードになることができます。
#include <iostreamの> する#include <conio.h> 長い長い FPM(長い長い、長い長い B、長い長いC) { 長い長い和= 1 。一方、(b)は、{ もし、(B&1 ){ 合計 =(SUM * A)%のC、 B - ; } B >> = 1 。=(* A)%のC、 } 戻り値の和。 } INTメイン(int型 ARGC、CONST のchar * ARGV []) { 長い 長い、B、C。 std :: cinを >> A >> B >> C。 std :: COUT << FPM(A、B、C)。 _getch()。 リターン 0 ; }
最初のサイクルに符号、パリティ判定に示すように、合計が奇数のLETであれば、一定のモジュロの結果を/ 2をB、*、次に、bが1に等しくなり、最終的に、最終的な値を得るために合計させ、合計を返します。
上記パワーモジュロシンプルかつ高速なアルゴリズムです。
-------------------------------------------------- ------------------