ユークリッドおよびユークリッド延長
ブログは、より良い、食べて:ユークリッドおよびユークリッドの拡大-核融合炉のコア-羅Guboオフ
以下では、必要性があること(それはWWWWについて)すべての事前の知識です
あなたは事前知識のすべてを学んできた場合は、
無視してください(バカ\)\空のナンセンスは、
この質問に内容を直接見
内容:
- 1.ユークリッドの定理
- 証明します
- アプリケーション
2.シュウペイ定理
- 3.拡張ユークリッド
- 証明します
- 無期限解決線形方程式
この話題に関しては4
1.ユークリッドの定理:
即: \(\大GCD(A、B)= GCD(B、\ MOD B)\)
\(B = 0 \) 、(MID \ MID \ \ GCD(A、B)=)\。
高齢者に証明CYHありがとう:
提供:\(A、B \)は、の最大公約数である\(C \)
则: \(A = NC \ \のB = MC \) 、\((N、ZにおけるM \)\) 、\(= k個の\倍B + R \)
その後: \(R&LT = A \ B =%AK KMC-NC = B =(N -キロ)C \)
作る\((A、B)=(B、\%B)を\) 、
:私たちは、証明書が必要です\(B、Rの\)が最大公約数でもあるです\(のC \) 、
即ち: \(MC = Bは、R =(N -キロ)C \) 、中- \(キロ)\ M(n)は、プライム。
子供の証明:
矛盾によって、存在設け\(D \)の\(M、(N-キロ )\) 最大公約数であり、\(D> 1 \) 。
提供:\(N-QD-キロ= \) 、\(PD M = \)
次に: \(MC = B = \\ PDC) 、
\(\ A = KB + R = kpdc + QDC = DC(KP + Q)\)
その後: \(A \)が存在する因子\(DC> C \)
この結論と\(、B \)の最大公約数\(C \)と矛盾
従って:存在しない\(D> 1 \)\(M、(N-キロメートル )\) 最大公約数であります
次に: \(M、(N -キロ)\)プライム、サブは証明しました。
子によって実証さ、与える:- \(キロ)C \ MC = Bは、R =(n)は、で\(M、(N -キロ)\)プライム。
その後:\(B \)と\(R&LT \)は、最大公約数がまだある\(C \)
QED。
アプリケーション:
上記の知識により、我々は要求書くことができます\(、B \)された\(GCDを(a、b)は \) の関数であり、
再帰によって決定されるように、ユークリッドの定理によって得ることができる\(GCD(B) \) 値
再帰的な境界は:場合(B = 0 \)\場合、\(GCD(A、B)は、\ =)を。
簡単なコードの実装:
int gcd(int a,int b)
{
if(b)
return gcd(b,a%b);
else
return a;
}
また、1行のように書くことができます。
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
2.シュウペイ定理:
セット\(B \)全てではない\(0 \)の整数、整数\(X、Y \) 、そう\(\大AX + = GCD(Aによって、B)\) 。
特に、\(GCD(A、B)= 1 \) \(\ Leftrightarrow \)
が存在する\(X、Z \でY \) 、その結果:\(= AX + \による1) 。
?定理の正しさを証明するために、どのようにそれが読むことを続けてください。
3.ユークリッドの拡張:
完全ではないため、\(0 \) 2つの数の\(A、B \) 、無限の数が存在しなければならない\(X、Y \) 、式そのよう
\(=による\大斧+ GCD(a、b)は\ )設立
証明:
セット\(> B \)
場合B = 0 $ $、\(GCD(A、B)は、\ =)を、今回唯一の解を有する:(X = 1、Y = 0 \)\。
とき(\回のB \ない\ = 0 \) 、
ユークリッドの定理:見つかったの$ GCD(a、b)は= GCD(B、%b)は$、
\(\下線{AX +によって} = GCD(A、B)= GCD(B、\%のB)= \下線{B {X 1} +(\%のB)Y1} \)
(セット\(X1、Y1の\)は、上記条件を満足する解の集合です)
而:\(FRAC \ = A- \ lfloor Bの\%{A}、{B} \ rfloor倍B \ \)
その後:元の方程式は、に変換することができます。
①。\(FRAC \ = BX1 +(A- \ lfloorによって斧+ {A}、{B} \ rfloor回\ b)のY1の\)
②。\( - 1 \によって\ lfloor \ FRAC {A}、{B} \ rfloor = BX1 + AY1によって斧+)
③。\(で斧+ = AY1 + B(X1-\ lfloor FRAC \ {A}、{B} \ rfloorのY 1)\)
③のうち、入手することができます。
\(X = Y1 \)
$ Y = X 1 \ lfloor \ FRAC {A}、{B} \ rfloor Y1 $
したがって、得ることが可能である\(= Cによって斧+を\ ) ソリューションのセット
他の整数式\(XI、YIの\)が満たされます。
$第XI = X + \ FRAC {B} {GCD(A、B)} \時間t $
$のYI = Y + \ FRAC {A} {GCD(A、B)} \時間t $
これは、(Z-中のt \ \)\
コードの実装
ソルバー書き込むには(= GCD(で斧+ \を 、B)\) プログラム
上記の証拠を通じ、それは明らかである、再帰によって達成することができます
B = 0 $場合$、場合:再帰的な境界である\(GCD(A、B)は、\ =)を:、今回唯一の解を有する(X = 1、Y = 0 \)\。
コード:
cpp int exgcd(int a,int b,int d,int &x,int &y) { if(!b) { x=1 , y=0; return a; } d=exgcd(b,a % b,x,y); int tmp=x; x=y , y=tmp-a/b*y; }
不定方程式を解きます:
:= C $によって$斧+:不定方程式の
拡張ユークリッドによると、それが見つかりました:
方程式のための\(= GCD(A、B)によってAXの+ \)有無アレイ溶液\(X、Y \) 。
その後:
1.場合、$ Cの%のGCD(a、b)は\ではない= 0 $、元の方程式が解を持ちません。
2.もし\(Cの\%のGCD(A、B)= 0 \) 。
集合\(D = GCD(A、B)は\) 、元の方程式はに変形することができます。
\(\時間(Xの\時間\ FRAC {D} {C})+ Bの\時間(Y軸\時間\ FRAC {D} {C})= D(= Cの\時間\ FRAC {D} {C} )\)
置換により、そう\(X1 =(X \タイムズ\ FRAC {C}、{D})\) 、\(Y1 =(Y \タイムズ\ FRAC {C}、{D})\) 。
方程式を解く:\(AX1のBY1 = D + \)の有無アレイソリューション\(X1、Y1 \) 、
解決しよう\(X1、Y1の\)の後に我々が得ます:
\(X = X1 \回\ FRAC {C}、{D} \)、\(Y = Y1 \回\ FRAC {C}、{D} \)
元の方程式得るために\(= Cによって斧+ \ ) ソリューション
この質問に関しては4:
(ロングったらしいはあまりついに右のそれを取得言い始めました)
3回の操作でのタイトル:
ボリュームで樽にワインを① \(\ミリリットル\ b)は、ガラスの
②の体積(A \ミリリットル\)\ワイングラスでバレルに注ぎ、
③ボリューム\(Bを\ mlの\)ワインのガラスの体積に注いだ\(A \ミリリットル\)でガラス。問題の意味の分析:
提供される残りの最後のアルコールの最小量として\(ANS \)
各加算\(B \ミリリットル\)ワイン、それぞれが注ぎ\(A \ミリリットル\)ワインあります:
$ ANS = -ax_1 + by_1(X_1、Z-でY_1 \)$この方程式はに溶液不定趣旨を有している(ANS = K \時間\ \ GCD(Zにおいて、B)\(k個の\)\) と必要\(ANS \)非最小の負の整数解が\(ANS = GCD (a、b)は\)
アルゴリズム:
拡張ユークリッドと
ソリューション不定方程式(\ \ GCD(A、B
)= ax_1 + by_1 \) のセット取得する\(X_1を\)と\(Y_1 \)ソリューション次に\(X_1 \時間(-1)\ \ A \時間(-1)\) ;
元の方程式に:
\(\ + by_1 ax_1下線{} =(-a)\タイムズ(-x_1)+ by_1 = \ {-ax +によって下線
} \) を得た:
\(X -x_1 = \)
\(Y = Y_1 \)それから
cpp while(x<0 || y<0) x+= (x<0 )?b/gcd:0, y-= (x>=0)?a/gcd:0;
\(X、Yの\)は、最小の非負整数解に変換される
回答を得ます
取り付け\(AC \)コード
#include<cstdio>
#include<ctype.h>
//====================================================
int a,b,x,y,gcd;
//====================================================
inline int read()
{
int fl=1,w=0;char ch=getchar();
while(!isdigit(ch) && ch!='-') ch=getchar();
if(ch=='-') fl=-1;
while(isdigit(ch)){w=w*10+ch-'0',ch=getchar();}
return fl*w;
}
void exgcd(int a,int b)//扩展欧几里得求线性不定方程的解
{
if(b)
{
exgcd(b,a%b);
int k=x;
x=y , y=k-a/b*y;
}
else
x=1,y=0,gcd=a;
return ;
}
//====================================================
signed main()
{
a=read(),b=read();
exgcd(a,b);
x*=-1,a*=-1;//进行转化
while(x<0 || y<0)//获得最小的非负整数解
x+= (x<0 )?b/gcd:0,
y-= (x>=0)?a/gcd:0;
printf("%d\n%d %d",gcd,x,y);
}