学習日記数5 - クイックパワー剰余

数論学習日記

 

ああ......時間がない更新番号論ロング、最近そこに見ていたが、数論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に等しくなり、最終的に、最終的な値を得るために合計させ、合計を返します。

 

上記パワーモジュロシンプルかつ高速なアルゴリズムです。

-------------------------------------------------- ------------------

おすすめ

転載: www.cnblogs.com/xiangqi/p/11302947.html