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=xn−f′(xn)f(xn) 其中
f
(
x
)
=
x
2
−
a
f(x)=x^2-a
f(x)=x2−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
这个地方,我们可以发现有一个除法在这里.所以,
这个除法的复杂度要先考虑清除. 然后才可以谈
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 k⩾2 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(log∗n)) -
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=x1−Rb( zero at x=bR)=x2−1=χi−f′(χi)f(χi)=χi−−1/χi2(χi1−Rb)=χi+χi2(χi1−Rb)=2χi−R→ 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χi−Rbχ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} c⋅1α+c⋅2α+c⋅4α+⋯+c⋅(4d)α+c⋅(2d)α+c⋅dα<2c⋅dα
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+b≥ab,2χi+χia≥a,
我们可得
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, 这个算法始终会收敛.