已发布·持续改进
Algorithm
最大公约数与最小公倍数、模运算与逆元、快速幂、埃拉托斯特尼筛法和 nCr mod p:算法中常用的数论工具。
数论研究整数的性质,尤其是整除和余数。在算法中,它意味着用欧几里得算法求最大公约数和最小公倍数,用模运算处理巨大的数值,并用扩展欧几里得算法或费马小定理求模逆元。再加上快速幂、埃拉托斯特尼筛法、质因数分解以及模素数意义下的组合数计算,就构成了一套完整的工具箱。
这些工具在编程面试和算法竞赛中频繁出现,典型说法是“输出答案对 10^9 + 7 取模的结果”。在实际系统中,它们是 RSA、Diffie-Hellman 等公钥密码、哈希函数、随机数生成器和校验码的基础。大多数算法的运行时间是对数级或接近线性的,理解原理之后,朴素方法永远算不完的计算可以在几毫秒内完成。
建议先手动推演模运算的性质和欧几里得算法,再亲自实现快速幂和筛法。之后学习模逆元和 nCr mod p;如果使用 C++ 或 Java,一定要练习处理乘法溢出和负数取模。同时熟悉 Python 的 pow(a, e, m)、math.gcd 等标准函数也很有帮助。
反复应用 gcd(a, b) = gcd(b, a mod b),在 O(log n) 时间内求出最大公约数;扩展版本还能同时求出满足 ax + by = gcd(a, b) 的系数。
加、减、乘运算都保持余数,因此每一步都取模以控制数值大小;除法则改为乘以模逆元。
把指数看作二进制,不断对底数平方并按位相乘,用约 log e 次而不是 e 次乘法计算 a^e mod m。
从 i × i 开始划掉每个素数的倍数,在 O(n log log n) 内找出 n 以内的全部素数;借助最小质因子表还能快速分解质因数。
gcd 用欧几里得算法求最大公约数,最小公倍数则由 a // gcd(a, b) * b 得到。mod_pow 是快速幂:逐位检查指数,反复平方和相乘;当模数是素数 p 时,a^(p-2) 就是 a 的模逆元。sieve 用埃拉托斯特尼筛法列出 30 以内的所有素数。把文件保存后运行 python number_theory.py 即可。
number_theory.py
import math
def gcd(a: int, b: int) -> int:
while b:
a, b = b, a % b
return a
def mod_pow(base: int, exp: int, mod: int) -> int:
result, base = 1 % mod, base % mod
while exp > 0:
if exp & 1:
result = result * base % mod
base = base * base % mod
exp >>= 1
return result
def sieve(n: int) -> list[int]:
is_prime = [False, False] + [True] * (n - 1)
for i in range(2, math.isqrt(n) + 1):
if is_prime[i]:
for j in range(i * i, n + 1, i):
is_prime[j] = False
return [i for i, p in enumerate(is_prime) if p]
MOD = 10**9 + 7
print(gcd(84, 36), 84 // gcd(84, 36) * 36) # 12 252
print(mod_pow(3, 200, 13)) # 9
print(mod_pow(3, MOD - 2, MOD)) # 333333336, the inverse of 3
print(sieve(30)) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
python number_theory.py共六章,带你从安装一步步了解 数学与数论 的核心概念。
在这里提问、分享经验,交流关于 数学与数论 的看法。
还没有讨论。来发起第一个吧。
0 条评论
登录 · 登录后即可发表评论。
来发表第一条评论吧。