概述
最近学了学扩展欧几里得,总结一下
欧几里得算法
欧几里得算法主要用来求a,b的最大公约数,又称为gcd
代码
int Gcd(int a,int b)
{
if(b==0) return a;
else return Gcd(b,a%b);
}
就是用递归来求解,当 b==0 b == 0 时退出,证明也非常易懂
证明
就是证明
gcd(a,b)=gcd(b,a
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
mod
m
o
d
b)
b
)
设
d=gcd(a,b),即d|a,d|b
d
=
g
c
d
(
a
,
b
)
,
即
d
|
a
,
d
|
b
∵
∵
mod
m
o
d
b=a−b∗⌊a/b⌋),d|a,d|b
b
=
a
−
b
∗
⌊
a
/
b
⌋
)
,
d
|
a
,
d
|
b
∴d|(a−b∗⌊a/b⌋)
∴
d
|
(
a
−
b
∗
⌊
a
/
b
⌋
)
又∵d|b
又
∵
d
|
b
∴d|gcd(b,
∴
d
|
g
c
d
(
b
,
a
a
b)
b
)
应用
应用就是求 a,b a , b 的最大公约数。
扩展欧几里得算法
扩展欧几里得算法就是求一组 (x,y) ( x , y ) 使得 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) ,又称为 ex e x _ gcd. g c d .
代码
我们就是在求
gcd
g
c
d
的过程中对
x,y
x
,
y
进行计算。
当
b=0
b
=
0
时我们会发现
x=1,y=0
x
=
1
,
y
=
0
时,满足gcd的计算
然后我们再倒着推回去,证明下面;
int Ex_Gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ans=Ex_Gcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-(a/b)*y;
return ans;
}
证明
我们就是来证明递归的时侯
x,y
x
,
y
的计算式
首先我们设
ax+by=gcd(a,b)
a
x
+
b
y
=
g
c
d
(
a
,
b
)
又因为
gcd(a,b)=gcd(b,a
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
mod
m
o
d
b)=ax+by
b
)
=
a
x
+
b
y
把
gcd(b,a
g
c
d
(
b
,
a
mod
m
o
d
b
)
)
代入得
mod
m
o
d
b)
b
)
去括号得
ay1+b(x1−y1∗⌊a/b⌋)=gcd(a,b)
a
y
1
+
b
(
x
1
−
y
1
∗
⌊
a
/
b
⌋
)
=
g
c
d
(
a
,
b
)
证完了
通解
我们使用扩展欧几里得算法求出来的解
x,y
x
,
y
只是
ax+by=gcd(a,b)
a
x
+
b
y
=
g
c
d
(
a
,
b
)
其中的一组可行解,有时候题目会要求我们求出一些有限制的解这时候我们就要根据这一组解来求出满足限制的解
通解:
我们设
x,y
x
,
y
是方程的解
x1=x+t∗lcm(a,b)a,t∈Z
x
1
=
x
+
t
∗
l
c
m
(
a
,
b
)
a
,
t
∈
Z
y1=y−t∗lcm(a,b)b,t∈Z
y
1
=
y
−
t
∗
l
c
m
(
a
,
b
)
b
,
t
∈
Z
lcm(a,b)
l
c
m
(
a
,
b
)
表示
a,b
a
,
b
的最小公倍数
lcm(a,b)=abgcd(a,b)
l
c
m
(
a
,
b
)
=
a
b
g
c
d
(
a
,
b
)
应用
求解不定方程 ax+by=c a x + b y = c
这个看着和上面那一个差不多一样,我们先设 d=gcd(a,b) d = g c d ( a , b )
我们把方程两遍同时 /gcd(a,b) / g c d ( a , b ) 就可以得到
a1x+b1y=c1 a 1 x + b 1 y = c 1
这时候我们发现因为 x,y x , y 都是整数,所以方程有解得条件是 d|c d | c
然后再同时 /c1 / c 1 得到
a1xc1+b1yc1=1 a 1 x c 1 + b 1 y c 1 = 1
我们用Ex_gcd求出一组解再乘回去就可以了.求解逆元
我们用 inv(x) i n v ( x ) 来表示x在 mod m o d p p 下的逆元
扩展欧几里得还可以用来求解
转移一下得: ax−pk=1 a x − p k = 1 然后我们就可以用扩展欧几里得算法来求出x的值
有不懂的或者有错误的可以留言,谢谢
最后
以上就是细腻发夹为你收集整理的欧几里德 与 扩展欧几里得 学习笔记欧几里得算法扩展欧几里得算法的全部内容,希望文章能够帮你解决欧几里德 与 扩展欧几里得 学习笔记欧几里得算法扩展欧几里得算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复