cht讲算法——数论——欧几里得算法与拓展欧几里得算法(1)

欧几里得算法与拓展欧几里得算法(1)——数论中的beatsaber

哈罗大家好我是cht。

今天正式开死数论部分的讲解!

一、欧几里得算法的思路

众所周知,beatsaber是一个yxc巨佬喜爱的VR游戏。
(大佬:烂人你怎么又开始扯游戏了
好了好了一会大家就知道了。

1-1欧几里得算法用来解决什么东西

其实朴素欧几里得算法最大的用途就是:

求最大公因最小公倍数。

这里要先介绍一点点小东西:
a × b ( a , b ) = [ a , b ] \displaystyle \frac {a \times b} {(a, b)} = [a, b] (a,b)a×b=[a,b]
简明一点,就是:
a × b ÷ a 与 b 的 最 大 公 约 数 = a 与 b 的 最 小 公 倍 数 a \times b \div {a与b的最大公约数} = {a与b的最小公倍数} a×b÷ab=ab
证明如下:
令 d = ( A , B ) ; 则 a = A d b = B d ( a , b ) = 1 可 列 出 短 除 : d ∣ A , B ⋅ ⋅ — — ⋅ ⋅ a , b ( M a r k d o w n 并 没 有 短 除 功 能 此 时 把 A 与 B 分 解 质 因 数 : A = p 1 α 1 × p 2 α 2 × p 3 α 3 × ⋯ B = q 1 β 1 × q 2 β 2 × q 3 β 3 × ⋯ d 必 然 包 含 在 其 中 一 个 因 子 里 , 不 妨 设 : d = p x α x = q y β y ∵ d = p x α x = q y β y ∴ a = A ÷ p x α x , b = B ÷ q y β y 所 以 可 以 推 出 : [ A , B ] = a × b ( a , b ) 令d = (A, B);\\ 则 \displaystyle a = \frac Ad\\ \displaystyle b = \frac Bd\\ (a, b) = 1\\ 可列出短除:\\ d|A, B\\ ··——\\ ··a, b\\ (Markdown并没有短除功能\\ 此时把A与B分解质因数:\\ A = p_1 ^ {\alpha_1} \times p_2 ^ {\alpha_2} \times p_3 ^ {\alpha_3} \times \cdots\\ B = q_1 ^ {\beta_1} \times q_2 ^ {\beta_2} \times q_3 ^ {\beta_3} \times \cdots \\ d必然包含在其中一个因子里,\\ 不妨设:\\ d = p_x ^ {\alpha_x} = q_y ^ {\beta_y}\\ \because d = p_x ^ {\alpha_x} = q_y ^ {\beta_y}\\ \therefore a = A \div p_x ^ {\alpha_x}, b = B \div q_y ^ {\beta_y}\\ 所以可以推出:\\ [A, B] = \frac{a \times b}{(a, b)} d=(A,B);a=dAb=dB(a,b)=1dA,Ba,b(MarkdownABA=p1α1×p2α2×p3α3×B=q1β1×q2β2×q3β3×d:d=pxαx=qyβyd=pxαx=qyβya=A÷pxαx,b=B÷qyβy[A,B]=(a,b)a×b


1-2欧几里得算法的证明

好我们继续。
朴素欧几里得算法是如何求出来的呢?
请看下面的流程图。
cht讲算法——数论——欧几里得算法与拓展欧几里得算法(1)_第1张图片
那我们如何理解这个return gcd(b, a % b)呢?
这就是小学奥数中的辗转相除法了。
具体证明可以参考百度百科,这里提供一版y总的证明。
令 d = g c d ( a , b ) ; ∵ d = g c d ( a , b ) ; ∴ d m o d    a ≡ 0 d m o d    b ≡ 0 ∴ d m o d    a × x + b × y ≡ 0 ∵ d m o d    a × x + b × y ≡ 0 ∴ g c d ( a , b ) = g c d ( b , a − c × b ) ; ∵ d m o d    a ≡ 0 ∴ g c d ( a , b ) = g c d ( b , a m o d    b ) ; 证 毕 。 令d = gcd(a, b);\\ \because d = gcd(a, b);\\ \therefore \\ d \mod a \equiv 0 \\ d \mod b \equiv 0\\ \\ \therefore d \mod a \times x + b \times y \equiv 0\\ \because d \mod a \times x + b \times y \equiv 0\\ \therefore gcd(a, b) = gcd(b, a - c \times b);\\ \because d \mod a \equiv 0\\ \therefore gcd(a, b) = gcd(b, a \mod b); \\ 证毕。\\ d=gcd(a,b);d=gcd(a,b);dmoda0dmodb0dmoda×x+b×y0dmoda×x+b×y0gcd(a,b)=gcd(b,ac×b);dmoda0gcd(a,b)=gcd(b,amodb);


二、欧几里得算法的实现

其实证明一套套,代码就3行。

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

……


三、套入题目

题目在此
给定n对正整数ai,bi,请你求出每对数的最大公约数。

输入格式
第一行包含整数n。

接下来n行,每行包含一个整数对ai,bi。

输出格式
输出共n行,每行输出一个整数对的最大公约数。

数据范围
1 ≤ n ≤ 1 0 5 , 1 ≤ a [ i ] , b [ i ] ≤ 2 ∗ 1 0 9 1≤n≤10^5,\\ 1≤a[i],b[i]≤2∗10^9\\ 1n105,1a[i],b[i]2109
输入样例:

2
3 6
4 6

输出样例:

3
2

本题需要加上输入输出。
按照顺序输出gcd就行了。

#include
using namespace std;
int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}
int main()
{
    int n;
    cin >> n;
    while(n --)
    {
        int a, b;
        cin >> a >> b;
        cout << gcd(a, b) <

这是我的全部分享

bye~

不过最后还是需要说一句话:

gcd的过程不像 beat saber 吗

你可能感兴趣的:(cht原创分享,c++全套流水账,acwing,算法,c++)