返回 gcd(a,b) g c d ( a , b ) ,并计算方程: ax+by=gcd(a,b) a x + b y = g c d ( a , b ) 的一个解
#include<stdlib.h>
#include<stdio.h>
int e_gcd(int a, int b, int * x, int *y) {
if (b == 0) {
*x = 1;
*y = 0;
return a;
}
int ans = e_gcd(b, a%b, x, y);
int temp = *x;
*x = *y;
*y = temp - a / b*(*y);
return ans;
}
int main() {
int a = 8, b = 3;
int x, y;
int result = e_gcd(a, b, &x,&y);
printf("gcd(%d,%d)=%d,%d*a+%d*b=%d", a, b, result, x, y, result);
return 0;
}
int
i
n
t
a,b,m>0
a
,
b
,
m
>
0
,求使
a+kbm是整数的最小的k:
a
+
k
b
m
是
整
数
的
最
小
的
k
:
想法:比如
8+4k6=t<=>6t−4k=8(∗)
8
+
4
k
6
=
t
<=>
6
t
−
4
k
=
8
(
∗
)
先求解6x−4y=gcd(6,4)=2的一组解(x0,y0),这是扩展欧几里得算法
先
求
解
6
x
−
4
y
=
g
c
d
(
6
,
4
)
=
2
的
一
组
解
(
x
0
,
y
0
)
,
这
是
扩
展
欧
几
里
得
算
法
两边乘以某个数,使得8出现在右边,这里乘以agcd(m,k)=82,
两
边
乘
以
某
个
数
,
使
得
8
出
现
在
右
边
,
这
里
乘
以
a
g
c
d
(
m
,
k
)
=
8
2
,
等式变为6(4x0)−4(4y0)=8,我们这样主要为了得到(∗)的一组解(4x0,4y0)而已
等
式
变
为
6
(
4
x
0
)
−
4
(
4
y
0
)
=
8
,
我
们
这
样
主
要
为
了
得
到
(
∗
)
的
一
组
解
(
4
x
0
,
4
y
0
)
而
已
然后就可以的到所有解:
设有两组解:
6x1−4y1=8
6
x
1
−
4
y
1
=
8
,
6x2−4y2=8
6
x
2
−
4
y
2
=
8
,相减:
#include<stdlib.h>
#include<stdio.h>
int e_gcd(int a, int b, int * x, int *y) {
if (b == 0) {
*x = 1;
*y = 0;
return a;
}
int ans = e_gcd(b, a%b, x, y);
int temp = *x;
*x = *y;
*y = temp - a / b*(*y);
return ans;
}
int min_k(int a, int b, int m) {//求(a+kb)/m是整数中最小的k
int x = 0, y = 0;
int k1 = e_gcd(m, b, &x, &y);
if (a%k1 != 0) printf("无解\n"); exit(0);
y *= a / k1;//这是一个特解
y = -(((y%(m/k1))-(m/k1))%(m/k1));
return y;
}
int main() {
int ress=min_k(6, 4, 5);
printf("%d\n", ress);
}