@算法 - [email protected] 牛顿迭代法的应用——多项式开方,对数,指数,三角与幂函数

目录

  • @0 - 参考资料@
  • @0.5 - 多项式平方根@
  • @1 - 牛顿迭代法@
    • @数学上的定义@
    • @对于多项式的定义@
  • @2 - 牛顿迭代的应用@
    • @重新推导 - 多项式逆元@
    • @重新推导 - 多项式平方根@
    • @多项式对数函数@
    • @多项式指数函数@
    • @多项式幂函数@
    • @多项式三角函数@
  • @3 - 一些参考代码@(留坑待填)
  • @4 - 算法应用@(留坑待填)

@0 - 参考资料@

Miskcoo‘s Space 的讲解

Picks 的讲解

@0.5 - 多项式平方根@

已知一个多项式 \(A(x)\),求一个多项式 \(F(x)\),使得 \(F^2(x) = A(x)\)。

我们仿照多项式求逆的方法,加上一个模数变成 \(F^2(x) = A(x) \mod x^n\)。

然后考虑倍增,假如我们已知:

\[F_0^2(x) \equiv A(x) \mod x^{\lceil\frac{n}{2}\rceil}\]

套路移项,得到:

\[F_0^2(x)-A(x) \equiv 0 \mod x^{\lceil\frac{n}{2}\rceil}\]

套路平方,得到:

\[F_0^4(x)-2F_0^2(x)A(x)+A^2(x) \equiv 0 \mod x^{n}\]

你看右边空荡荡的,心里肯定有点儿不爽对吧:

\[F_0^4(x)+2F_0^2(x)A(x)+A^2(x) \equiv 4F_0^2(x)A(x) \mod x^{n}\]

你看右边已经有个 \(A(x)\) 了,我们就再把 \(A(x)\) 单独孤立出来吧。

\[\dfrac{F_0^4(x)+2F_0^2(x)A(x)+A^2(x)}{4F_0^2(x)} \equiv A(x) \mod x^{n}\]

你看左边已经是一个平方式了哦~

我们令 \(F(x) = \dfrac{F_0^2(x)+A(x)}{2F_0(x)}\),则 \(F^2(x)\equiv A(x) \mod x^{n}\)。

然后就可以一路倍增上去了。边界情况下是一个模意义下的平方剩余。

这个多项式开方和多项式求逆之间有许多共通的思想,但有些地方是很具有构造性的。

但如果题目要我们求立方根呢?如果题目要我们解高次方程呢?我们这样推导肯定是不合适的。

我们是否可以找到一个通用的方法,对于这两个,甚至更多的问题都适用呢?

@1 - 牛顿迭代法@

@数学上的定义@

本节跟我们要讲的没有任何关系。

对于某一个函数 \(f(x)\) 与函数上某一个点 \((x_0, f(x_0))\),我们可以用过该点的函数切线解析式去近似地代替整个函数。

根据导函数的定义,过 \((x_0, f(x_0))\) 的函数切线解析式为 \(g(x) = f(x_0)+f‘(x_0)*(x-x_0)\)。则我们可以用 \(g(x)\) 去近似替代 \(f(x)\)。

假如 \(g(x)\) 的零点为 \(g(z)=0\)(\(z = x_0 - \frac{f(x_0)}{f‘(x_0)}\)),因为 \(g(x)\) 是 \(f(x)\) 的近似,所以也许 \(f(z) = 0\)。

但是这个概率非常的低。于是我们再选择 \((z,f(z))\) 进行迭代,求出 \((z,f(z))\) 对应的 \(g(x)\),重复十几二十百遍,应该就非常非常接近零点了。

然而……这个方法并不具有普适性,有些时候迭代会出现循环。但是对于多项式的相关操作,它的确是普适的。

根据泰勒展开

\[f(x)=f(x_0)+f‘(x_0)(x-x_0)+\dfrac{f‘‘(x_0)(x-x_0)^2}{2!}+\dots\]

我们只取前两项(因为它们是线性的),也可以得到上面的结果。

@对于多项式的定义@

总结多项式逆元与多项式开方,我们可以得到通用的一些东西。

对于一个自变量和因变量都是多项式的函数 \(G(F(x))\),我们要找到多项式 \(F_0(x)\),使得:

\[G(F_0(x))=0\]

当 \(G(F(x)) = A(x)*F(x) - 1\) 时相当于逆元,当 \(G(F(x)) = F^2(x)-A(x)\) 时相当于开方。

怎么弄呢?我们套路取模,转换为 \(G(F(x))\equiv 0\mod x^n\)。

再套路倍增,假如我们已知:

\[G(F_0(x))\equiv 0\mod x^{\lceil\frac{n}{2}\rceil}\]

将 \(G(F(x))\) 在 \(F_0(x)\) 处泰勒展开,得到:

\[G(F(x))\equiv G(F_0(x))+G‘(F_0(x))(F(x)-F_0(x))+\dfrac{G‘‘(F_0(x))(F(x)-F_0(x))^2}{2!}+\dots\mod x^n\]

因为在模意义下 \(G(F(x)) \equiv 0\mod x^{\lceil\frac{n}{2}\rceil}\) 只有唯一解,所以:

\[F(x)\equiv F_0(x)\mod x^{\lceil\frac{n}{2}\rceil}\]

然后套路移项 + 套路平方:

\[(F(x)-F_0(x))^2\equiv 0\mod x^n\]

因为泰勒展开第三项及其以后的项都含 \((F(x)-F_0(x))^2\),所以我们可以直接忽略。

又因为根据定义 \(G(F(x))\equiv 0\mod x^n\),故:

\[0\equiv G(F_0(x))+G‘(F_0(x))(F(x)-F_0(x))\mod x^n\]

变一下形:

\[F(x)\equiv F_0(x)-\dfrac{G(F_0(x))}{G‘(F_0(x))}\mod x^n\]

好的我们就可以倍增了。

@2 - 牛顿迭代的应用@

@重新推导 - 多项式逆元@

对于 \(G(F(x)) = A(x)*F(x) - 1\) ,求 \(G(F(x))\equiv 0\mod x^n\) 的 \(F(x)\)。

根据迭代式:

\[F(x)\equiv F_0(x)-\dfrac{G(F_0(x))}{G‘(F_0(x))}\equiv F_0(x)-\dfrac{A(x)*F_0(x) - 1}{A(x)}\mod x^n\]

根据严密的推导,我们可以得到:\(\dfrac{A(x)*F_0(x) - 1}{A(x)}\equiv F_0(x)(A(x)*F_0(x) - 1)\mod x^n\)

所以:

\[F(x)\equiv 2F_0(x)-A(x)*F_0^2(x)\mod x^n\]

时间复杂度 \(O(n\log n)\)。

@重新推导 - 多项式平方根@

对于 \(G(F(x)) = F^2(x)-A(x)\) ,求 \(G(F(x))\equiv 0\mod x^n\) 的 \(F(x)\)。

根据迭代式:

\[F(x)\equiv F_0(x)-\dfrac{G(F_0(x))}{G‘(F_0(x))}\equiv F_0(x)-\dfrac{F_0^2(x) - A(x)}{2F_0(x)}\mod x^n\]

稍微恒等变换一下,就可以得到我们上边那个公式。

时间复杂度 \(O(n\log n)\)。

@多项式对数函数@

这个其实和牛顿迭代没啥关系。。。

已知 \(F(x) \equiv \ln A(x)\mod x^n\) ,求 \(F(x)\)。

怎么去理解呢?其实它就是个泰勒展开:

\[\ln(1-P(x))=-P(x)-\frac{P(x)^2}{2}-\frac{P(x)^3}{3}-\dots\]

直接求不好做的,我们考虑两边求个导数:

\[F‘(x) \equiv \frac{1}{A(x)}\mod x^n\]

这样我们就可以顺利求出 \(F‘(x)\),再对 \(F‘(x)\) 积分一下就可以了。

但是不定积分的常数项?一般来说题目会保证 \(A(x)\) 的常数项为 1,根据泰勒展开可得 \(F(x)\) 的常数项为 0。

时间复杂度 \(O(n\log n)\)。

@多项式指数函数@

已知 \(F(x) \equiv e^{A(x)}\mod x^n\) ,求 \(F(x)\)。

如果我们求导是没啥用的,毕竟 \(e^x\) 的导数还是它自己。

我们考虑两边求对数:

\[\ln F(x) \equiv A(x)\mod x^n\]

然后记 \(G(F(x)) = \ln F(x)-A(x)\),于是又可以愉快地进行牛顿迭代啦。

\[F(x)\equiv F_0(x)-\dfrac{G(F_0(x))}{G‘(F_0(x))}\equiv F_0(x)-(\ln F_0- A(x))*F_0(x)\mod x^n\]

时间复杂度 \(O(n\log n)\)。

@多项式幂函数@

\[F^k(x)=(e^{\ln F(x)})^k=e^{k\ln F(x)}\]

时间复杂度 \(O(n\log n)\)。

@多项式三角函数@

\[e^{i*F(x)}=\cos F(x) + i*\sin F(x)\]

把运算改成支持复数的运算。

时间复杂度 \(O(n\log n)\)。

@3 - 一些参考代码@(留坑待填)

@4 - 算法应用@(留坑待填)

原文地址:https://www.cnblogs.com/Tiw-Air-OAO/p/10200363.html

时间: 2024-11-08 02:33:38

@算法 - [email protected] 牛顿迭代法的应用——多项式开方,对数,指数,三角与幂函数的相关文章

@算法 - [email protected] 后缀自动机

目录 @0 - 参考资料@ @0.5 - 引言@ @1 - what is [email protected] @自动机@ @DAWG@ @终点集合 [email protected] @后缀链接 与 parent 树@ @2 - how to build [email protected] @理论@ @代码@ @3 - where can it [email protected] @0 - 参考资料@ Menci's Blog 的讲解 陈立杰冬令营的课件 @0.5 - 引言@ 后缀自动机(Su

@算法 - [email protected] matrix - tree 定理(矩阵树定理)

目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 定理主体@ @证明 part - [email protected] @证明 part - [email protected] @证明 part - [email protected] @证明 part - 4@ @2 - 一些简单的推广@ @3 - 例题与应用@ @0 - 参考资料@ MoebiusMeow 的讲解(超喜欢这个博主的!) 网上找的另外一篇讲解 @0.5 - 你所需要了解的线性代数知识@ 什么是矩阵

@算法 - [email protected] 多项式的多点求值与快速插值

目录 @0 - 参考资料@ @1 - 多点求值@ @理论推导@ @参考代码@ @例题与应用@ @2 - 快速插值@ @理论推导@ @(不建议参考的)代码@ @例题与应用@(暂无) @0 - 参考资料@ Cyhlnj 的博客 @1 - 多点求值@ @理论推导@ 假设已知多项式 \(A(x)\),使用 FFT 可以将 \(A(w_n^0)\),\(A(w_n^1)\),...,\(A(w_n^{n-1})\) 的值在 \(O(n\log n)\) 的时间内快速求出. 那么问题来了,假如我现在要求解任

[Swift算法]巴比伦法(牛顿迭代法)求平方根

数学原理推导: f(X) = X2 - n   ---公式(1) n为要求平方根的数值 比如 要求100的平方根 n = 100; 所以问题就转换成了求f(X)的零点问题了 f(Xn)的导数就是Xn+1 的斜率 所以就有了公式 所以 Xn+1 = Xn - f(Xn)/f'(Xn) 代入 公式1 f(Xn)=X2  -n f'(Xn)=2X Xn+1 = Xn - (Xn2 - n) / (2Xn) = Xn - 1/2 (Xn-n / Xn) = 1 / 2 (Xn + n / Xn) Xn

@codechef - [email protected] Random Number Generator

目录 @[email protected] @[email protected] @part - [email protected] @part - [email protected] @part - [email protected] @accepted [email protected] @[email protected] @[email protected] 给定递推关系式:\[A_i=C_1A_{i-1} + C_2A_{i-2}+\dots+C_kA_{i-k}\] 并给定 \(A_

经典算法:牛顿迭代法求平方根

//牛顿迭代法求平方根 1 double mysqrt(double num) 2 { 3 double x = num/2; 4 double y = 0; 5 do{ 6 x = x/2+num/(2*x); 7 y = x*x-num; 8 if(y<0) y = -y; 9 } while(y>0.0001); 10 return x; 11 } 12 int main(int argc, char* argv[]) 13 { 14 printf("%.3f",my

C语言之基本算法25—牛顿迭代法求方程近似根

//牛顿迭代法! /* ============================================================ 题目:用牛顿迭代法求解3*x*x*x-2*x*x-16=0的近似解. ============================================================ */ #include<stdio.h> #include<math.h> #define E 1e-8 double hs(double x) {

C语言之基本算法11—牛顿迭代法求平方根

//迭代法 /* ================================================================== 题目:牛顿迭代法求a的平方根!迭代公式:Xn+1=(Xn+a/Xn)/2. ================================================================== */ #include<stdio.h> #include<math.h> main() { float a,x0,x1;

Atitit 迭代法&#160;&#160;“二分法”和“牛顿迭代法&#160;attilax总结

Atitit 迭代法  "二分法"和"牛顿迭代法 attilax总结 1.1. ."二分法"和"牛顿迭代法"属于近似迭代法1 1.2. 直接法(或者称为一次解法),即一次性的快速解决问题,1 1.3. 最常见的迭代法是"二分法 牛顿法.还包括以下算法1 1.4.  二分法(dichotomie)1 1.5. 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method