数学、数论与组合 · HTML
数学 / 逻辑形态
gcd(a,b)=gcd(b,a mod b);lcm(a,b)=|a/gcd(a,b)*b|;ax+by 的可达整数恰为 gcd(a,b) 的倍数。
识别信号
- 要求最大公共单位
- 比例需化为规范形式
- 多个周期何时重合
- 整除分组或步长可达性
- 答案只依赖质因子交集
容易误判的相似信号
| Signal | Why it is different |
|---|
| 需要完整质因数指数 | GCD 只给公共因子汇总;需因子细节时做分解。 |
| 实数近似比例 | GCD 适用于精确整数,浮点应先定义误差模型。 |
核心不变量
欧几里得每步保持公约数集合不变,且第二参数严格变小直到 0。
状态、转移与处理顺序
| Item | Definition |
|---|
| State | 当前整数对 (a,b),以及归一化时的符号约定。 |
| Transition | 反复 (a,b)=(b,a%b);结束时 |a| 是 GCD。 |
| Frontier / order | 余数是尚未消去的公共因子信息,数值单调缩小。 |
Python 骨架
def gcd(a, b):
a, b = abs(a), abs(b)
while b:
a, b = b, a % b
return a
def lcm(a, b):
return 0 if a == 0 or b == 0 else abs(a // gcd(a,b) * b)
def normalize_ratio(x, y):
if y == 0: return (1 if x > 0 else -1 if x < 0 else 0, 0)
if y < 0: x, y = -x, -y
g = gcd(x, y)
return (x // g, y // g)
正确性思路
- 任一公约数同时整除 a、b,也整除 a-qb=a%b。
- 反过来整除 b 与余数的数也整除 a,所以公约数集合不变。
- 余数绝对值下降,算法终止于 (g,0)。
- 用 g 同除分子分母得到唯一规范比例(配合符号规则)。
复杂度
| Time | Space | Parameters |
|---|
| O(log min(|a|,|b|)) | O(1) | a、b 为整数;多值 GCD 可折叠处理 |
边界条件
- gcd(0,0) 常约定为 0
- 负数先取绝对值
- LCM 含 0 时为 0
- 先除后乘避免溢出
- 比例分母 0 需专门规范化
错误模式
| Pattern | Why it fails / fix |
|---|
| LCM 先相乘 | 可能溢出,应先除 gcd。 |
| 符号不统一 | 等价比例会变成不同键。 |
| 用除法判断浮点比例 | 精度与零分母会破坏等价性。 |
选择与排除规则
- 共同单位、整除步长、比例归一:先想 GCD。
- 需要所有因子或指数:质因数分解。
- 周期重合用 LCM,但注意范围与溢出。
- 哈希比例时固定分母为正并处理零向量。
相关模板
原创微型例子
| 环节 | 内容 |
|---|
| Result | 得到 (-2,3)。 |
| Scenario | 把方向向量 (-6,9) 规范化。 |
| Walkthrough | gcd(6,9)=3,同除并保持分母方向规则。 |
Recall prompts
我的补充