浅谈牛顿迭代

用途

求方程 \(f(x)=0\) 的数值近似根

可以:

  1. 求平方根、开高次根

  2. 多项式求逆、多项式开根(多项式牛顿迭代,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