牛顿迭代快速求解定义域为多项式的函数零点
牛顿迭代求解定义域为多项式的函数零点
(笔者习惯:\(f(x)\)表示函数,\(F(x),G(x)\)表示多项式)
前言
原来的牛顿迭代是通过在函数上不断作切线来快速求出一个多项式函数近似的零点
在编程竞赛中,计数类问题我们经常遇到一个(可能是无穷的)数列\(a_n\),\(a_n\)可以由他自己通过一定的转移得到
对于这类问题,把\(a_n\)视为一个多项式,相当于是用多项式之间的运算表示出它自己,如\(F(x)=G(x)F(x)^2+A(x)\)
这样的转移式子可以通过移项变成一个类似求函数零点的形式
本文所谈的问题是对于一个定义在多项式域上的函数(函数本身不需要是多项式),求出它的零点
当然零点也是一个多项式
即\(x\)可以是一个多项式\(F(x)\),并且函数的系数也可以是多项式\(A(x)\)
下面讲如何求出这个\(f(F(x))\)的零点
用途
对于一个定义域是多项式的函数\(f(F(x))\),求出它的零点
零点很有可能是一个无穷次数的多项式,所以我们只需要求它前\(n\)项的值
\(f(F(x))\)是一个关于\(F(x)\)的函数
如\(f(F(x))=F(x)^2-G(x)=0\)
这里我们必须分清楚的点是
1.方程的元是\(F(x)\)
2.\(G(x)\)是方程的常数项
所以为了便于区分,可以更好看得表示为\(f(z)=z^2-G\),其中\(z=F(x)\)
前置知识1
前置知识2(只需要会求逆就可以了)
牛顿迭代
由于求解的是前\(n\)项的值,所以考虑倍增
边界条件视具体情况而定
设已经求出了\(G(x)\)满足\(f(G(x))=0 \pmod {x^\frac{n}{2}}\)
(下文中由于\(F(x),G(x)\)太长,全部用\(F,G\)替换)
(会多项式求逆的人都知道)有\((F-G)^2=0 \pmod {x^n}\)
带入\(f(F)\)在\(G\)上的泰勒展开
\(\displaystyle f(F)=\sum_{i=0}^{\infty}\frac{f^{(i)}(G)}{i!}(F-G)^i\)
其中\(f^{(i)}\)表示\(f(x)\)的\(i\)阶导数
\(\because (F-G)^2=0 \pmod {x^n}\)
\(\therefore (F-G)^i=0 \pmod {x^n},i>1\)
\(\therefore f(F)=f(G)+f'(G)(F-G)=0\)
\(\therefore F=G-\cfrac{f(G)}{f'(G)}\) (可以直接背这个式子)
这个算法的复杂度取决于是否能快速求出\(f(G),f'(G)\)
一般出现的式子都可以\(O(n\log n)\)完成一次迭代,所以总复杂度也为\(O(n\log n)\)
应用:多项式exp,烷基计数 Loj6538 etc.