文章目录
1. 幂乘问题
输入:
a为给定实数,n为自然数
输出:an
1.1 传统算法:顺序相乘
- a先与a相乘
- 结果再与a相乘
- …
- 共计相乘n-1次
an = (…(((a a)a)a)…)a
乘法次数:n - 1
1.2 分治算法:划分
简化:只用算出来一个n/2个a相乘,后面那一个n/2个a就不用算了
- 时间复杂度:
2. 幂乘算法的应用
Fibonacci数列:1, 1, 2, 3, …
增加 F0 = 0
2.1 问题:已知F0 = 0,F1 = 1,给定n,计算Fn
2.1.1 通常算法:
2.1.2 分治算法:
前导数学基础
用数学归纳法证明
- n = 1,左边 = 右边
- 假设对任意整数n成立
- 证明n = n + 1的时候成立
即证明
[ F n + 2 F n + 1 F n + 1 F n ] = [ 1 1 1 0 ] n + 1 \left[ \begin{matrix} F~n+2~ & F~n+1~\\ F~n+1 & F~n~ \end{matrix} \right] = \left[ \begin{matrix} 1 & 1\\ 1 & 0 \end{matrix} \right] ^{n+1} [F n+2 F n+1F n+1 F n ]=[1110]n+1
且
即 Fn+2 = Fn+1 ×1 + Fn × 1
即 Fn+2 = Fn+1 + Fn 成立 - 类似的,证明左边矩阵剩余三个元素
- 所以成立
- 这时原问题就可以转化为
即可简化算法