跳到内容
返回探索
离散数学 / 中文

初级数论之:两个数的最大公约数的递推公式【更相减损术】【辗转相除法】

南瓜之运 · 哔哩哔哩 · 4:14

打开原视频
阅读与收藏

把讲解展开来看。

已审核学习内容 · 视频分析 · 中文
阅读完整概览

片段先用文档给出两个数最大公约数的递推公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b),并说明更相减损术和辗转相除法分别是 k=1k=1 与 k=⌊a/b⌋k=\lfloor a/b\rfloor 的特例。随后切换到 C++ 代码,用 `a=24a=24`、`b=504b=504` 调用 `gcd(a,b)`,终端输出 24,验证 gcd⁡(24,504)=24\gcd(24,504)=24。讲解者还提醒演示环境因 C++ 版本较新可直接使用 `gcd`,考试环境可能需要自行实现。 片段先用 C++ 代码枚举 k=−1024k=-1024 到 10241024,检查 gcd⁡(24,504)\gcd(24,504) 是否总等于 gcd⁡(504,24−k⋅504)\gcd(504,24-k\cdot 504);终端只输出星号,说明测试范围内没有反例。随后切换到讲义,给出最大公约数递推公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b),并说明两个特例:k=1k=1 得到更相减损术 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b),k=⌊a/b⌋k=\lfloor a/b\rfloor 得到辗转相除法 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。

在学习检查器中查看要点和时刻,或切换阅读标签查看完整笔记。

章节

0:00两个数的最大公约数的递推公式0:15更相减损术与辗转相除法0:38C++ 示例:计算 gcd(24,504)1:12关于 C++ 内置 gcd 函数的提醒2:07代码枚举 k 检验 gcd 不变性2:55最大公约数的递推公式3:16更相减损术:k=1k=1 的特例3:32辗转相除法:k=⌊a/ba/b⌋ 的特例

学习解说文稿

依据视频画面与讲解整理,并非逐字语音转写。

视频开头展示一份深色背景文档,标题为“两个数的最大公约数的递推公式”。讲解者先说明本节目标是求两个数最大公约数的递推公式,并强调对新学竞赛而言掌握一个核心公式即可。

文档给出核心公式:对于任意整数 kk,有 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)。这里的 kk 是可任取的整数参数,a,ba,b 是被求最大公约数的两个整数。

紧接着,文档把该公式 specialize 为两个常见方法。第一,令 k=1k=1,得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)。这一步只是把 a−k⋅ba-k\cdot b 中的 kk 替换为 1。

第二,令 k=⌊a/b⌋k=\lfloor a/b\rfloor,得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。视频直接给出这一结论;补充来看,通常是因为 a mod b=a−⌊a/b⌋ba\bmod b=a-\lfloor a/b\rfloor b。

画面随后切到 C++ 代码编辑器。讲解者开始举数值例子,在 `main` 函数中声明 `const int a=24a = 24;` 和 `const int b=504b = 504;`,准备计算这两个整数的最大公约数。

代码写入 `cout << gcd(a, b) << endl;` 并运行。终端输出 `24`,因此示例验证了 gcd⁡(24,504)=24\gcd(24,504)=24。讲解者也口头确认“算出来等于 24”。

讲解者解释这里能直接写 `gcd(a,b)`,是因为他使用的 C++ 版本较新,环境中自带该函数。但他随即提醒,考试时的 C++ 编译器版本未必这么新,届时可能需要自己实现 gcd 函数。

之后,讲解者把示例结果记为 a=24,b=504a=24,b=504 时的最大公约数答案 24,并继续在代码中加入 `const int c = gcd(a, b);`,为后续讨论做准备。

片段末尾,讲解者回到参数 kk 的范围,说可以令 kk 从负的 1024 到正的 1024,并在代码中写出 `for (int k=−1024k=-1024;k<=1024;++k)`。他开始询问是否存在某个 kk 使 gcd⁡(b,a−k⋅b)\gcd(b,a-k\cdot b) 满足后续条件,但句子在片段结束前未说完。

画面左侧是 VS Code 中的 C++ 程序,右侧是终端。代码设置 `const int a=24a = 24;`、`const int b=504b = 504;`、`const int c = gcd(a, b);`,然后用 `for (int k=−1024k=-1024; k<=1024; ++k)` 遍历整数 kk。循环体内检查 `if (c != gcd(b, a−k∗ba - k * b))`,若不相等就输出当前 kk。

为了标记程序完整运行结束,代码最后加入 `cout << "**********" << endl;`。讲解者说明这堆星号只是程序运行完成的标记。

终端重新编译运行后只显示 `**********`,没有显示任何 kk。由于程序只在 `c != gcd(b, a−k∗ba - k * b)` 时输出 kk,这说明在测试范围 −1024≤k≤1024-1024\le k\le 1024 内没有找到反例。

讲解者据此总结:对于任意整数 kk,gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 总是成立。这里的数学内容是最大公约数在把第一参数替换为 a−kba-kb、并交换参数顺序后保持不变。

画面切换到黑底白字讲义,标题为“1 两个数的最大公约数的递推公式”。正文写出“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”。这是本片段的核心递推公式。

讲义继续展示两个特例。第1.1节“更相减损术”写道:“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)。”这一步只是把一般公式中的 kk 代入 1,因此 a−kba-kb 变成 a−ba-b。

第1.2节“辗转相除法”写道:“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。”讲解者解释 ⌊a/b⌋\lfloor a/b\rfloor 是 aa 除以 bb 的商,因此 a−⌊a/b⌋ba-\lfloor a/b\rfloor b 是被除数减去商乘以除数,即余数 a mod ba\bmod b。

画面中用粉色手写标注在 a−k⋅ba-k\cdot b 上方写出 a−⌊a/b⌋ba-\lfloor a/b\rfloor b,并用箭头指向下方的 a mod ba\bmod b。这个视觉步骤把一般递推公式与辗转相除法连接起来,说明后者是前者在 k=⌊a/b⌋k=\lfloor a/b\rfloor 时的特例。

知识卡片

01

两个数最大公约数的递推公式

视频给出的核心公式是:对于任意整数 kk,gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)。讲解者强调这是求两个数最大公约数时需要掌握的关键递推关系。

gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)
02

更相减损术

令核心公式中的 k=1k=1,得到 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)。这就是文档中标注的更相减损术,本质上是每次用两数差替换其中一个参数。

gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)
03

辗转相除法

令核心公式中的 k=⌊a/b⌋k=\lfloor a/b\rfloor,文档直接给出 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。补充解释:通常因为 a mod b=a−⌊a/b⌋ba\bmod b=a-\lfloor a/b\rfloor b,所以它也是核心公式的特例。

gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)
04

示例 gcd(24,504)

视频在 C++ 代码中设置 `a=24a=24`、`b=504b=504`,调用 `gcd(a,b)` 并输出结果。终端显示 `24`,因此示例验证 gcd⁡(24,504)=24\gcd(24,504)=24。

gcd⁡(24,504)=24\gcd(24,504)=24
05

C++ 内置 gcd 的使用提醒

讲解者说明演示环境可以直接调用 `gcd(a,b)`,是因为所用 C++ 版本较新;但考试环境的编译器版本可能较旧,不能假定该函数一定存在,必要时需要自行实现。

06

最大公约数递推公式

视频给出的核心公式是:对于任意整数 kk,gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)。它表示计算两个整数的最大公约数时,可以把其中一个参数替换为另一个参数的整数倍差,并交换参数位置,结果不变。代码示例用 a=24a=24、b=504b=504 和 k∈[−1024,1024]k\in[-1024,1024] 做枚举检验,终端没有输出任何反例 kk。

gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)
07

更相减损术

更相减损术是递推公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 在 k=1k=1 时的特例。代入 k=1k=1 后,第二参数 a−kba-kb 变为 a−ba-b,因此得到 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)。讲义第1.1节明确写出这一推导。

gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)
08

辗转相除法

辗转相除法是递推公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 在 k=⌊a/b⌋k=\lfloor a/b\rfloor 时的特例。此时 a−kb=a−⌊a/b⌋ba-kb=a-\lfloor a/b\rfloor b,讲解者说明这是被除数减去商乘以除数,等于余数 a mod ba\bmod b,因此得到 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。视频未明确说明除法要求 b≠0b\neq0。

gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)
09

代码验证 gcd 不变性

代码先令 a=24a=24、b=504b=504、c=gcd⁡(a,b)c=\gcd(a,b),再遍历 k=−1024k=-1024 到 10241024。若出现 c≠gcd⁡(b,a−kb)c\neq\gcd(b,a-kb),程序输出该 kk;循环结束后输出 `**********` 作为完成标记。终端只显示 `**********`,说明测试范围内没有发现反例。

详细学习笔记

按知识点查看条件、步骤和证据。补充解释与视频直接内容分别标明。

符号定义 · 14

gcd⁡\gcd

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档中反复出现 gcd⁡(a,b)\gcd(a,b),代码中调用 gcd⁡(a,b)\gcd(a,b)。

  2. 声音
    观察依据

    讲解者多次说“最大公约数”。

符号

gcd⁡\gcd

含义

两个整数的最大公约数函数。

适用范围

视频未说明具体定义域;示例中使用非负整数。

a,ba,b

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档公式写为 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)。

  2. 公式
    观察依据

    代码中声明 `const int a=24a = 24;` 与 `const int b=504b = 504;`。

符号

a,ba,b

含义

参与求最大公约数的两个整数。

适用范围

示例中为整数;视频未给出一般限制。

kk

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档写“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”。

  2. 声音
    观察依据

    讲解者说“首先设 kk 为任意的整数”。

  3. 公式
    观察依据

    代码循环写为 `for (int k=−1024k=-1024;k<=1024;++k)`。

符号

kk

含义

递推公式中可任取的整数参数。

适用范围

任意整数。

a mod ba\bmod b

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档写 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。

待核验内容
  1. 视频未解释 `mod` 的取余定义、符号约定或 b=0b=0 时的处理。

符号

a mod ba\bmod b

含义

辗转相除法公式中的取余项。

适用范围

视频未说明。

⌊a/b⌋\lfloor a/b\rfloor

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档写“令 k=⌊a/b⌋k=\lfloor a/b\rfloor”。

待核验内容
  1. 视频未说明 b=0b=0 时该表达式无定义。

符号

⌊a/b⌋\lfloor a/b\rfloor

含义

对 a/ba/b 取向下取整得到的整数商。

适用范围

视频未说明。

`int`

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码中出现 `const int a=24a = 24;`、`const int b=504b = 504;`、`for (int k=−1024k=-1024;k<=1024;++k)`。

符号

`int`

含义

C++ 中用于声明示例变量的整数类型。

适用范围

视频未说明取值范围。

`gcd(a, b)`

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码中写 `cout << gcd(a, b) << endl;`。

  2. 声音
    观察依据

    讲解者说“我这里直接用了 gcd 这个函数……我的 C++ 的版本现在比较新,所以它自带了 gcd 这个函数”。

待核验内容
  1. 视频未说明所用标准库头文件;画面可见 `#include <bits/stdc++.h>`。

符号

`gcd(a, b)`

含义

C++ 代码中对最大公约数函数的调用。

适用范围

示例中传入两个 `int`。

a

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码第6行 `const int a=24a = 24;`;讲义第1节公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 中出现 aa

  2. 声音
    观察依据

    讲解者在推导 k=⌊a/b⌋k=\lfloor a/b\rfloor 时说“aa 除以 bb 的商”

符号

a

含义

参与最大公约数计算的第一整数;在代码示例中取值为 24

适用范围

整数

b

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码第7行 `const int b=504b = 504;`;讲义第1节公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 中出现 bb

  2. 声音
    观察依据

    讲解者说“aa 除以 bb 下下去整”

符号

b

含义

参与最大公约数计算的第二整数;在代码示例中取值为 504

适用范围

整数

c

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码第8行 `const int c = gcd(a, b);`;第11行 `if (c != gcd(b, a−k∗ba - k * b))`

  2. 声音
    观察依据

    讲解者说“如果 c 不等于它”

符号

c

含义

代码中保存 gcd⁡(a,b)\gcd(a,b) 结果的变量

适用范围

整数

k

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码第10行 `for (int k=−1024k=-1024; k<=1024; ++k)`;讲义第1节“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”

  2. 声音
    观察依据

    讲解者说“对于任意的 kk”“比如说 kk 等于 1 的时候”“令 kk 等于 aa 除以 bb 下下去整”

符号

k

含义

递推公式中的整数参数;代码中遍历范围为 -1024 到 1024

适用范围

整数

gcd⁡\gcd

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码第8行 `gcd(a, b)`;讲义第1节公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)

  2. 声音
    观察依据

    讲解者读出“gcd a b 等于 gcd b a 减 k 倍的 b”

符号

gcd⁡\gcd

含义

最大公约数函数

适用范围

作用于两个整数,返回整数

知识点 · 7

两个数最大公约数的递推公式

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档标题为“两个数的最大公约数的递推公式”。

  2. 公式
    观察依据

    文档正文写“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”。

  3. 声音
    观察依据

    讲解者说“这一次呢我们来讲一下求两个数的最大公约数的递推公式”“首先设 kk 为任意的整数,则 aa 和 bb 的最大公约数等于 b,ab, a 减去 kk 倍的 bb 的最大公约数”。

公式
解释

视频给出的核心公式把 gcd⁡(a,b)\gcd(a,b) 转化为 gcd⁡(b,a−k⋅b)\gcd(b,a-k\cdot b),其中 kk 可任取整数。讲解者强调对新学竞赛而言掌握这一个公式即可。

公式
gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)
适用条件
  1. kk 为任意整数。

  2. 视频未说明 a,ba,b 的额外限制。

更相减损术

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档小节标题为“1.1 更相减损术”。

  2. 公式
    观察依据

    文档写“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)”。

方法
解释

这是核心递推公式在 k=1k=1 时的特例,每次把第一参数替换为两数之差。

公式
gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)
适用条件
  1. 由核心公式令 k=1k=1 得到。

  2. 视频未说明 a,ba,b 的大小关系或正负限制。

先修条目
  1. 两个数最大公约数的递推公式

辗转相除法

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档小节标题为“1.2 辗转相除法”。

  2. 公式
    观察依据

    文档写“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)”。

待核验内容
  1. 视频未解释 `mod` 的定义、b=0b=0 的处理或向下取整商与余数的关系。

方法
解释

这是核心递推公式在 k=⌊a/b⌋k=\lfloor a/b\rfloor 时的特例,把第一参数替换为 aa 除以 bb 的余数。

公式
gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)
适用条件
  1. 由核心公式令 k=⌊a/b⌋k=\lfloor a/b\rfloor 得到。

  2. 视频未说明 b≠0b\neq 0 这一通常所需前提。

先修条目
  1. 两个数最大公约数的递推公式

C++ 中可直接调用 gcd 函数

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码中调用 `gcd(a, b)`。

  2. 声音
    观察依据

    讲解者说“我这里直接用了 gcd 这个函数,那是因为我的 C++ 的版本啊现在比较新啊,所以它自带了 gcd 这个函数”。

  3. 声音
    观察依据

    讲解者又说“但是你考试的时候那个 C++ 编译器的版本不一定有这么新啊,所以你考试的时候那个 gcd 这个函数也要自己实现的啊,我们等会儿再讲怎么实现的啊”。

待核验内容
  1. 视频未说明具体 C++ 标准版本或头文件;画面可见 `#include <bits/stdc++.h>`。

方法
解释

视频用较新的 C++ 环境演示直接调用 `gcd(a,b)` 计算最大公约数,同时提醒考试环境未必支持该内置函数,需要自行实现。

公式
cout<<gcd(a,b)<<endl;cout << gcd(a, b) << endl;
适用条件
  1. 视频称当前 C++ 版本较新。

  2. 视频未说明具体标准版本。

两个数的最大公约数的递推公式

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义标题“1 两个数的最大公约数的递推公式”;正文“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”

  2. 声音
    观察依据

    讲解者说“对于任意的 kk,gcd a b 等于 gcd b a 减 kk 倍的 bb,总是成立的”“我们要掌握的第一个系统化的专业的递推公式”

公式
解释

视频给出最大公约数的递推恒等式:对任意整数 kk,gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)。该公式把 (a,b)(a,b) 的最大公约数转化为 (b,a−kb)(b,a-kb) 的最大公约数,是后续更相减损术和辗转相除法的统一来源。

公式
gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)
适用条件
  1. a,ba,b 为整数

  2. kk 为任意整数

更相减损术作为递推公式的特例

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1.1节“更相减损术”;“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)”

  2. 声音
    观察依据

    讲解者说“比如说 kk 等于 1 的时候,我们就得到 gcd a b 等于 gcd b a 减 b,这就是大名鼎鼎的更相减损术”

方法
解释

在递推公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 中取 k=1k=1,得到 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)。视频将此特例命名为更相减损术。

公式
gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)
适用条件
  1. k=1k=1

  2. a,ba,b 为整数

先修条目
  1. 两个数的最大公约数的递推公式

辗转相除法作为递推公式的特例

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1.2节“辗转相除法”;“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)”

  2. 声音
    观察依据

    讲解者说“如果令 kk 等于 aa 除以 bb 下下去整……我们就得到 gcd a b 等于 gcd b a 模 b 的余数,这个就是大名鼎鼎的辗转相除法”

方法
解释

在递推公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 中取 k=⌊a/b⌋k=\lfloor a/b\rfloor,则 a−kb=a−(⌊a/b⌋)ba-kb=a-(\lfloor a/b\rfloor)b 是 aa 除以 bb 的余数,因此得到 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。视频将此特例命名为辗转相除法。

公式
gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)
适用条件
  1. k=⌊a/b⌋k=\lfloor a/b\rfloor

  2. a,ba,b 为整数

  3. 视频未说明 b≠0b\neq 0

先修条目
  1. 两个数的最大公约数的递推公式
定理与条件 · 8

任意整数 k 下的 gcd 递推恒等式

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档写“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”。

  2. 声音
    观察依据

    讲解者复述该公式并称“就是这个公式啊”。

待核验内容
  1. 视频未给出证明。

命题
命题

对于任意整数 kk,有 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)。

前提
  1. kk 为任意整数。

  2. 视频未说明 a,ba,b 的额外限制。

量词

对任意整数 kk 成立。

更相减损术是核心公式的特例

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档写“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)”。

命题
命题

令 k=1k=1 时,核心递推公式化为 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)。

前提
  1. 核心公式成立。

  2. 取 k=1k=1。

量词

在视频给出的公式框架下直接代入。

辗转相除法是核心公式的特例

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档写“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)”。

待核验内容
  1. 视频未说明 b≠0b\neq 0 以及 `mod` 的精确定义。

命题
命题

令 k=⌊a/b⌋k=\lfloor a/b\rfloor 时,核心递推公式化为 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。

前提
  1. 核心公式成立。

  2. 取 k=⌊a/b⌋k=\lfloor a/b\rfloor。

  3. 视频未说明但通常需 b≠0b\neq 0。

量词

在视频给出的公式框架下直接代入。

示例中 gcd(24,504) 的值

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码中 `const int a=24a = 24;`、`const int b=504b = 504;`。

  2. 公式
    观察依据

    终端输出 `24`。

  3. 声音
    观察依据

    讲解者说“算出来等于 24 啊”“当 a=24,b=504a=24, b=504 的时候,它们的最大公约数的答案是 24”。

命题
命题

在该示例中,gcd⁡(24,504)=24\gcd(24,504)=24。

前提
  1. a=24a=24。

  2. b=504b=504。

量词

针对给定数值实例。

考试环境可能需要自行实现 gcd

依据清楚
视频直接表达
来源依据
  1. 声音
    观察依据

    讲解者说“但是你考试的时候那个 C++ 编译器的版本不一定有这么新啊,所以你考试的时候那个 gcd 这个函数也要自己实现的啊”。

待核验内容
  1. 视频未说明具体考试平台或编译器版本。

命题
命题

视频提醒考试时 C++ 编译器版本可能较旧,不能假定 `gcd` 函数一定可用,需要自行实现。

前提
  1. 考试环境的 C++ 编译器版本可能不如演示环境新。

量词

视频以一般性提醒表述,未给出形式化量词。

任意整数 k 下最大公约数保持不变

依据清楚
视频直接表达
来源依据
  1. 声音
    观察依据

    讲解者说“也就是说对于任意的 kk,gcd a b 等于 gcd b a 减 kk 倍的 bb,总是成立的”

  2. 公式
    观察依据

    讲义第1节写出“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”

  3. 图示
    观察依据

    终端运行程序后只输出 `**********`,没有输出任何使条件 `c != gcd(b, a−k∗ba - k * b)` 成立的 kk

命题
命题

对于任意整数 kk,都有 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)。

前提
  1. a,ba,b 为整数

  2. kk 为任意整数

量词

任意整数 kk

k=1k=1 时递推公式化为更相减损术

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1.1节“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)”

  2. 声音
    观察依据

    讲解者说“kk 等于 1 的时候,我们就得到 gcd a b 等于 gcd b a 减 b,这就是大名鼎鼎的更相减损术”

命题
命题

令 k=1k=1,递推公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 化为 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)。

前提
  1. a,ba,b 为整数

  2. k=1k=1

量词

存在特定取值 k=1k=1

k=⌊a/ba/b⌋ 时递推公式化为辗转相除法

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1.2节“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)”

  2. 声音
    观察依据

    讲解者说“如果令 kk 等于 aa 除以 bb 下下去整……我们就得到 gcd a b 等于 gcd b a 模 b 的余数,这个就是大名鼎鼎的辗转相除法”

待核验内容
  1. 视频未明确说明 b≠0b\neq 0 这一除法前提

命题
命题

令 k=⌊a/b⌋k=\lfloor a/b\rfloor,则 a−kb=a mod ba-kb=a\bmod b,从而 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。

前提
  1. a,ba,b 为整数

  2. k=⌊a/b⌋k=\lfloor a/b\rfloor

  3. 视频未说明 b≠0b\neq 0

量词

存在特定取值 k=⌊a/b⌋k=\lfloor a/b\rfloor

推导与证明 · 6

由核心公式得到更相减损术

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档先给出 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b),随后写“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)”。

直观解释
步骤
  1. 公式
    gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)
    解释

    从视频给出的核心递推公式出发。

    步骤依据

    文档直接给出该公式。

    视频直接表达
  2. 公式
    k=1k=1
    解释

    将参数 kk 取为 1。

    步骤依据

    文档写“令 k=1k=1”。

    视频直接表达
  3. 公式
    gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)
    解释

    代入后得到更相减损术形式。

    步骤依据

    把 k=1k=1 代入 a−k⋅b=a−ba-k\cdot b=a-b。

    依据视频推导
结论

更相减损术 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b) 是核心递推公式在 k=1k=1 时的特例。

由核心公式得到辗转相除法

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档先给出 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b),随后写“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)”。

待核验内容
  1. 视频未展示从 a−⌊a/b⌋ba-\lfloor a/b\rfloor b 到 a mod ba\bmod b 的中间说明。

直观解释
步骤
  1. 公式
    gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)
    解释

    从视频给出的核心递推公式出发。

    步骤依据

    文档直接给出该公式。

    视频直接表达
  2. 公式
    k=⌊a/b⌋k=\lfloor a/b\rfloor
    解释

    将参数 kk 取为 a/ba/b 的向下取整。

    步骤依据

    文档写“令 k=⌊a/b⌋k=\lfloor a/b\rfloor”。

    视频直接表达
  3. 公式
    gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)
    解释

    代入后得到辗转相除法形式。

    步骤依据

    文档直接给出该结论;补充解释:通常因为 a mod b=a−⌊a/b⌋ba\bmod b=a-\lfloor a/b\rfloor b。

    视频直接表达
结论

辗转相除法 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b) 是核心递推公式在 k=⌊a/b⌋k=\lfloor a/b\rfloor 时的特例。

数值验证 gcd(24,504)=24

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码设置 `const int a=24a = 24;`、`const int b=504b = 504;`。

  2. 公式
    观察依据

    终端输出 `24`。

  3. 声音
    观察依据

    讲解者说“算出来等于 24 啊”。

数值验证
步骤
  1. 公式
    a=24,b=504a=24,\quad b=504
    解释

    设定示例数值。

    步骤依据

    代码中声明这两个常量。

    视频直接表达
  2. 公式
    gcd⁡(24,504)\gcd(24,504)
    解释

    调用最大公约数函数计算示例值。

    步骤依据

    代码写 `cout << gcd(a, b) << endl;`。

    视频直接表达
  3. 公式
    2424
    解释

    程序输出结果为 24。

    步骤依据

    终端显示 `24`,讲解者也口头确认。

    视频直接表达
结论

示例数值 a=24,b=504a=24, b=504 时,视频通过程序输出验证 gcd⁡(24,504)=24\gcd(24,504)=24。

用枚举 k 的代码验证 gcd 递推不变性

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码第6-12行:`const int a=24a = 24; const int b=504b = 504; const int c = gcd(a, b); for (int k=−1024k=-1024; k<=1024; ++k) { if (c != gcd(b, a−k∗ba - k * b)) { cout << k << endl; } }`

  2. 图示
    观察依据

    终端第31-33秒显示编译运行后输出 `**********`,没有输出任何 kk 值

  3. 声音
    观察依据

    讲解者说“你会发现啊,这个程序是不是只输出了一堆星号”“也就是说对于任意的 kk,gcd a b 等于 gcd b a 减 kk 倍的 bb,总是成立的”

待核验内容
  1. 代码中 `#define int int64_t` 将 `int` 重定义为 64 位整数,但视频未解释其对示例数值范围的影响

数值验证
步骤
  1. 公式
    a=24, b=504, c=gcd⁡(a,b)a=24,\ b=504,\ c=\gcd(a,b)
    解释

    代码先固定 a=24a=24、b=504b=504,并把 gcd⁡(a,b)\gcd(a,b) 存入变量 cc。

    步骤依据

    视频代码第6-8行直接给出。

    视频直接表达
  2. 公式
    for k=−1024,−1023,…,1024: check c≠gcd⁡(b,a−kb)\text{for }k=-1024,-1023,\ldots,1024:\ \text{check } c\neq \gcd(b,a-kb)
    解释

    程序遍历整数 kk 从 -1024 到 1024,检查 gcd⁡(a,b)\gcd(a,b) 是否不等于 gcd⁡(b,a−kb)\gcd(b,a-kb)。

    步骤依据

    视频代码第10-11行直接给出。

    视频直接表达
  3. 公式
    output only ∗∗∗∗∗∗∗∗∗∗\text{output only } **********
    解释

    运行结果没有出现任何满足 `c != gcd(b, a−k∗ba - k * b)` 的 kk,只输出循环结束后的星号标记。

    步骤依据

    终端第31-33秒显示输出为 `**********`。

    视频直接表达
  4. 公式
    gcd⁡(24,504)=gcd⁡(504,24−k⋅504) for tested k\gcd(24,504)=\gcd(504,24-k\cdot 504)\ \text{for tested } k
    解释

    由测试范围内未找到反例,讲解者据此说明该递推等式对任意整数 kk 成立。

    步骤依据

    讲解者在第39-48秒总结“对于任意的 kk……总是成立的”。

    视频直接表达
结论

代码枚举验证支持 gcd⁡(a,b)=gcd⁡(b,a−kb)\gcd(a,b)=\gcd(b,a-kb) 在测试范围内无反例,讲解者将其推广为任意整数 kk 下成立。

由一般递推公式代入 k=1k=1 得到更相减损术

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1节 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b);第1.1节“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)”

  2. 声音
    观察依据

    讲解者说“比如说 kk 等于 1 的时候,我们就得到 gcd a b 等于 gcd b a 减 b,这就是大名鼎鼎的更相减损术”

严格证明
步骤
  1. 公式
    gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)
    解释

    从视频给出的一般递推公式出发。

    步骤依据

    讲义第1节公式。

    视频直接表达
  2. 公式
    k=1k=1
    解释

    令参数 kk 取 1。

    步骤依据

    讲义第1.1节“令 k=1k=1”。

    视频直接表达
  3. 公式
    gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)
    解释

    代入后得到更相减损术形式。

    步骤依据

    将 k=1k=1 代入 a−kba-kb 得 a−ba-b。

    依据视频推导
结论

更相减损术 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b) 是一般递推公式在 k=1k=1 时的特例。

由一般递推公式代入 k=⌊a/ba/b⌋ 得到辗转相除法

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1节 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b);第1.2节“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)”

  2. 声音
    观察依据

    讲解者说“aa 除以 bb 下下去整就是 aa 除以 bb 的商”“被除数减去商乘以除数就等于余数”

  3. 动画
    观察依据

    第99-107秒在公式 a−k⋅ba-k\cdot b 上方手写标注 a−⌊a/b⌋ba-\lfloor a/b\rfloor b,随后指向 a mod ba\bmod b

待核验内容
  1. 视频未明确说明 b≠0b\neq 0 这一除法前提

严格证明
步骤
  1. 公式
    gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)
    解释

    从视频给出的一般递推公式出发。

    步骤依据

    讲义第1节公式。

    视频直接表达
  2. 公式
    k=⌊a/b⌋k=\lfloor a/b\rfloor
    解释

    令参数 kk 取 aa 除以 bb 向下取整,即商。

    步骤依据

    讲义第1.2节“令 k=⌊a/b⌋k=\lfloor a/b\rfloor”;讲解者称其为“aa 除以 bb 的商”。

    视频直接表达
  3. 公式
    a−k⋅b=a−⌊a/b⌋ba-k\cdot b=a-\lfloor a/b\rfloor b
    解释

    把 k=⌊a/b⌋k=\lfloor a/b\rfloor 代入第二参数。

    步骤依据

    代数代入。

    依据视频推导
  4. 公式
    a−⌊a/b⌋b=a mod ba-\lfloor a/b\rfloor b=a\bmod b
    解释

    讲解者说明被除数减去商乘以除数等于余数。

    步骤依据

    讲解者第107-112秒口述“被除数减去商乘以除数就等于余数”。

    视频直接表达
  5. 公式
    gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)
    解释

    得到辗转相除法形式。

    步骤依据

    讲义第1.2节公式。

    视频直接表达
结论

辗转相除法 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b) 是一般递推公式在 k=⌊a/b⌋k=\lfloor a/b\rfloor 时的特例。

例题详解 · 2

用 C++ 计算 gcd(24,504)

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码中 `const int a=24a = 24;`、`const int b=504b = 504;`、`cout << gcd(a, b) << endl;`。

  2. 公式
    观察依据

    终端输出 `24`。

  3. 声音
    观察依据

    讲解者说“比如说我们举一个例子”“令整数 aa 等于……24”“令整数 bb 等于……504”“算出来等于 24 啊”。

题目

给定两个整数 a=24a=24、b=504b=504,求它们的最大公约数。

已知条件
  1. a=24a=24。

  2. b=504b=504。

  3. 使用 C++ 代码调用 `gcd(a,b)`。

目标

计算 gcd⁡(24,504)\gcd(24,504) 并输出结果。

步骤
  1. 公式
    constinta=24;const int a = 24;
    解释

    在代码中声明第一个整数。

    步骤依据

    画面可见代码行。

    视频直接表达
  2. 公式
    constintb=504;const int b = 504;
    解释

    在代码中声明第二个整数。

    步骤依据

    画面可见代码行。

    视频直接表达
  3. 公式
    cout<<gcd(a,b)<<endl;cout << gcd(a, b) << endl;
    解释

    调用 `gcd` 函数并输出结果。

    步骤依据

    画面可见代码行;讲解者说明直接使用 C++ 自带的 `gcd` 函数。

    视频直接表达
  4. 公式
    2424
    解释

    终端显示程序输出。

    步骤依据

    画面终端区域显示 `24`。

    视频直接表达
结果

gcd⁡(24,504)=24\gcd(24,504)=24。

检验

视频通过运行 C++ 程序并在终端输出 24 来验证结果。

代码示例:枚举 k 检验 gcd(24,504) 的不变性

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码第6-15行完整可见:`const int a=24a = 24; const int b=504b = 504; const int c = gcd(a, b); for (int k=−1024k=-1024; k<=1024; ++k) { if (c != gcd(b, a−k∗ba - k * b)) { cout << k << endl; } } cout << "**********" << endl;`

  2. 图示
    观察依据

    终端第31-33秒显示 `$ g++ag++ a.cpp && ./a.out` 后输出 `**********`

  3. 声音
    观察依据

    讲解者说“你会发现啊,这个程序是不是只输出了一堆星号”

待核验内容
  1. 视频未展示 `gcd` 函数的实现,只展示调用结果

题目

给定 a=24a=24、b=504b=504,令 c=gcd⁡(a,b)c=\gcd(a,b),遍历整数 kk 从 -1024 到 1024,检查是否存在 c≠gcd⁡(b,a−kb)c\neq\gcd(b,a-kb)。

已知条件
  1. a=24a=24

  2. b=504b=504

  3. c=gcd⁡(a,b)c=\gcd(a,b)

  4. k∈[−1024,1024]k\in[-1024,1024]

目标

判断测试范围内是否有 kk 使 gcd⁡(a,b)≠gcd⁡(b,a−kb)\gcd(a,b)\neq\gcd(b,a-kb)。

步骤
  1. 公式
    c=gcd⁡(24,504)c=\gcd(24,504)
    解释

    先计算并保存 gcd⁡(a,b)\gcd(a,b)。

    步骤依据

    代码第8行 `const int c = gcd(a, b);`。

    视频直接表达
  2. 公式
    for k=−1024 to 1024: if (c≠gcd⁡(504,24−k⋅504)) print k\text{for }k=-1024\text{ to }1024:\ \text{if }(c\neq\gcd(504,24-k\cdot 504))\ \text{print }k
    解释

    对每个整数 kk 检查等式是否失败,若失败则输出 kk。

    步骤依据

    代码第10-12行。

    视频直接表达
  3. 公式
    print ∗∗∗∗∗∗∗∗∗∗\text{print }**********
    解释

    循环结束后输出星号标记,表示程序运行完成。

    步骤依据

    代码第15行;讲解者说“为了标称我整个程序已经运行完了,我们最后输出一堆星号”。

    视频直接表达
  4. 公式
    terminal output: ∗∗∗∗∗∗∗∗∗∗\text{terminal output: }**********
    解释

    实际终端只显示星号,没有显示任何 kk。

    步骤依据

    终端第31-33秒输出。

    视频直接表达
结果

在 k=−1024,−1023,…,1024k=-1024,-1023,\ldots,1024 的测试范围内没有发现反例,程序只输出 `**********`。

检验

终端输出中没有任何 kk 值,只有循环结束标记 `**********`。

图示与动画 · 4

文档展示三个 gcd 公式

依据清楚
视频直接表达
来源依据
  1. 图示
    观察依据

    画面为深色背景的文档页面,标题为“两个数的最大公约数的递推公式”。

  2. 图示
    观察依据

    页面依次显示核心公式、1.1 更相减损术、1.2 辗转相除法。

  3. 动画
    观察依据

    鼠标在公式附近移动并选中部分文本。

图中对象
  1. 标题“两个数的最大公约数的递推公式”。

  2. 公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)。

  3. 小节“1.1 更相减损术”。

  4. 公式 gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)。

  5. 小节“1.2 辗转相除法”。

  6. 公式 gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)。

变化过程
  1. 讲解者从总公式讲到两个特例。

  2. 鼠标在公式周围指示文本。

不变量
  1. 三个公式均以 gcd⁡\gcd 为对象。

  2. 文档结构保持为总公式加两个小节。

数学含义

画面把更相减损术和辗转相除法都呈现为同一个整数 kk 递推公式的特例。

代码编辑器演示 gcd 调用

依据清楚
视频直接表达
来源依据
  1. 图示
    观察依据

    画面切换到代码编辑器,显示 C++ 程序。

  2. 图示
    观察依据

    代码包含 `#include <bits/stdc++.h>`、`using namespace std;`、`signed main()`、`const int a=24a = 24;`、`const int b=504b = 504;`、`cout << gcd(a, b) << endl;`。

  3. 图示
    观察依据

    右侧终端显示编译命令和输出 `24`。

  4. 动画
    观察依据

    讲解者在编辑器中输入代码、运行程序,并继续添加 `const int c = gcd(a, b);` 与 `for (int k=−1024k=-1024;k<=1024;++k)`。

待核验内容
  1. 终端中曾出现一次 `g++ aa.cpp` 的文件名错误提示,随后改为 `g++ag++ a.cpp && ./a.out`;该细节不影响 gcd 示例结果。

图中对象
  1. C++ 源代码编辑区。

  2. 终端输出区。

  3. 变量 `a`、`b`、`c` 和循环变量 `k`。

  4. 函数调用 `gcd(a, b)`。

变化过程
  1. 代码从无输出语句变为调用 `gcd(a,b)`。

  2. 终端从空或报错状态变为输出 `24`。

  3. 后续新增变量 `c` 和循环 `for (int k=−1024k=-1024;k<=1024;++k)`。

不变量
  1. 示例数值始终为 a=24a=24、b=504b=504。

  2. 核心演示对象是 `gcd(a,b)` 的计算。

数学含义

画面用实际程序运行验证 gcd⁡(24,504)=24\gcd(24,504)=24,并开始把抽象参数 kk 转化为可枚举的整数循环。

代码编辑与终端运行过程

依据清楚
视频直接表达
来源依据
  1. 图示
    观察依据

    左侧 VS Code 编辑器显示 C++ 代码;右侧终端显示 `$ g++ag++ a.cpp && ./a.out` 及输出 `**********`

  2. 动画
    观察依据

    第0-26秒代码逐步补全:先出现 `gcd(b, a−k∗ba-k*b)`,再包入 `if (c != ...)`,随后加入 `cout << k << endl;`,最后加入 `cout << "**********" << endl;`

图中对象
  1. VS Code 代码编辑器

  2. 终端窗口

  3. C++ 代码

  4. 编译命令

  5. 程序输出

变化过程
  1. 代码从含语法错误的 `gcd(b, a−k∗ba-k*b)` 补全为 `if (c != gcd(b, a−k∗ba - k * b))`

  2. 循环体加入 `cout << k << endl;`

  3. 程序末尾加入 `cout << "**********" << endl;`

  4. 终端从旧输出 `24` 变为重新编译后的 `**********`

不变量
  1. 变量 a=24a=24、b=504b=504 保持不变

  2. 循环范围 k=−1024k=-1024 到 10241024 保持不变

数学含义

画面通过枚举 kk 并只在等式失败时输出 kk,用终端只输出星号来展示测试范围内没有反例。

讲义页面与手写推导标注

依据清楚
视频直接表达
来源依据
  1. 图示
    观察依据

    第48秒切换到黑底白字讲义,标题“1 两个数的最大公约数的递推公式”,正文“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”

  2. 图示
    观察依据

    第69秒后可见第1.1节“更相减损术”和第1.2节“辗转相除法”及其公式

  3. 动画
    观察依据

    第99-107秒在 a−k⋅ba-k\cdot b 上方手写粉色标注 a−⌊a/b⌋ba-\lfloor a/b\rfloor b,并用箭头指向下方 a mod ba\bmod b

图中对象
  1. 讲义标题

  2. 一般递推公式

  3. 更相减损术小节

  4. 辗转相除法小节

  5. 粉色手写标注

  6. 箭头

变化过程
  1. 页面从代码环境切换到讲义

  2. 讲解者用粉色笔在一般公式的第二参数上写出 a−⌊a/b⌋ba-\lfloor a/b\rfloor b

  3. 箭头把该表达式与 a mod ba\bmod b 联系起来

不变量
  1. 一般公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b) 始终作为母公式出现

  2. 两个特例分别对应 k=1k=1 和 k=⌊a/b⌋k=\lfloor a/b\rfloor

数学含义

视觉标注把一般递推式中的 a−kba-kb 具体化为余数 a mod ba\bmod b,说明辗转相除法是一般公式的代入特例。

易错点 · 2

误以为考试环境一定能直接用 gcd 函数

依据清楚
视频直接表达
来源依据
  1. 声音
    观察依据

    讲解者说“我这里直接用了 gcd 这个函数,那是因为我的 C++ 的版本啊现在比较新啊,所以它自带了 gcd 这个函数”。

  2. 声音
    观察依据

    讲解者接着说“但是你考试的时候那个 C++ 编译器的版本不一定有这么新啊,所以你考试的时候那个 gcd 这个函数也要自己实现的啊”。

误区

看到演示中直接调用 `gcd(a,b)` 就认为所有 C++ 考试环境都能使用该函数。

说明

视频明确提醒演示环境 C++ 版本较新,考试编译器版本可能较旧,届时需要自行实现 `gcd`。

误以为没有数字输出代表程序没有执行检查

依据清楚
视频直接表达
来源依据
  1. 声音
    观察依据

    讲解者说“你会发现啊,这个程序是不是只输出了一堆星号,对吧?能明白,也就是说对于任意的 kk,gcd a b 等于 gcd b a 减 kk 倍的 bb,总是成立的”

  2. 图示
    观察依据

    终端只显示 `**********`,没有显示任何 kk

误区

看到终端只输出星号,可能误以为程序没有进行 gcd 比较。

说明

视频代码设计为只有当 `c != gcd(b, a−k∗ba - k * b)` 时才输出对应 kk;没有输出 kk 而只输出末尾星号,表示测试范围内未发现反例。

概念关系 · 7

两个数最大公约数的递推公式 → 更相减损术

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档先给出核心公式,再写“令 k=1k=1,就得到更相减损术”。

特例
解释

更相减损术是核心递推公式取 k=1k=1 的特例。

两个数最大公约数的递推公式 → 辗转相除法

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档先给出核心公式,再写“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法”。

特例
解释

辗转相除法是核心递推公式取 k=⌊a/b⌋k=\lfloor a/b\rfloor 的特例。

两个数最大公约数的递推公式 → 用 C++ 计算 gcd(24,504)

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码调用 `gcd(a,b)` 计算示例值。

  2. 声音
    观察依据

    讲解者先讲 gcd 递推公式,随后举例计算 a=24,b=504a=24,b=504。

待核验内容
  1. 视频未展示手工套用递推公式的完整过程,而是用库函数直接计算。

应用
解释

示例用具体数值演示最大公约数计算,呼应前面关于 gcd 公式的主题。

C++ 中可直接调用 gcd 函数 → 两个数最大公约数的递推公式

依据清楚
视频直接表达
来源依据
  1. 声音
    观察依据

    讲解者说演示环境可直接用 `gcd`,但考试时可能要自己实现。

对比
解释

视频把“直接调用现成 `gcd` 函数”和“需要理解并自行实现 gcd 递推方法”作对比。

两个数的最大公约数的递推公式 → 更相减损术作为递推公式的特例

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1节一般公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b);第1.1节“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)”

特例
解释

更相减损术是递推公式在 k=1k=1 时的特例。

两个数的最大公约数的递推公式 → 辗转相除法作为递推公式的特例

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1节一般公式 gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b);第1.2节“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)”

特例
解释

辗转相除法是递推公式在 k=⌊a/b⌋k=\lfloor a/b\rfloor 时的特例。

代码示例:枚举 k 检验 gcd(24,504) 的不变性 → 任意整数 k 下最大公约数保持不变

依据清楚
视频直接表达
来源依据
  1. 图示
    观察依据

    代码枚举 kk 并检查 `c != gcd(b, a−k∗ba - k * b)`;终端只输出 `**********`

  2. 声音
    观察依据

    讲解者由“只输出了一堆星号”推出“对于任意的 kk……总是成立的”

待核验内容
  1. 代码只验证有限范围 k∈[−1024,1024]k\in[-1024,1024],讲解者口头推广到任意整数 kk

应用
解释

代码示例用于支持任意整数 kk 下 gcd 不变性的命题。

问题定位 · 9

两个数的最大公约数的递推公式是什么?

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档标题和核心公式均可见。

涉及知识点
  1. 两个数最大公约数的递推公式

更相减损术怎样从 gcd 递推公式得到?

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档写“令 k=1k=1,就得到更相减损术”。

涉及知识点
  1. 两个数最大公约数的递推公式
  2. 更相减损术
  3. 由核心公式得到更相减损术

辗转相除法和 gcd 递推公式有什么关系?

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    文档写“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法”。

涉及知识点
  1. 两个数最大公约数的递推公式
  2. 辗转相除法
  3. 由核心公式得到辗转相除法

gcd(24,504) 等于多少?

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    代码设置 `a=24a=24`、`b=504b=504`,终端输出 `24`。

涉及知识点
  1. 用 C++ 计算 gcd(24,504)
  2. 示例中 gcd(24,504) 的值
  3. 数值验证 gcd(24,504)=24

为什么视频里可以直接调用 gcd 函数,考试时还可能需要自己写?

依据清楚
视频直接表达
来源依据
  1. 声音
    观察依据

    讲解者解释可直接用 `gcd` 是因为 C++ 版本较新,并提醒考试可能要自己实现。

涉及知识点
  1. C++ 中可直接调用 gcd 函数
  2. 误以为考试环境一定能直接用 gcd 函数

两个数的最大公约数的递推公式是什么?

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1节“对于任意整数 kk 都有:gcd⁡(a,b)=gcd⁡(b,a−k⋅b)\gcd(a,b)=\gcd(b,a-k\cdot b)”

涉及知识点
  1. 两个数的最大公约数的递推公式

为什么程序只输出星号就能说明 gcd 等式成立?

依据清楚
视频直接表达
来源依据
  1. 图示
    观察依据

    终端只输出 `**********`

  2. 声音
    观察依据

    讲解者解释“只输出了一堆星号”意味着没有 kk 使等式失败

涉及知识点
  1. 代码示例:枚举 k 检验 gcd(24,504) 的不变性
  2. 任意整数 k 下最大公约数保持不变
  3. 误以为没有数字输出代表程序没有执行检查

更相减损术怎样从 gcd 递推公式得到?

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1.1节“令 k=1k=1,就得到更相减损术:gcd⁡(a,b)=gcd⁡(b,a−b)\gcd(a,b)=\gcd(b,a-b)”

涉及知识点
  1. 更相减损术作为递推公式的特例
  2. 由一般递推公式代入 k=1k=1 得到更相减损术

为什么令 k=⌊a/ba/b⌋ 会得到辗转相除法?

依据清楚
视频直接表达
来源依据
  1. 公式
    观察依据

    讲义第1.2节“令 k=⌊a/b⌋k=\lfloor a/b\rfloor,就得到辗转相除法:gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a,b)=\gcd(b,a\bmod b)”

  2. 动画
    观察依据

    手写标注 a−⌊a/b⌋ba-\lfloor a/b\rfloor b 指向 a mod ba\bmod b

涉及知识点
  1. 辗转相除法作为递推公式的特例
  2. 由一般递推公式代入 k=⌊a/ba/b⌋ 得到辗转相除法
覆盖情况与待核验内容

已覆盖 · 文档画面与讲解覆盖核心 gcd 递推公式及其两个特例。

已覆盖 · 代码编辑器与终端演示 `gcd(24,504)` 的数值结果,并讨论 C++ 内置 `gcd` 的使用限制。

已覆盖 · 代码编写、编译运行和终端输出验证 gcd 递推不变性。

已覆盖 · 讲义展示两个数的最大公约数的递推公式。

已覆盖 · 讲义展示更相减损术作为 k=1k=1 的特例。

已覆盖 · 讲义和手写标注展示辗转相除法作为 k=⌊a/ba/b⌋ 的特例。

探索视频中的知识

打开视频知识图谱 →

  • 最大公约数 应用定位 0:38
    查看关联依据

    38 至 175 秒的 C++ 示例算出 gcd(24,504)=24,并对 -1024 到 1024 的整数 k 检验 gcd(504,24−k∗50424-k*504)。终端在该有限范围内未报告反例;公开审核材料明确说明有限测试不是一般证明。

  • 欧几里得算法 讲解定位 2:55
    查看关联依据

    175 至 254 秒先给出 gcd(a,b)=gcd(b,a-kb),令 k=1k=1 得更相减损术,再令 k=floor(a/ba/b),用手写箭头把 a-floor(a/ba/b)b 与 a mod b 对应起来,从而得到 gcd(a,b)=gcd(b,a mod b)。审核材料保留 b 非零及余数约定的缺失,因此归为讲解而非证明。