辗转相除以及辗转相减法

前言

在学习Acwing c++蓝桥杯辅导课第八讲数论-AcWing 1223. 最大比例时有使用到求指数的最大公约数,这里来记录下知识点。

当前文章已收录到博客文件目录索引:博客目录索引(持续更新)

辗转相除法(又名欧几里算法)

应用:辗转相除实际也就是欧几里得算法,主要是求两个整数的最大公约数

举例:gcd(52,53) = 52

注意:而针对于指数形式的要求得的最大公约数则需要使用辗转相减法。

代码:时间复杂度O(logn)。

class Solution {
    
    

    //欧几里得算法(辗转相除法)
    public static int gcd(int a, int b) {
    
    
        if (b == 0) return a;
        return gcd(b, a % b);
    }

    public static void main(String[] args) {
    
    
        System.out.println(gcd(12, 5));
    }
}

辗转相减法(又名更相减损法)

原始辗转相减法

场景:更相减损术是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。

原理:gcd(a,b)=gcd(b,a−b)。

代码实现:

扫描二维码关注公众号,回复: 15524855 查看本文章
public static int gcd_sub(int a, int b) {
    
    
    while (a != b) {
    
    
        if (a > b) {
    
    
            a = a - b;
        } else {
    
    
            b = b - a;
        }
    }
    return a;
}

改版辗转相减法(减的是指数)

算法题:AcWing 1223. 最大比例

通过辗转相减法gcd(x,y) = gcd(y,x%y) = gcd(y,x−y)来进行推导:f(px,py) = pgcd(x,y) = pgcd(y,x−y) = f(py,p(x−y)) = f(py, p x p y \frac{px}{py} pypx),即可以求

求px和py幂的最大公约数次幂pgcd(x,y)

应用:辗转相减法可以用来求若干个形如( p q \frac{p}{q} qp)ri的数的最大公约数。

举例(指数的最大公约数):gcd_sub(52,53) = 51

算法推导过程:f(px,py) = p(x,y) = p(y,x−y) = f(py,p(x−y)) = f(py, p x p y \frac{px}{py} pypx)

  • p q \frac{p}{q} qp不可以再表示为次幂的形式。
  • p、q、ri均为正整数。

代码:时间复杂度O(n)

class Solution {
    
    

    /**
     * 辗转相减法(指数的最大公约数)
     * @return
     */
    public static int gcd_sub(int a, int b) {
    
    
        if (b == 1) return a;
        if (a < b) {
    
    
            int temp = a;
            a = b;
            b = temp;
        }
        return gcd_sub(b, a / b);
    }

    public static void main(String[] args) {
    
    
        System.out.println(gcd_sub(25, 125));
    }
}

image-20230126142755459


参考文章

[1]. 辗转相减法

[2]. 【最大公约数 GCD】 — 常用四大算法(辗转相除法,穷举法,更相减损法,Stein算法)

[3]. 数论-辗转相减法-第七届蓝桥杯省赛C++A/B组-最大比例

猜你喜欢

转载自blog.csdn.net/cl939974883/article/details/128765823