首页 > 其他分享 >最大公约数_辗转相除法_更相减损术_原理

最大公约数_辗转相除法_更相减损术_原理

时间:2022-12-30 13:57:33浏览次数:39  
标签:gcd 更相 cdot 减损 int 最大公约数 计算 textcolor

辗转相除法

算法使用

  • 要计算\(a\)与\(b\)的最大公约数,且\(a \ ÷ \ b = q \cdots r \ \ \ (a >= b)\).
    • 若\(r \not = 0\),可将计算\(a\)与\(b\)的最大公约数,转为计算\(b\)与\(r\)的最大公约数.
    • 若\(r = 0\),则\(a\)与\(b\)的最大公约数为\(b\)

数学原理

\[\begin{aligned} 要证 & \textcolor{blue}{gcd(a,b) = gcd(b,r)} \\ & gcd(x,y)表示x和y的最大公约数 \\ 假设&a \ ÷ \ b = q \cdots r , \ a、b、q、r 均为整数 \\ & gcd(a,b) = d_1 , gcd(b,r) = d_2 \\ & a = d_1 \cdot m \ , \ b = d_1 \cdot n , m与n互质 \\ & b = d_2 \cdot i \ , \ r = d_2 \cdot j , i与j互质 \\ \therefore \ & a = b \cdot q + r \\ & r = a - b \cdot q \\ \because \ & r = a - b \cdot q \\ & \ \ = d_1 \cdot m - d_1 \cdot n \cdot q \\ & \ \ = d_1 (m - n \cdot q) \\ \therefore \ & r \ ÷ \ d_1 = m - n \cdot q 为整数 \\ & d_1 是 r 的约数 \\ \therefore \ & \textcolor{orange}{d_1是a、b、r的公约数} \\ \therefore \ & \textcolor{orange}{d_1 <= d_2} \\ \because \ & a = b \cdot q + r \\ & \ \ = d_2 \cdot i \cdot q + d_2 \cdot j \\ & \ \ = d_2(i \cdot q + j) \\ \therefore \ & a \ ÷ \ d_2 = i \cdot q + j 为整数 \\ & d_2 是 a 的约数 \\ \therefore \ & \textcolor{orange}{d_2是a、b、r的公约数} \\ \therefore \ & \textcolor{orange}{d_2 <= d_1} \\ \therefore \ & \textcolor{blue}{d_1 = d_2} \\ & \textcolor{blue}{gcd(a,b) = gcd(b,r)} \end{aligned} \]

代码实现

int gcd(int a , int b)
{
    if(a < b) swap(a,b);
    return b > 0 ? gcd(b,a % b) : a;
}

更相减损术

算法使用

  • 要计算\(a\)与\(b\)的最大公约数,且\(a >= b\).
    • 若\(a - b \not = b\),可将计算\(a\)与\(b\)的最大公约数,转为计算\(a - b\)与\(b\)的最大公约数.
    • 若\(a - b = b\),则\(a\)与\(b\)的最大公约数为\(b\)

数学原理

\[\begin{aligned} 要证 & \textcolor{blue}{gcd(a,b) = gcd(b,a - b)} , a > b \\ & gcd(x,y)表示x和y的最大公约数 \\ 假设 & gcd(a,b) = d_1 , gcd(b,a - b) = d_2 \\ & a = d_1 \cdot m \ , \ b = d_1 \cdot n , m与n互质 \\ & a - b = d_2 \cdot i \ , \ b = d_2 \cdot j , i与j互质 \\ \because \ & a - b = d_1(m - n) \\ \therefore \ & \begin{cases} \textcolor{red}{a = d_1 \cdot m} \\ \textcolor{red}{b = d_1 \cdot n} \\ \textcolor{red}{a - b = d_1 \cdot (m - n)} \\ \end{cases} \\ \therefore \ & \textcolor{orange}{d_1是a、b、a-b的公约数} \\ & \textcolor{orange}{d_1 <= d_2} \\ \because \ & a = d_2 (i + j) \\ \therefore \ & \begin{cases} \textcolor{red}{a = d_2 \cdot (i + j)} \\ \textcolor{red}{b = d_2 \cdot j} \\ \textcolor{red}{a - b = d_2 \cdot i} \\ \end{cases} \\ \therefore \ & \textcolor{orange}{d_2是a、b、a-b的公约数} \\ & \textcolor{orange}{d_2 <= d_1} \\ \therefore \ & \textcolor{blue}{d_1 = d_2} \\ & \textcolor{blue}{gcd(a,b) = gcd(b,a - b)} \\ \end{aligned} \]

代码实现

int gcd(int a , int b)
{
    if(a == b) return a;
    return gcd(max(a,b) - min(a,b),min(a,b));
}

更相减损术优化

算法使用

  • 要计算\(a\)与\(b\)的最大公约数,且\((a >= b)\).
    • 若\(a \not = b\),
      • 若 \(a \ \% \ 2 = 0\) 且 \(b \ \% \ 2 = 0\),则可将计算 \(a\) 与 \(b\) 的最大公约数,转为计算 \(a \ \% \ 2\) 与 \(b \ \ \% \ 2\) 的最大公约数乘上\(2\).
      • 若 \(a \ \% \ 2 = 0\) 且 \(b \ \% \ 2 \not = 0\),则可将计算 \(a\) 与 \(b\) 的最大公约数,转为计算 \(a \ \% \ 2\) 与 \(b\) 的最大公约数.
      • 若 \(a \ \% \ 2 \not = 0\) 且 \(b \ \% \ 2 = 0\),则可将计算 \(a\) 与 \(b\) 的最大公约数,转为计算 \(a\) 与 \(b \ \ \% \ 2\) 的最大公约数.
      • 若 \(a \ \% \ 2 \not = 0\) 且 \(b \ \% \ 2 \not = 0\),则可将计算 \(a\) 与 \(b\) 的最大公约数,转为计算 \(a - b\) 与 \(b\) 的最大公约数.
    • 若\(a = b\),则 \(a\) 与 \(b\) 的最大公约数为\(b\)

数学原理

更相减损术在两个整数相差较大时,递归多次影响性能,在此时可以通过简单位运算改善性能

代码实现

int gcd(int a , int b)
{
    if(a == b) return b;
    if(!(a & 1) && !(b & 1)) return gcd(a >> 1,b >> 1) << 1;
    if(!(a & 1) && b & 1) return gcd(a >> 1,b);
    if(a & 1 && !(b & 1)) return gcd(a,b >> 1);
    return gcd(max(a,b) - min(a,b),min(a,b));
}

标签:gcd,更相,cdot,减损,int,最大公约数,计算,textcolor
From: https://www.cnblogs.com/why-123/p/17014721.html

相关文章

  • AcWing246. 区间最大公约数
    题目描述给定一个长度为\(N\)的数列\(A\),以及\(M\)条指令,每条指令可能是以下两种之一:Clrd,表示把\(A[l],A[l+1],…,A[r]\)都加上\(d\)。Qlr,表示询问\(A[l......
  • 54. 【中学】求最大公约数——递归
    54.【中学】求最大公约数——递归 请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。        =m            当m<=n且nmodm......
  • 给定两个数,求这两个数的最大公约数
    1.辗转相除法,一般用来求最大公约数#include<stdio.h>intmain(){intm;intn;intr;printf("请输入两个数:");scanf("%d%d",&m,&n);while(m%n!=0){r=m%n......
  • 辗转相减法求最大公约数
    要求:用C实现一个函数intgcd(inta,intb)求解两个整数的最大公约数,算法步骤是,用a,b中的大值减去小值得到临时值c,然后再用c和a,b中的最小值进行计算,直到c和a,b中的最......
  • 辗转相除法求最大公约数
    代码#include<stdio.h>intmain(){ inta,b,r,temp; printf("Pleaseentera,b:"); scanf("%d,%d",&a,&b); if(a<b) { temp=a; a=b; b=temp; } r=a%b; ......
  • 最大公约数(一)
        如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的......
  • [JSOI2015]最大公约数
    链接:https://www.luogu.com.cn/problem/P5502题目描述:对于一个序列$a$,求$\sum_{i=l}^{r}gcd(a_{l},....,a_r)\times(r-l+1)$的最大值。题解:利用"签到游戏"的知识,我们......
  • 最大公约数 GCD greatest common divisor
     辗转相除法#include<stdio.h>intmain(void){intm,n,r;scanf("%d%d",&m,&n);if(m<n){m=m^n;n=m^n;......
  • Lucky Chains(最大公约数的应用)
    题目:LuckyChains题意:给定两个正整数a,b,若(a,b)=(a+1,b+1)=(a+2,b+2)=...=(a+k,b+k)=1,求k的最大值(k的最大值可能为正无穷)思路:由于最......
  • C语言:用一个函数求任意两个整数的最大公约数或最小公倍数
    #include<stdio.h>intgygb(intm,intn,intx){inta;if(x==0){for(a=m;a>=1;a--)if(m%a==0&&n%a==0)returna;return......