用途
求方程 \(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\),迭代几次就非常接近平方根。
cpp
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