已知a、b,求其最大公比例(辗转相减法的扩展应用)

已知 a 、 b a、b ab的值,且已知其可以表示为如下形式:
a = q k 0 , b = q k 1 ( q 、 k 0 、 k 1 均 为 正 整 数 ) a=q^{k_0},b=q^{k_1} (q、k_0、k_1均为正整数) a=qk0,b=qk1(qk0k1)
p p p,使得:
p = q g , g = g c d ( k 0 , k 1 ) p=q^{g},g=gcd(k_0,k_1) p=qg,g=gcd(k0,k1)
p p p称为 a 、 b a、b ab间最大共比例。

当需要求很多个数的最大公比例时,直接求底数和指数很麻烦。于是我们可以运用辗转相减法来解决:

Q ( a , b ) Q(a,b) Q(a,b) a , b a,b a,b间最大公比例,则
Q ( a , b ) = Q ( q k 0 , q k 1 ) = q g c d ( k 0 , k 1 ) = q g c d ( k 1 , k 1 − k 0 ) = Q ( q k 1 , q k 1 − k 0 ) = Q ( b , b / a ) Q(a,b)=Q(q^{k_0},q^{k_1})=q^{gcd(k0,k1)}=q^{gcd(k1,k_1-k_0)}=Q(q^{k_1},q^{k_1-k_0})=Q(b,b/a) Q(a,b)=Q(qk0,qk1)=qgcd(k0,k1)=qgcd(k1,k1k0)=Q(qk1,qk1k0)=Q(b,b/a)
反复进行操作,直到a==b,就可以得到最大公比例。

用于此题的辗转相减法代码:

long gcd_sub(long a,long b)//辗转相减的另一种使用
{
    
    
    if(a==b) return a; //这里一定会 出现这种情况的 因为我们的b和a是倍数关系
    if(a>b) return gcd_sub(b,a/b);//我们保证a>b
    else return gcd_sub(b,a); 
}

猜你喜欢

转载自blog.csdn.net/qq_42021845/article/details/104852178
今日推荐