乗法逆学習の概要

基本的には主に復習、深い印象として、物事の神のコピーを書いて。

定義:整数B、Mの場合は 互いに素、およびb |(割り切れるA B)、整数xが存在し、その結果、 A / B A * C≡ (MODの M) モジュロM BはXと呼ばれる 乗算方法逆要素を、と呼ばれる B -1(MODのM)

だから、どのように我々は求めてないB -1(MOD m)を

定義により、A / B * B A≡ -1  ≡A / Bのa * b *表B -1MODのM)、その後のB * B -1  ≡1(MODのM)。

ここでは2つの方法で解決することができるB -1(MODのM)

1、フェルマーの小定理。

  フェルマーの小定理:pが素数であれば、任意の整数Aのために、そこにあるのp  ≡A(MOD p)は。次いで、B P  ≡B(MOD P)B→B * P. 1-  ≡B(MOD P)B→B * P-2  ≡1(P MOD)。従って、素数pを法とするとき、BのP-2がある  B -1(MOD pが)だから我々はすぐに逆の力を見つけるために使用することができます。

 

INT qpow(INT I、int型 K、INT MOD)
{ 
    int型のRES = 1 ながら(k)は
    、{ 
        場合(K&1)のRES =(LLが)リソース* I%MOD。
        I =(LL)私%* MOD。
        K >> = 1 
    } 
    戻りRESと、
} 

int型のmain()
{ 
    int型 INVB = qpow(B、P- 2、P)。// P是质数、B的逆元就是B ^(P-2)MOD p個の
    戻り 0 ; 
}

 

 

 

2、ソリューションの合同式。

  B * B以降-1  ≡1(MODのM)、次いで溶液合同式B * X≡1(MOD mは ) 式B * X + m個*のY =解くことと等価で逆元である 、1を拡張ユークリッドに従ってリードは、限りB、m個の互いに素として、私たちは、このように逆の要素を見つけることができます。

 

ボイド exgcd(int型int型 B、INT&X、INTY)
{ 
    場合(Bの== 0){X = 1、Y = 0リターン;} 
    exgcd(B、 B、X、Y)。
    int型、Z = X; X = Y; Y = ZA / b *表Y。
} 

int型のmain()
{ 
    int型X、Y。
    exgcd(B、P、X、Y)。
    X =(X%P + P)%のP。
    リターン 0 ; 
}

 

 

 

もちろん、我々は逆の要素を見つけるために特別なメソッドを使用する必要があり、他の特別な事情があります。

1、逆1〜n個の連続番号のこのシリーズを解決します:

  既知の1 -1  ≡1(P MOD)

  P = K提供* iはR、すなわち⌊p/i⌋= K、Pの%I = R +

  次いで、iが+≡0(MOD P)は、R・K

  左右Iと乗算され-1 R&LT -1 R&LTを与えるために、* K -1 + I -1  ≡0(P MOD)

  I与える転置-1  ≡-k * R&LT -1(P MOD)を

  Kので=⌊p/i⌋、R = P%私

  利用可能な、I -1  =-⌊p/i⌋*(%P I)-1(P MOD)

  逆を確実にするためにそう、肯定的です

  I -1  =(P-⌊p/i⌋)*(P%以下のI)-1(MOD P)

  その後、我々は逆1〜nの配信を起動するには、この式を使用することができます。

 

INT メイン()
{ 
    scanf関数(" %d個の%のD "、&​​N&P)。
    INV [ 1 ] = 1 int型 I = 2 [P%以下のI]%のINV * INV [i]は=(LL)(PP / I)iが++; iが<= N)、P。
    以下のためにint型 i = 1 ; iが<= N; iは++)のprintf(" %Dを\ n " 、INV [I])。
    リターン 0 ; 
}

 

 

2の数のn個の階乗に逆元1

  {1} {\(I + 1 \右)左!}因为の$ \のdfrac回\左、\(I + 1 \右)= \ dfrac {1} {私!} $

  [i]は、私があるINV!逆元、その後* [I + 1] INV(I + 1)= INV [i]を提供

  私たちは逆の[n]は逆打ち上げ1〜Nの階乗INV場合には知ることができ、この関係を使用します。

 

INT qpow(INT I、int型 K、INT MOD)
{ 
    int型のRES = 1 ながら(k)は
    、{ 
        場合(K&1)のRES =(LLが)リソース* I%MOD。
        I =(LL)私%* MOD。
        K >> = 1 
    } 
    戻りRESと、
} 

int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N&P)。
    事実[ 0 ] = 1 ;
    以下のためのint型私は=1、I '= N; I ++)は事実[I] =(LL)事実[I- 1 ] * I%のP。
    INVI [N] = qpow(事実[n]は、P- 2 、P)。
    以下のためにint型 I = N- 1、I> = 1 ; i--)INVI [I] =(LL)INVI [I + 1 ] *(I + 1)%のP。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/BakaCirno/p/11515718.html