我对稳定的论点的变化感兴趣:
"(∑ i=1..k . i) = k*(k+1) div 2"
我们知道这是通过简单的归纳得出的,但直觉有些不同。查看此公式的一种方法是,如果将数字序列1..k的极值相加,则会得到
1+k = 2 + (k-1) = ...
然后您只需乘以正确的次数即可获得完整的总和。
我想重现此参数以显示以下不平等现象:
"(∑n = 1..k - 1. cmod (f (int n))) ≤ 2 * (∑n ≤ k div 2. cmod (f (int n)))"
在这里,我知道每cmod (f (int k - n)) = cmod (cnj (f n))
有n
。
您看到伊莎贝尔(Isabelle)证明这一点的优雅方式吗?
答案 0 :(得分:2)
以一种优雅的方式进行证明的技巧是认识到∑i=1..k. i
与∑i=1..k. k + 1 - i
相同,然后将其添加到原始总和中以使i
被取消。这是一个简单的重新索引参数:
lemma "(∑i=1..k. i :: nat) = k * (k + 1) div 2"
proof -
have "(∑i=1..k. i) = (∑i=1..k. k + 1 - i)"
by (rule sum.reindex_bij_witness[of _ "λi. k + 1 - i" "λi. k + 1 - i"]) auto
hence "2 * (∑i=1..k. i) = (∑i=1..k. i) + (∑i=1..k. k + 1 - i)"
by simp
also have "… = k * (k + 1)"
by (simp add: sum.distrib [symmetric])
finally show ?thesis by simp
qed
对于您提到的另一件事,我认为做到这一点的最佳方法是先将总和拆分为少于k div 2
的元素和其余元素。然后,您可以像上面的一样重新索引第二个总和。然后出现不平等部分,因为如果k
为奇数,您可能会在中间有一个多余的剩余元素,而必须将其丢弃。
证明重要部分的简要草图:
lemma
assumes "⋀i. f i ≥ 0"
shows "(∑i=1..<k. f (i::nat) :: real) = T"
proof -
(* Separate summation domain into two disjoint parts *)
have "(∑i=1..<k. f i) = (∑i∈{1..k div 2}∪{k div 2<..<k}. f i)"
by (intro sum.cong) auto
(* Pull sum apart *)
also have "… = (∑i∈{1..k div 2}. f i) + (∑i∈{k div 2<..<k}. f i)"
by (subst sum.union_disjoint) auto
(* Reindex the second sum *)
also have "(∑i∈{k div 2<..<k}. f i) = (∑i∈{1..<k - k div 2}. f (k - i))"
by (rule sum.reindex_bij_witness[of _ "λi. k - i" "λi. k - i"]) auto
(* Throw away the element in the middle if k is odd *)
also have "… ≤ (∑i∈{1..k div 2}. f (k - i))"
using assms by (intro sum_mono2) auto
finally have "(∑i=1..<k. f i) ≤ (∑i=1..k div 2. f i + f (k - i))"
by (simp add: sum.distrib)
弄清楚如何在Isabelle中惯用地进行这些求和运算需要一些经验。 sum.reindex_bij_witness
是一个非常有用的规则(如您所见)。 sum.mono_neutral_left/right
之类的东西也可以提供很多帮助。