拡張ユークリッド関連テンプレートの数論

ユークリッド式を展開します。

 

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 
}

 

おすすめ

転載: www.cnblogs.com/wsy107316/p/11354809.html