PE-05 欧几里得算法

8 篇文章 2 订阅

欧几里得算法: g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)

适用场景:用于求最大公约数。

#include <stdio.h>
int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b)
{
    return a / gcd(a, b) * b;
}
int main()
{
    int a, b;
    while (~scanf("%d%d", &a, &b))
    {
        printf("%d\n", gcd(a, b));
        printf("%d\n", lcm(a, b));
    }
}

备注:通过最大公约数(gcd)可求最小公倍数(lcm)

证明

求证 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b); – gcd 代表最大公约数

  1. 假设 a > b , t = g c d ( a , b ) ; a>b,t=gcd(a,b); a>bt=gcd(a,b)则存在p1,p2使下列等式成立:
    { a = t ∗ p 1 ; b = t ∗ p 2 ; = > g c d ( a , b ) = t = t ∗ g c d ( p 1 , p 2 ) \left\{ \begin{matrix} a=t*p1; \\ b=t*p2; \end{matrix} \right. =>gcd(a,b)=t=t*gcd(p1,p2) {a=tp1;b=tp2;=>gcd(a,b)=t=tgcd(p1,p2)
    由上式得到 g c d ( p 1 , p 2 ) = 1 gcd(p1,p2)=1 gcd(p1,p2)=1,即p1和p2互素(互为质数)
  2. 假设 a % b = r a\%b=r a%b=r,设 a = k ∗ b + r a=k*b+r a=kb+r
  3. 将1代入2得: t ∗ p 1 = k ∗ t ∗ p 2 + r , 所 以 r = ( p 1 − k ∗ p 2 ) ∗ t t*p1=k*t*p2+r,所以r=(p1-k*p2)*t tp1=ktp2+rr=(p1kp2)t,整理得:
    { b = p 2 ∗ t ; a % b = r = ( p 1 − k ∗ p 2 ) ∗ t ; \left\{ \begin{matrix} b=p2*t ;\\ a\%b=r=(p1-k*p2)*t; \end{matrix} \right. {b=p2t;a%b=r=(p1kp2)t;
  4. g c d ( p 2 , p 1 − k ∗ p 2 ) = m gcd(p2,p1-k*p2)=m gcd(p2,p1kp2)=m,则:
    { p 2 = m ∗ n 1 ; p 1 − k ∗ p 2 = m ∗ n 2 ; \left\{ \begin{matrix} p2=m*n1 ;\\ p1-k*p2=m*n2; \end{matrix} \right. {p2=mn1;p1kp2=mn2;
    化简得:
    { p 2 = m ∗ n 1 ; p 1 = m ∗ ( n 2 + k ∗ n 1 ) \left\{ \begin{matrix} p2=m*n1 ;\\ p1=m*(n2+k*n1) \end{matrix} \right. {p2=mn1;p1=m(n2+kn1)
  5. 因为步骤1得到了 g c d ( p 1 , p 2 ) = 1 gcd(p1,p2)=1 gcd(p1,p2)=1,结合步骤4知,m=1;即 g c d ( p 2 , p 1 − k ∗ p 2 ) = 1 gcd(p2,p1−k∗p2)=1 gcd(p2,p1kp2)=1;代入3即可得: g c d ( b , a % b ) = t gcd(b,a\%b)=t gcd(b,a%b)=t。所以: g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值