浅谈牛顿迭代
用途
求方程 \(f(x)=0\) 的数值近似根
可以:
-
求平方根、开高次根
-
多项式求逆、多项式开根(多项式牛顿迭代,NTT配套)
实数迭代
迭代公式:
\[x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}
\]
-
\(f'(x)\):\(f\) 的导数
-
给一个初值 \(x_0\),不断迭代直到收敛(相邻两次差值足够小)
例:求 \(\sqrt a\),即解方程 \(x^2-a=0\)
\(f(x)=x^2-a,\ f'(x)=2x\)
代入:
\[x_{n+1}=x_n-\frac{x_n^2-a}{2x_n}=\frac{x_n+\dfrac{a}{x_n}}{2}
\]
初值随便取,比如 \(x_0=a\),迭代几次就非常接近平方根。
double newton(double a){
double x=a;
for(int i=0;i<10;i++){
x=(x+a/x)/2;
}
return x;
}
多项式迭代
已知多项式 \(G\),求 \(F\) 满足:
\[G(F(x)) \equiv 0 \pmod{x^n} \]
迭代核心:
假设已经求出 \(F_0\) 满足
\(G(F_0)\equiv0\pmod{x^{\lceil n/2\rceil}}\)
泰勒展开得到迭代式:
\[F \equiv F_0-\frac{G(F_0)}{G'(F_0)} \pmod{x^n}
\]
多项式求逆
求 \(F\) 使得 \(F\cdot A \equiv 1 \pmod{x^n}\)
等价方程:\(G(F)=A\cdot F -1 =0\)
\(G'(F)=A\)
代入牛顿迭代:
\[F = F_0\cdot(2 - A\cdot F_0) \pmod{x^n}
\]
这就是多项式求逆的迭代公式。
多项式开根
求 \(F^2 \equiv A \pmod{x^n}\)
\(G(F)=F^2-A=0,\ G'(F)=2F\)
\[
F=\frac12\left(F_0+\frac{A}{F_0}\right)\pmod{x^n}
\]
伪代码
poly newton(n):
if n == 1: 边界
return 初值
F0 = newton(ceil(n/2))
F = F0 - G(F0)/G'(F0) mod x^n
return F

牛顿迭代
浙公网安备 33010602011771号