(MIT6.006) lecture12 数值-II

UTF8gbsn

本讲的内容也比较简单, 实际上自始至终就在讲 a \sqrt{a} a ,计算复杂度的问题.
那么这个计算复杂度怎么计算呢?回顾上一周的内容可知.

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f^{'}(x_n)} xn+1=xnf(xn)f(xn) 其中 f ( x ) = x 2 − a f(x)=x^2-a f(x)=x2a.
我们要想计算它, 那么最终的推导结构为 x n + 1 = x n + a / x n 2 x_{n+1}= \frac{x_n+a/x_n}{2} xn+1=2xn+a/xn

这个地方,我们可以发现有一个除法在这里.所以,
这个除法的复杂度要先考虑清除. 然后才可以谈 a \sqrt{a} a 的计算复杂度.

牛顿法的误差分析

假设 X n = a ( 1 + ϵ n ) X_n=\sqrt{a}(1+\epsilon_n) Xn=a (1+ϵn), 那么. X n + 1 = X n + a / X n 2 = a ( 1 + ϵ n ) + a a ( 1 + ϵ n ) 2 = ( a ) ( ( 1 + ϵ n ) + 1 ( 1 + ϵ n ) ) 2 = ( a ) ( 2 + 2 ϵ n + ϵ n 2 2 ( 1 + ϵ n ) ) = ( a ) ( 1 + ϵ n 2 2 ( 1 + ϵ n ) ) \begin{aligned} X_{n+1} &=\frac{X_{n}+a / X_{n}}{2} \\ &=\frac{\sqrt{a}\left(1+\epsilon_{n}\right)+\frac{a}{\sqrt{a}\left(1+\epsilon_{n}\right)}}{2} \\ &=\sqrt{(a)} \frac{\left(\left(1+\epsilon_{n}\right)+\frac{1}{\left(1+\epsilon_{n}\right)}\right)}{2} \\ &=\sqrt{(a)}\left(\frac{2+2 \epsilon_{n}+\epsilon_{n}^{2}}{2\left(1+\epsilon_{n}\right)}\right) \\ &=\sqrt{(a)}\left(1+\frac{\epsilon_{n}^{2}}{2\left(1+\epsilon_{n}\right)}\right) \end{aligned} Xn+1=2Xn+a/Xn=2a (1+ϵn)+a (1+ϵn)a=(a) 2((1+ϵn)+(1+ϵn)1)=(a) (2(1+ϵn)2+2ϵn+ϵn2)=(a) (1+2(1+ϵn)ϵn2)

最后可得,

ϵ n + 1 = ϵ n 2 2 ( 1 + ϵ n ) \epsilon_{n+1}=\frac{\epsilon_{n}^{2}}{2\left(1+\epsilon_{n}\right)} ϵn+1=2(1+ϵn)ϵn2

这个关系,告诉我们无法是按照平方收敛的. 其速度会非常快.

乘法的复杂度

d d d, 为两个整数的位数.

  • Naive Divide and Conquer method: Θ ( d 2 ) Θ(d^2) Θ(d2) time

  • Karatsuba
    Θ ( d log ⁡ 2 3 ) = Θ ( d 1.584 … ) \Theta\left(d^{\log _{2} 3}\right)=\Theta\left(d^{1.584 \ldots}\right) Θ(dlog23)=Θ(d1.584)

  • Toom-Cook generalizes Karatsuba (break into k ⩾ 2 k \geqslant 2 k2 parts )
    T ( d ) = 5 T ( d / 3 ) + Θ ( d ) = Θ ( d log ⁡ 3 5 ) = Θ ( d 1.465 … ) T(d)=5 T(d / 3)+\Theta(d)=\Theta\left(d^{\log _{3} 5}\right)=\Theta\left(d^{1.465 \ldots}\right) T(d)=5T(d/3)+Θ(d)=Θ(dlog35)=Θ(d1.465)

  • Schönhage-Strassen - almost linear! Θ ( d l g d l g l g d ) \Theta(dlgdlglgd) Θ(dlgdlglgd) using FFT.
    All of these are in gmpy package.

  • Furer (2007)
    Θ ( n log ⁡ n 2 O ( log ⁡ ∗ n ) ) \Theta\left(n \log n 2^{O\left(\log ^{*} n\right)}\right) Θ(nlogn2O(logn))

  • 2019 年有一篇文章也介绍到整数惩罚. 这篇文章叫做, Integer
    multiplication in time O ( n l o g n ) O(n log n) O(nlogn)

High Precision Divis

如何计算 a / b a/b a/b, 我们首先先到去计算 1 / b 1/b 1/b. 而 1 / b 1/b 1/b可以等于 R / b R/b R/b,
这个R是一个 2 n 2^n 2n,这样计算除了 R / b R/b R/b,
及很容易靠位移计算出 1 / b 1/b 1/b进而再次使用乘法计算出 a / b a/b a/b.

牛顿法 R / b R/b R/b

f ( x ) = 1 x − b R (  zero at  x = R b ) f ′ ( x ) = − 1 x 2 χ i + 1 = χ i − f ( χ i ) f ′ ( χ i ) = χ i − ( 1 χ i − b R ) − 1 / χ i 2 χ i + 1 = χ i + χ i 2 ( 1 χ i − b R ) = 2 χ i − b χ i 2 →  multiply  R →  easy div  \begin{aligned} f(x) &=\frac{1}{x}-\frac{b}{R} \quad\left(\text { zero at } x=\frac{R}{b}\right) \\ f^{\prime}(x) &=\frac{-1}{x^{2}} \\ \chi_{i+1} &=\chi_{i}-\frac{f\left(\chi_{i}\right)}{f^{\prime}\left(\chi_{i}\right)}=\chi_{i}-\frac{\left(\frac{1}{\chi_{i}}-\frac{b}{R}\right)}{-1 / \chi_{i}^{2}} \\ \chi_{i+1} &=\chi_{i}+\chi_{i}^{2}\left(\frac{1}{\chi_{i}}-\frac{b}{R}\right)=2 \chi_{i}-\frac{b \chi_{i}^{2} \rightarrow \text { multiply }}{R \rightarrow \text { easy div }} \end{aligned} f(x)f(x)χi+1χi+1=x1Rb( zero at x=bR)=x21=χif(χi)f(χi)=χi1/χi2(χi1Rb)=χi+χi2(χi1Rb)=2χiR easy div bχi2 multiply 

误差分析

χ i + 1 = 2 χ i − b χ i 2 R  Assume  χ i = R b ( 1 + ϵ i ) = 2 R b ( 1 + ϵ i ) − b R ( R b ) 2 ( 1 + ϵ i ) 2 = R b ( ( 2 + 2 ϵ i ) − ( 1 + 2 ϵ i + ϵ i 2 ) ) = R b ( 1 − ϵ i 2 ) = R b ( 1 + ϵ i + 1 )  where  ϵ i + 1 = − ϵ i 2 \begin{aligned} \chi_{i+1} &=2 \chi_{i}-\frac{b \chi_{i}^{2}}{R} \quad \text { Assume } \chi_{i}=\frac{R}{b}\left(1+\epsilon_{i}\right) \\ &=2 \frac{R}{b}\left(1+\epsilon_{i}\right)-\frac{b}{R}\left(\frac{R}{b}\right)^{2}\left(1+\epsilon_{i}\right)^{2} \\ &=\frac{R}{b}\left(\left(2+2 \epsilon_{i}\right)-\left(1+2 \epsilon_{i}+\epsilon_{i}^{2}\right)\right) \\ &=\frac{R}{b}\left(1-\epsilon_{i}^{2}\right)=\frac{R}{b}\left(1+\epsilon_{i+1}\right) \text { where } \epsilon_{i+1}=-\epsilon_{i}^{2} \end{aligned} χi+1=2χiRbχi2 Assume χi=bR(1+ϵi)=2bR(1+ϵi)Rb(bR)2(1+ϵi)2=bR((2+2ϵi)(1+2ϵi+ϵi2))=bR(1ϵi2)=bR(1+ϵi+1) where ϵi+1=ϵi2

由此可见除法的收敛速度也是平方的. 这个速度会很快.

a \sqrt{a} a 的计算复杂度

回顾 x n + 1 = x n + a / x n 2 x_{n+1}= \frac{x_n+a/x_n}{2} xn+1=2xn+a/xn,
这个公式告诉我们每次迭代需要计算一次除法,
但是每次除法的精度不一定都要达到预先想要的精度n, 可以慢慢提高计算精度.
也就是按照迭代的累计, 不断提高精度. 最后我们可以得到下面的式子.
最后可以得到计算精度实际上为 O ( d α ) O(d^{\alpha}) O(dα)

c ⋅ 1 α + c ⋅ 2 α + c ⋅ 4 α + ⋯ + c ⋅ ( d 4 ) α + c ⋅ ( d 2 ) α + c ⋅ d α < 2 c ⋅ d α c \cdot 1^{\alpha}+c \cdot 2^{\alpha}+c \cdot 4^{\alpha}+\cdots+c \cdot\left(\frac{d}{4}\right)^{\alpha}+c \cdot\left(\frac{d}{2}\right)^{\alpha}+c \cdot d^{\alpha}<2 c \cdot d^{\alpha} c1α+c2α+c4α++c(4d)α+c(2d)α+cdα<2cdα

floor 操作可行么?

对于下面的式子,
χ i + 1 = ⌊ χ i + ⌊ a / χ i ⌋ 2 ⌋ \chi_{i+1}=\left\lfloor\frac{\chi_{i}+\left\lfloor a / \chi_{i}\right\rfloor}{2}\right\rfloor χi+1=2χi+a/χi

我们稍作分析可得. χ i + 1 = χ i + a χ i − α 2 − β = χ i + a χ i 2 − γ  where  γ = α 2 + β  and  0 ≤ γ < 1 \begin{aligned} \chi_{i+1} &=\frac{\chi_{i}+\frac{a}{\chi_{i}}-\alpha}{2}-\beta \\ &=\frac{\chi_{i}+\frac{a}{\chi_{i}}}{2}-\gamma \quad \text { where } \gamma=\frac{\alpha}{2}+\beta \text { and } 0 \leq \gamma<1 \end{aligned} χi+1=2χi+χiaαβ=2χi+χiaγ where γ=2α+β and 0γ<1

因为, a + b 2 ≥ a b , χ i + a χ i 2 ≥ a \frac{a+b}{2} \geq \sqrt{a b}, \frac{\chi_{i}+\frac{a}{\chi_{i}}}{2} \geq \sqrt{a} 2a+bab ,2χi+χiaa ,
我们可得 x i + a / x i 2 − γ ⩾ ⌊ a ⌋ \frac{x_i+a/x_i}{2}-\gamma\geqslant \lfloor\sqrt{a}\rfloor 2xi+a/xiγa

只要 ϵ i < 1 \epsilon_i<1 ϵi<1, 这个算法始终会收敛.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值