# 数学归纳法(Mathematical Induction)

  • 归纳法的重要性:
    • 在分析程序的递归部分时,会使用到归纳法
    • 分析循环时,也会用到归纳法
  • 数学归纳法常用于证明某个的命题对于任意nn(通常是自然数)成立。
  • 数学归纳法的要素:
    • 归纳假设(Induction Hypothesis): 假设命题在n=kn=k时成立(为后面归纳步提供条件)
    • 归纳步(Inductive step): 即命题满足当n=kn=k时成立,那么n=k+1n=k+1时也成立
      • 这样可以得到nkn\geq k时命题均成立
    • 初始条件(Base case): 结合命题的初始条件,确定kk的初始值k0k_{0}
    • 由此可得命题在nk0n\geq k_{0}时均成立,即命题成立。

# 例1:平面染色问题

  • 将一个平面区域用nn条直线分割,证明:只需用两种颜色便可以把相邻区域区分开,即整个平面只需要用两个颜色划分区域。
    colormap
  • 证明:
    • 初始条件:当n=0n=0n=1n=1时,结论显然成立(n=0n=0时只要一个颜色,n=1n=1时一侧用一个颜色)
    • 归纳假设:假设命题在n=kn=k时成立(k1k\geq 1),下证n=k+1n=k+1时也成立
    • 归纳步骤:
      • n=kn=k时的染色图 kcolormap
      • 在图上加入第k+1k+1条直线 k+1-colormapb
      • 让直线一侧的区域颜色保持不变,让直线另一侧区域颜色取反 k+1-colormapa
      • 这样得到新的染色图,满足命题的要求(因为以新加的线为界的两个区域颜色不同,而以旧的线为界的两个区域已经满足颜色不同)
    • 证明完成。

# 加强归纳假设

  • 有时原始命题不太容易用数学归纳法证明,但如果将命题的条件加强,或许可以使证明更加容易,并且加强后的命题可以推得原始命题成立。

# 例2

  • 证明:对于任意n1n\geq 1,前nn个奇数之和是完全平方数。
    • 初始条件:当n=1n=1时,11是完全平方数,成立。
    • 归纳假设(原始):假设命题在n=kn=k时成立(k1k\geq 1),即前kk个奇数之和为完全平方数,设为m2m^2
    • 归纳步骤:
      • k+1k+1个奇数之和为m2+2k+1m^2+2k+1
  • 此时我们会发现似乎推进不下去了,我们无法证明m2+2k+1m^2+2k+1一定是完全平方数。
  • 于是我们换个思路,先试试前几个奇数的和,尝试寻找规律:
    • n=1n=1时,1=121=1^2
    • n=2n=2时,1+3=221+3=2^2
    • n=3n=3时,1+3+5=321+3+5=3^2
    • n=4n=4时,1+3+5+7=421+3+5+7=4^2
  • 我们惊喜地发现,似乎前nn个奇数的和恰好等于n2n^2!那么我们就可以重新确定命题:
  • 命题(加强):对于任意n1n\geq 1,前nn个奇数之和等于n2n^2
  • 证明:
    • 初始条件:当n=1n=1时,1=121=1^2,成立。
    • 归纳假设(加强):假设命题在n=kn=k时成立(k1k\geq 1),即前kk个奇数之和等于k2k^2
    • 归纳步骤:前k+1k+1个奇数之和为k2+2k+1=(k+1)2k^2+2k+1=(k+1)^2,故命题在n=k+1n=k+1时成立。
    • 证明完成。

# 例3

  • 证明:对于任意n1n\geq 1i=1n1i22\sum_{i=1}^n \frac{1}{i^2}\leq 2
    • 如果尝试直接使用数学归纳法:
      • 初始条件:当n=1n=1时,121\leq 2,成立。
      • 归纳假设:假设命题在n=kn=k时成立(k1k\geq 1),即i=1k1i22\sum_{i=1}^k \frac{1}{i^2}\leq 2
      • 归纳步骤:
        • i=1k+11i2=i=1k1i2+1(k+1)2\sum_{i=1}^{k+1} \frac{1}{i^2}=\sum_{i=1}^k\frac{1}{i^2}+ \frac{1}{(k+1)^2}
        • 但如果i=1k1i2>21(k+1)2\sum_{i=1}^k \frac{1}{i^2} >2-\frac{1}{(k+1)^2},那么i=1k+11i2>2\sum_{i=1}^{k+1} \frac{1}{i^2}>2,命题在n=k+1n=k+1时就不成立。
  • 如何规避上面的情况?我们需要加强一下命题:
  • 命题(加强):对于任意n1n\geq 1i=1n1i221n\sum_{i=1}^n \frac{1}{i^2}\leq 2-\frac{1}{n}
    • 证明:
      • 初始条件:当n=1n=1时,12111\leq 2-\frac{1}{1},成立。
      • 归纳假设:假设命题在n=kn=k时成立(k1k\geq 1),即i=1k1i221k\sum_{i=1}^k \frac{1}{i^2}\leq 2-\frac{1}{k}
      • 归纳步骤:
        • i=1k+11i2=i=1k1i2+1(k+1)221k+1(k+1)2\sum_{i=1}^{k+1} \frac{1}{i^2}=\sum_{i=1}^k\frac{1}{i^2}+ \frac{1}{(k+1)^2} \leq 2-\frac{1}{k}+\frac{1}{(k+1)^2},
        • 21k+1(k+1)2<21k+1k(k+1)=21k+12-\frac{1}{k}+\frac{1}{(k+1)^2}<2-\frac{1}{k}+\frac{1}{k(k+1)}=2-\frac{1}{k+1},故i=1k+11i221k+1\sum_{i=1}^{k+1} \frac{1}{i^2}\leq 2-\frac{1}{k+1},即命题在n=k+1n=k+1时成立。
      • 证明完成。

# 弱归纳 vs 强归纳(Simple Induction vs. Strong Induction)

  • 在原有数学归纳法(可称为弱归纳法)的基础上,稍作改动:
    • 初始条件和归纳步骤不变;
    • 归纳假设改为:假设n=1,2,,kn=1,2,\cdots,k时命题均成立(即i=0kP(k)\land_{i=0}^k P(k)为真)
    • 这样得到的归纳称为强归纳。
  • 本质上和弱归纳法没什么区别,但因为归纳假设条件更强,在证明一些命题时会有更高的效率
    • 其实这两种归纳法就是第一数学归纳法和第二数学归纳法

# 例4

  • 证明:任意大于11的整数nn都可以表示为一个或多个质数的乘积。
  • 设命题P(n)P(n)为:整数nn可以表示为一个或多个质数的乘积,下证n2n\geq 2P(n)P(n)均为真。
  • 证明:
    • 初始条件:n=2n=2时,22为质数,故P(2)P(2)为真。
    • 归纳假设:假设P(n)P(n)2nk2\leq n\leq k时均为真。
    • 归纳步骤:
      • 对于P(n+1)P(n+1),
        1. n+1n+1是质数,那么P(n+1)P(n+1)一定为真
        2. n+1n+1不是质数,那么它一定能分解为两个比它小的数的乘积,即n+1=xy(2x,y<n+1)n+1=xy (2\leq x,y <n+1)
        3. 又由归纳假设,P(x)P(x)P(y)P(y)均为真,故xyxy一定可以分为若干个质数的乘积,即P(n+1)P(n+1)为真。
    • 证明完成。
  • 注:我们会发现,如果只用弱归纳法,无法顺利推得命题成立(因为“P(x)P(x)P(y)P(y)均为真”这个条件无法直接得到)
  • 另一方面,我们也可以发现,如果将P(2)P(3)P(n)P(2)\land P(3)\land\cdots \land P(n)看作Q(n)Q(n),那么对Q(n)Q(n)的归纳就可以用弱归纳法了。(即弱归纳和强归纳等价)

# 归纳,递归,与编程(Recursion, programming and induction)

  • 归纳与递归之间有很紧密的联系,下面我们以两个例子说明:

# 例5:斐波那契数列(Fibonacci sequence)

  • 我们直接列出斐波那契数列F(n){F(n)}的递推式:
    • F(0)=0F(0)=0
    • F(1)=1F(1)=1
    • F(n)=F(n1)+F(n2)(n2)F(n)=F(n-1)+F(n-2) (n\geq 2)
  • 事实上,我们可以证明,当nn足够大时,F(n)F(n)会以指数级增长。
    • 具体来说,当n3n\geq 3时,F(n)2n12F(n)\geq 2^{\frac{n-1}{2}}.
    • 我们可以用数学归纳法证明:
      • n=3n=3时,F(3)=221F(3)=2\geq 2^1n=4n=4时,F(4)=21.5=22F(4)=2\geq 1.5=2\sqrt{2}
      • 假设n=k,k+1(k3)n=k,k+1 (k\geq 3)时均成立,那么F(k+2)=F(k)+F(k+1)2k12+2k2=2k12×(1+2)>2k12×2=2k+12F(k+2)=F(k)+F(k+1)\geq 2^{\frac{k-1}{2}}+2^{\frac{k}{2}}=2^{\frac{k-1}{2}}\times(1+\sqrt{2})>2^{\frac{k-1}{2}}\times 2=2^{\frac{k+1}{2}},故n=k+2n=k+2时成立。
      • 证明完成。
  • 下面我们尝试写一段计算斐波那契数列第nn项的递归程序:
def F(n):
  if (n==0): return 0
  elif (n==1): return 1
  else: return F(n-1) + F(n-2)
  • 可以用归纳法证明:以上程序的运行次数至少为F(n)F(n)的值!
  • 所以以上递归算法的效率很低,我们尝试进行一些改进(事实上,这是一个典型地将尾递归算法改为递推算法的例子):
def F_2(n):
  if (n==0): return 0
  if (n==1): return 1
  a = 1
  b = 0
  for k in range(2,n+1):
    temp = a
    a = a + b
    b = temp
  return a
  • 这次程序的运算次数降到了nn
  • 以在一个字典DD中查找一个特定的单词WW为例
  • 伪代码:
// 前提: W是需要查找的单词,而D是一个字典的一部分(至少有1页)
// 后置条件: 结果返回单词W的定义,或者返回“未找到W”
findWord(W,D){
  // 初始条件
  if (D恰好只有1页)
    直接在D中暴力搜索W;
    如果找到W,返回它的定义;否则返回“未找到W”;
  // 递归条件
  设W'为D中间页的第一个词;
  if (W在W'之前)
    return findWord(D的前半部分)
  else
    return findWord(D的后半部分)
}
  • 以下用强归纳法证明findWord()这个算法是合理的(即要么返回单词W的定义,要么就返回“未找到W”):
    • nnDD的页数,
    • 初始条件:n=1n=1,则由代码if (D恰好只有1页)部分可知符合要求;
    • 归纳假设:假设findWord()对任意1n1\leq n\leq `均合理;
    • 归纳步骤:
      • 我们需要证明n=k+1n=k+1findWord()合理;
      • 由代码设W'为D中间页的第一个词;及后面部分可知,W要么在W'的前半部分,要么在W'后半部分;
      • 此时D的页数变少(k\leq k),满足归纳假设,故能否返回合理的结果。
    • 证明完成。

# 错误的归纳法证明

  • 有时,错误的归纳证明会得到荒谬的结论。下面用一个经典的例子阐述(这个例子由著名数学家George Pólya提出)。

# 例7:所有马颜色相同?

  • 以下为数学归纳的过程:
    • 初始条件:设nn为马的数量,那么n=1n=1时,命题显然成立;
    • 归纳假设:n=kn=k时命题成立(即任意kk匹马颜色相同)
    • 归纳步骤:
      • k+1k+1匹马列为{h1,h2,,hk+1}\{h_{1},h_{2},\cdots,h_{k+1}\}
      • 那么由归纳假设,{h1,h2,,hk}\{h_{1},h_{2},\cdots,h_{k}\}{h2,h3,,hk+1}\{h_{2},h_{3},\cdots,h_{k+1}\} 两组马各自都有相同的颜色。
      • 而又因为{h2,h3,,hk}\{h_{2},h_{3},\cdots,h_{k}\}同时属于这两个集合,所以{h1,h2,,hk+1}\{h_{1},h_{2},\cdots,h_{k+1}\}颜色均相同,即n=k+1n=k+1时命题成立
    • 证明完成……了吗?
  • 问题出在哪?实际上,问题就出在初始条件的设定:
  • 我们只得到了n=1n=1是命题成立,但当n=2n=2时,{h1}\{h_{1}\}{h2}\{h_{2}\}中间就没有重叠部分,所以它们颜色可以不同。
  • 所以,在进行数学归纳法时,一定要确保命题推理的“多米诺骨牌”不要中断。

# 关于归纳法的补充

# 归纳法的源头:皮亚诺公理

  • 皮亚诺公理(peano's axioms)是由皮亚诺提出的一种自然数的公理化体系,用符号逻辑描述“自然数”的本质:
  • 形式如下(以00为第一个自然数):
    1. 00属于自然数;
    2. 对于每一个自然数nn,都存在一个后继数S(n)S(n),也是自然数;
    3. 00 不是任何数的后继数(n,S(n)0\forall n,S(n)\neq 0)
    4. 不同的数有不同的后继(mnS(m)S(n)m\neq n\Longrightarrow S(m)\neq S(n))
    5. 归纳公理(Induction Axiom):对于任意性质P(n)P(n),若P(0)P(0)成立,且对任意自然数kk,若P(k)P(k)成立则P(S(k))P(S(k))成立,那么对所有自然数nnP(n)P(n)都成立。
  • 可以看出,在这套公理体系下,数学归纳法被假定为自然数的基本性质。

# 归纳法原理的等价原理:最小数原理

  • 最小数原理(Well-ordering principle):任意非空自然数子集SNS\subseteq\mathbb{N}都存在最小元素。
  • 从最小数原理推导到数学归纳法:
    • P(n)P(n)为一个命题,满足P(0)P(0)成立,且对任意kkP(k)P(k)成立时,P(k+1)P(k+1)也成立。证明对所有nnP(n)P(n)成立。
    • 证明:
      • 假设命题不成立,即存在使P(n)P(n)不成立的自然数组成非空集合AA
      • 由最小数原理,AA存在最小元素mm
      • 因为P(0)P(0)成立,故m0m\neq 0,所以存在k=m1k=m-1
      • P(m)P(m)为最小的不成立命题,所以P(k)P(k)成立。由归纳假设,P(k+1)P(k+1)成立,即P(m)P(m)成立。
      • 推出矛盾,故AA为空集,即对所有nnP(n)P(n)均成立。
    • 证明完成。