ユークリッドアルゴリズム(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;
}