辗转相减法
辗转相减法
1、理论依据
\[gcd(a,b) = gcd(b,a-b)
\]
2、应用
用来求若干个形如\((\frac{p}{q})^{r_i}\)的最大公约数:其中
- \(\frac{p}{q}\)不是次幂的形式
- p、q、\(r_i\)均为正整数
- 辗转相减法
int gcd(int a, int b) {
int(a == b) return a;
return a > b ? gcd(b,a-b) : gcd(a, b-a);
}
3、算法推导
我们要求求若干个形如\((\frac{p}{q})^{r_i}\)的最大公约数,即求指数的最大公约数,
\(f(p^x, p^y) = p^{(x,y)} = p^{(y,x-y)})=f(p^y, p^{(x-y)}) = f(p^y, \frac{p^x}{p^y})\)
注意 x 要大于 y
int gcd_sub(int a,int b) {
if(a < b) swap(a,b);
if(b == 1) return a;
return gcd_sub(b, a/b);
}
数论例题:最大比例