-- 空集求和为零 #check Finset.sum_empty -- Finset.sum_empty : ∑ x in ∅, f x = 0
-- 单元素集合 #check Finset.sum_singleton -- Finset.sum_singleton : ∑ x in {a}, f x = f a
-- 并集(不相交时) #check Finset.sum_union -- Finset.sum_union : Disjoint s t → ∑ x in s ∪ t, f x = ∑ x in s, f x + ∑ x in t, f x
-- 常数函数 #check Finset.sum_const -- Finset.sum_const : ∑ x in s, c = s.card • c
-- filter 分拆 #check Finset.sum_filter
对 range 求和
对 Finset.range n 的求和是最典型的场景:
1 2 3 4 5 6 7 8 9
open BigOperators
-- 前 n 个自然数之和 example (n : ℕ) : ∑ i in Finset.range n, i = n * (n - 1) / 2 := by induction n with | zero => simp | succ n ih => rw [Finset.sum_range_succ] omega
Finset.sum_range_succ 是关键引理:
1 2 3
#check Finset.sum_range_succ -- Finset.sum_range_succ : ∑ x in Finset.range (n + 1), f x = -- ∑ x in Finset.range n, f x + f n
组合恒等式的形式化证明
二项式系数之和
数学中有恒等式 ∑_{k=0}^{n} C(n,k) = 2^n,即 n 元集合的子集总数为 2^n。Mathlib 中的对应定理:
1 2 3 4
#check Finset.sum_pow_eq_pow_sum -- 可供参考的方向 #check Nat.sum_range_choose -- Nat.sum_range_choose : ∀ (n : ℕ), -- ∑ i in Finset.range (n + 1), n.choose i = 2 ^ n
下面手动验证小规模情形,同时展示 simp 和 norm_num 的协作:
1 2 3 4 5
open BigOperators Nat
example : ∑ i in Finset.range 4, (3).choose i = 2 ^ 3 := by simp [Finset.sum_range_succ, Nat.choose] norm_num
完整归纳证明版本:
1 2 3 4 5
open BigOperators
theorem sum_choose_eq_two_pow (n : ℕ) : ∑ i in Finset.range (n + 1), n.choose i = 2 ^ n := by exact Nat.sum_range_choose n
-- 前 n 个正整数的连乘即 n! example (n : ℕ) : ∏ i in Finset.range n, (i + 1) = n.factorial := by induction n with | zero => simp | succ n ih => rw [Finset.prod_range_succ, ih] ring
Finset.prod_range_succ 的结构与 sum_range_succ 对称:
1 2 3
#check Finset.prod_range_succ -- Finset.prod_range_succ : ∏ x in Finset.range (n + 1), f x = -- ∏ x in Finset.range n, f x * f n
Nat.Prime 与初等数论
Prime 的定义与基本引理
Mathlib4 中 Nat.Prime p 的定义等价于:p ≥ 2 且 p 的因子只有 1 和 p 自身。
1 2 3 4 5 6 7 8 9
#check Nat.Prime -- Nat.Prime : ℕ → Prop
-- 2 是素数 #check Nat.prime_def_lt_dvd -- 可以用 norm_num 直接验证小素数: example : Nat.Prime 2 := by norm_num example : Nat.Prime 17 := by norm_num example : Nat.Prime 97 := by norm_num
常用引理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- 素数大于等于 2 #check Nat.Prime.two_le -- Nat.Prime.two_le : Nat.Prime p → 2 ≤ p
-- 素数不等于 1 #check Nat.Prime.one_lt -- Nat.Prime.one_lt : Nat.Prime p → 1 < p
-- 素数整除乘积则整除某个因子 #check Nat.Prime.dvd_mul -- Nat.Prime.dvd_mul : Nat.Prime p → (p ∣ m * n ↔ p ∣ m ∨ p ∣ n)
-- ∑ i in Finset.range n, (2*i + 1) = n^2 theorem sum_odd_eq_sq (n : ℕ) : ∑ i in Finset.range n, (2 * i + 1) = n ^ 2 := by sorry -- 提示:对 n 归纳,使用 Finset.sum_range_succ 和 ring
证明 ∏ i in Finset.range n, (i + 1) = n!(Lean 4 中记作 n.factorial):
1 2 3 4 5
open BigOperators
theorem prod_succ_eq_factorial (n : ℕ) : ∏ i in Finset.range n, (i + 1) = n.factorial := by sorry -- 提示:归纳,使用 Finset.prod_range_succ,以及 Nat.factorial 的递归定义