「合同数論における」研究ノート

ユークリッドアルゴリズム(GCD)

\(GCD(A、B)= GCD(B、\%のB)\)

拡張ユークリッドアルゴリズム(EXGCD)

不定方程式:$斧+による= GCD(a、b)は$

特別なソリューション

場合(B = 0 \)\時間、\(GCD(A、0)= A \)溶液を与える、よう\(X = 1、Yが= \ 0)

セット:

\ [\開始{ケース} ax_1 + by_1 = GCD(a、b)は\\ bx_2 +(\%のB)Y_2 = GCD(B、\%のB)\端{ケース} \]

因为\(GCD(A、B)= GCD(B、\%のB)\) 所以:
\ [\ {整列}開始ax_1 + by_1&= bx_2 +(\%のB)Y_2 \\&= bx_2 +( - \左\ lfloor / bの\ rfloor * B \右)Y_2 \\&= bx_2 + ay_2 - \ lfloor / bの\右\ rfloor * by_2 \\&= ay_2 + B(X_2 \左- \左\ lfloor A / B \右\ rfloor Y_2)\端{整列} \]

因此\ [ax_1 + by_1 = ay_2 + B(X_2 - \ \ lfloor A / Bを左\右\ rfloor Y_2)\]

特解:
\ [\ {ケースを}開始X_1 = Y_2 \\ Y_1 = X_2 - * \左\ lfloor rfloor \ / bの\右Y_2 \\ \端{ケース} \]

void exgcd(int a, int b, int &g, int &x, int &y){
    if(!b){
        g = a; x = 1, y = 0;
        return;
    }
    exgcd(b,a%b,g,y,x);
    y -= x*(a/b);
}

一般的な解決策を模索

提供$ K_1 = A / GCD( a、b)は、K_2 = B / GCD(a、b)は、$。\(K_1、K_2 \)必須互いに素

分割一方式の両辺に、その場で\(GCD(A、B)\) 精製し\(/ GCD(A、B)=によるAX / GCD(A、B)+。1 \) 即ち$ k_1x + k_2y = 1 $

文献溶液で明らかに他の解決策\(X、Y \)サイズに対向変化。セット\(X \)を増加させる(D_1 \)\ \、(Y \)低減\(D_2 \)を、利用可能な[K_1(X + D_1)\ - = 1 \ + K_2(D_2 Y)]

ための(+ k_2y k_1x。1 = \)\、そう[k_1d_1 = k_2d_2 \] \

(K_1、K_2)互いに素ので、そう[D_1 = K_2、D_2 = \ K_1 \]

したがって、ソリューションは、一般的な解決策を持っている\ [(X + K \ AST \左\ lfloor B / GCD(a、b)は\右\ rfloor、Y - K \ AST \左\ lfloor A / GCD(a、b)は\右\ rfloor)\]

不確かな線形方程式を解きます

探している\(= C \によって斧+ )

シュウペイ定理

\(= C \によって斧+は ) ソリューション場合に限りあり\(GCD(a、b)は | Cを\)

特別なソリューション

拡大\(C / GCD( B)\) 倍にすることができます。すなわち:
\ [\ケース開始{} X '= X * C / GCD(A、B)\\ Y' = Y * C / GCD(A、B)\ケースエンド{} \]

最小の正の整数解を求めます

ための(X \)\一般解である(K * X + B / GCD(A、B)\)\モジュラーレイドの溶液から直接最小の正の整数解\(B / GCD( b)は\) 正の値をとります。

線形合同方程式を解きます

探している\(ax≡b\(MOD \メートル )\)

$斧+と同等の私= B $、式は不定することができます。

思想

これらの2つの例は、不確実な要因がある場合ということを教えて\(K \) 式と合同で相互に変換することができます

フェルマーの小定理

とき\(P \)正の整数の素数とき\(A \)を持っています

\ [^ {P-1} \当量1 \ PMOD P \]

オイラーの定理

オイラーの定理フェルマーの小定理\(\ P)の場合は素数ではありません。

\ [^ {\ varphi(P)} \当量1 \ PMOD P、A \ PERP P \]

逆数

もし二つの整数\(B \)を満足\(AB&\当量。1 \ PMOD P \)と呼ばれる、\(B \)である\(A \)型で\(P \)の意味での逆数(およびその逆)。

逆数を直接使用することができる(exgcd \)\合同式、またはオイラーの定理の使用を解決します。

リニア再発反転元:

セット\(P = K \ R&LT AST I + \)がある\ [K * I + R&LT≡0 \ PMOD P \] 呼ばれる\(^ { - 1} \) または\(INV()\)

同時に両側を乗算\(I ^ { - 1} * R ^ { - 1} \) 使用可能
\ [\ {整列} Kを開始 iは* I ^ { - 1} * R ^ { - 1} + R * I ^ { - 1} * R ^ { - 1}≡0 \ PMOD P \\ K * R ^ { - 1} + I ^ { - 1}≡0 \ PMOD P \\ I ^ { - 1}≡ - \左\ lfloor \ dfrac {P } {I}は\右\ rfloor *(P \%I)^ { - 1} \ PMOD P \\ \端{整列} \]

拡張中国の剰余定理(EXCRT)

合同式を求めます:

\ [\ {\ X≡A_1 \ PMOD {行列}開始{M_1} \\ X≡A_2 \ PMOD {M_2} \\ \ cdots \\ X≡A_R \ PMOD {M_R} \\ \端{行列} \左\右。\]

ここにいない中国の剰余定理、それを完全に含まれているの拡張機能として、中国剰余定理。

最後のソリューションを使用して方程式を解くために1、各時間によって私たちの1。当社は、取得の前にあることを前提としている\(I-1 \)の方程式の解\(ANSを\) セット\(M = \のProd \ limits_ {J ^ = {I}。1. 1-M_j} \) 明らかに\(M AST ANS + K \ \) を満たす前に\(I-1 \)式。我々はそれを満たして最初にしたい\(I \)の方程式、同等に

\ [ANS + K \ AST M \当量a_iを\ PMOD {M_I} \]

私たちは、\(exgcd \)取得するために\(K \)のアップデートに、\(M \)\(ANS \)することができます。この合同方程式が解をもたない場合は、何の解決策は、問題の代表ではありません。

複雑\(O(N \ログメートル)\)

inline int EXCRT(){
    int ans=a[1],M=m[1],g,x,y,c;
    for(int i = 2; i <= n; ++i){
        c = (a[i]-ans%m[i]+m[i])%m[i];
        exgcd(M,m[i],g,x,y);
        if(c%g != 0) return -1;
        x = qmul(x,c/g,m[i]);
        ans += x*M;
        M *= m[i]/g;
        ans = (ans+M)%M;
    }
    return ans;
}

おすすめ

転載: www.cnblogs.com/qixingzhi/p/11817434.html