ユークリッド式を展開します。
typedefの長い 長いLL。 LLのexgcd(LL、LL B、LL&X、LL&Y){ 場合(== 0 && Bの== 0)リターン - 1 。 もし(Bの== 0){X = 1、Y = 0。返します。} LL D = exgcd(B、%のB、Y、X)。 Y - = A / B * X。 リターンD; }
のソリューションセットC =別ソリューション斧+:
typedefの長い ロング; LL LL X0、YO、KX、KY; BOOL LE(LL A、B LL、LL C){ // = C言語による線形方程式AXの+の溶液 LLのX1、Y1; LL GCD = exgcd(A、B 、X1、Y1)、 IF(%C GCD) リターン falseに ; // なし整数解 X0 = X1の*のC / GCD; //の解のセット YO = Y1 * C / GCD; //の解のセット KX = B / GCDは、 KY = -a / GCDは、 戻り trueに ; // 解ける、解集合は、(X0 + KX * T、 Y0 +ケンタッキー州* tの)tは整数です }
最小の正の整数x解決ソリューション:
/ * xの解決最小の正の整数解* / typedefのロング ロングLL、 ボイド minxx(int型 A、int型 B、int型 C、int型のx、int型Yの) { int型GCD = exgcd(A、B、X、Y)。 LLのX1、Y1、T; T = B / GCD; IF(T < 0 ) { T = - T; } X1 =(X + T)*(C / GCD)、 X1 =(X1の%T + T)%T; Y1 =(X1の* CA)/ B; のprintf("X ==%のLLD、Y =%LLDする\ n " 、X1、Y1); 返します; }
ボイドminxx(LLのB -1,11,11-のC、LL X、LLのY) { int型 GCD = exgcd(A、B、X、Y)。 LLのX1、Y1、T。 T = B / GCD。 もし(T < 0 ) { T - = ; T } ×1 =のX。 X1 =(C / GCDの*×1%のT + T)%T。 Y1 =(カリフォルニア* X1)/ B。 printf(" %のLLD%のLLDの\ nを" 、X1、Y1); 返します。 }
のみGCD(N)の場合かどうかは、解決可能不明xの式で(mod n)を計算ax≡b| B(すなわちBの%のGCD(A、B)== 0)、および式は、溶液、式を有します。そこ溶液番目GCD(N)。
式ax≡b(MOD n)を解くことは、式AX + NY = B(x、yは整数である)を解くことと等価です
線形合同方程式を解きます:
ブール(modular_linear_equation int型、int型 B、int型N) { int型、X、Y、X0、I。 INT D = exgcd(N、x、y)は、 もし(Bの%のd)に 戻ります 偽。 X0 = X *(B / D)%N。 // 特解 用(i = 1 ; iはDを<; iは++ ) のprintf(" %Dを\ n "、(X0 + i *が(N / D))%のN)。 返す 真; }
合同式ax≡b(mod n)を計算、GCD(N)== 1の場合、式は一つだけのソリューションを持っている場合。
この場合、B == 1の場合、合同式はAX = 1(mod n)を計算、GCD(N)= 1です。
この場合、決定されたモジュロN xはペアの乗算逆要素であることを特徴とします。
合同方程式AX = 1(mod n)を計算、GCD(N)= 1方程式AX + NY = 1、Xを解決するために解決され、yは整数です。
(LL N LL)のLL INV { LLのD、X、Y。 D = exgcd(N、x、y)は、 リターン(Dの== 1)(X%のN + N)%N: - ?1 。 }