多项式各种算法学习笔记

一、qt下载与安装 qt与qtcreator 的区别与联系 1、QT Creator只是一个集成的编译器,用于将源代码编译成可执行程序。 QT 是跨平台C++图形用户界面应用程序开发框架,可以简单理解成是一个开发包。 2、Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。 QT Creator 跨平台的 Qt IDE,Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集 ... 阅读详情

1.FFT(快速傅里叶变换)

1.前置技能

复数:
基本表示法及性质:

i = − 1 i=\sqrt{-1} i=1

i i i是虚数单位

1.坐标(代数)形式:
z = a + b i z=a+bi z=a+bi

当b为0是z为实数,当a为0时为纯虚数

注:复数包括实数和虚数,虚数下有纯虚数

虚数z对应了复平面上的一点(a,b)

运算法则:
设复数 z 1 , z 2 , z 1 = a + b i , z 2 = c + d i z_1,z_2,z_1=a+bi,z_2=c+di z1,z2,z1=a+bi,z2=c+di

加法: z 1 + z 2 = ( a + c ) + ( b + d ) i z_1+z_2=(a+c)+(b+d)i z1+z2=(a+c)+(b+d)i
减法: z 1 − z 2 = ( a − c ) + ( b − d ) i z_1-z_2=(a-c)+(b-d)i z1z2=(ac)+(bd)i
乘法: z 1 ∗ z 2 = ( a c − b d ) + ( b c + a d ) i z_1*z_2=(ac-bd)+(bc+ad)i z1z2=(acbd)+(bc+ad)i
除法: z 1 z 2 = ( a c + b d ) + ( b c − a d ) i ( c 2 + d 2 ) \dfrac{z_1}{z_2}=\dfrac{(ac+bd)+(bc-ad)i}{(c^2+d^2)} z2z1=(c2+d2)(ac+bd)+(bcad)i

2.三角形式

z = r ( c o s θ + i s i n θ ) z=r(cos \theta+isin\theta) z=r(cosθ+isinθ)

θ \theta θ是复数 z z z的幅角, r r r是该复数的模长

这种形式下的乘法和除法运算更方便,通过和角公式,对于复数 z 1 = r 1 ( c o s θ 1 + i s i n θ 1 ) , z 2 = r 2 ( c o s θ 2 + i s i n θ 2 ) z_1=r_1(cos\theta_1+isin\theta_1),z_2=r_2(cos\theta_2+isin\theta_2) z1=r1(cosθ1+isinθ1),z2=r2(cosθ2+isinθ2)
那么:
z 1 z 2 = r 1 r 2 ( c o s ( θ 1 + θ 2 ) + i s i n ( θ 1 + θ 2 ) ) z 1 z 2 = r 1 r 2 ( c o s ( θ 1 − θ 2 ) + i s i n ( θ 1 − θ 2 ) ) z_1z_2=r_1r_2(cos(\theta_1+\theta_2)+isin(\theta_1+\theta_2))\\ \dfrac{z_1}{z_2}=\dfrac{r_1}{r_2}(cos(\theta_1-\theta_2)+isin(\theta_1-\theta_2))\\ z1z2=r1r2(cos(θ1+θ2)+isin(θ1+θ2))z2z1=r2r1(cos(θ1θ2)+isin(θ1θ2))

几何意义:相当于把该复数 拉长/缩短 到另一个复数模长 倍/分之一 ,然后 顺时针/逆时针 旋转另一个复数的幅角大小的角度

于是有了如下非常有用的公式:
z n = ( r ( c o s θ + i s i n θ ) ) n = r n ( c o s   n θ + i s i n   n θ ) z^n=(r(cos\theta+isin\theta))^n=r^n(cos\ n\theta+isin\ n\theta) zn=(r(cosθ+isinθ))n=rn(cos nθ+isin nθ)

3.指数形式

z = r e i θ z=re^{i\theta} z=reiθ

于是我们知道了: e i θ = c o s θ + i s i n θ e^{i\theta}=cos\theta+isin\theta eiθ=cosθ+isinθ

可以发现: e i π = − 1 e^{i\pi}=-1 eiπ=1
(优美)

这个算乘除法就更好算了:
有:
z 1 z 2 = r 1 r 2 e i ( θ 1 + θ 2 ) z 1 z 2 = r 1 r 2 e i ( θ ) z_1z_2=r_1r_2e^{i(\theta_1+\theta_2)}\\ \dfrac{z_1}{z_2}=\dfrac{r_1}{r_2}e^{i(\theta)}\\ z1z2=r1r2ei(θ1+θ2)z2z1=r2r1ei(θ)

上面的那个公式就可写成这样:
z n = r n e i ( n θ ) z^n=r^ne^{i(n\theta)} zn=rnei(nθ)

4.单位复数根

学FFT最重要的就这个了吧
设有如下方程:
z n = 1 z^n=1 zn=1

这方程的复数根 z z z n n n次单位根,通常记为 w w w
这样的根 w w w有n个,也就是说 n n n次单位根有 n n n个,记为 w k ( k = 0 , 1 , 2 , … n − 1 ) w_k (k=0,1,2,\dots n-1) wk(k=0,1,2,n1)
其中:
w k = c o s 2 k π n + i s i n 2 k π n = e 2 π k i n w_k=cos\frac{2k\pi}{n}+isin\frac{2k\pi}{n}=e^{\frac{2\pi ki}{n}} wk=cosn2kπ+isinn2kπ=en2πki

不难发现其实 n n n次单位复数根就是把复平面上的单位圆 n n n 等分后的那些 n n n等分点

一些次数单位的单位根举例:

1次单位根: 1 1 1
2次单位根: 1 , − 1 1,-1 1,1
3次单位根: 1 , − 1 + 3 i 2 , − 1 − 3 i 2 1,\frac{-1+\sqrt{3}i}{2},\frac{-1-\sqrt{3}i}{2} 1,21+3 i,213 i
… \dots
其实就是个解二元n次方程

可以发现1是任意次的单位复数根,-1是任意偶数次单位复数根

某些引理:

1.消去引理
w d n d k = w n k w_{dn}^{dk}=w_n^k wdndk=wnk

把复数的指数形式带进去就可以了
说人话就是不同次数的单位根可以互相转化

2.折半引理
假设 n n n是大于0的偶数:
( w n k + n 2 ) 2 = w n 2 k + n = w n 2 k ∗ w n n = ( w n k ) 2 (w_n^{k+\frac{n}{2}})^2=w_n^{2k+n}=w_n^{2k}*w_n^n=(w_n^{k})^2 (wnk+2n)2=wn2k+n=wn2kwnn=(wnk)2

说人话就是n次单位复数根的前后两半平方后是对应相等的

3.求和引理

对于大于1的整数n和小于等于n的整数k有:
∑ i = 0 n − 1 ( w n k ) i = 0 \sum_{i=0}^{n-1}(w_n^k)^i=0 i=0n1(wnk)i=0

这就是个等比数列求和

2.步入正题

常规的一个最高次数为n-1的多项式的表示形式是系数表示法,如:
A ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + ⋯ + a n − 1 x n − 1 A(x)=a_0+a_1x+a_2x^2+a_3x^3+\dots+a_{n-1}x^{n-1} A(x)=a0+a1x+a2x2+a3x3++an1xn1
一共有n项
按照朴素的多项式乘法(卷积),就是每一项两两相乘,复杂度为 O ( n 2 ) O(n^2) O(n2)

如果我们把多项式看成一个函数,我们取图像上的n个点来表示这个函数也即该多项式,这样的表示法叫做点值表示法

对于两个n-1次多项式,由于我们最后卷积出来的多项式是2n-2次的,如果我们知道了卷积后的多项式函数图像上的至少2n-1个点,那么我们就可以确定这个多项式了

所以有如下想法:
现在原来的两个多项式上选取好x值相同的点(个数为原来两多项式次数的和加1),用 O ( n ) O(n) O(n)的时间将选的点的y值相乘,得到的值用某种方法~~(待定系数法)~~转化为多项式系数的形式

如果选取的x都是n次单位复数根的k次方,那么以上两个过程就是 D F T DFT DFT I D F T IDFT IDFT

1. D F T DFT DFT

离散傅里叶变换:
对于 k ∈ [ 0 , n − 1 ] , k\in [0,n-1], k[0,n1],和n-1次多项式 A ( x ) , A(x), A(x),定义:
y k = A ( w n k ) = ∑ i = 0 n − 1 a i ( w n k ) i y_k=A(w_n^k)=\sum_{i=0}^{n-1}a_i(w_n^k)^i yk=A(wnk)=i=0n1ai(wnk)i

这个叫做离散傅里叶变换,记做 y = D F T n ( a ) y=DFT_n(a) y=DFTn(a)

朴素求 D F T DFT DFT,是 O ( n 2 ) O(n^2) O(n2)

2. I D F T IDFT IDFT

逆离散傅里叶变换:

就是 D F T DFT DFT的逆运算,用于求出多项式的系数a,记为 D F T − 1 DFT^{-1} DFT1

本人太弱不会证,丢个式子:
a k = 1 n ∑ i = 0 n − 1 y i ( w n − k ) i a_k=\dfrac{1}{n}\sum_{i=0}^{n-1}y_i(w_n^{-k})^i ak=n1i=0n1yi(wnk)i

由于写的时候系数表达式和点值表达式是共用的数组,所以写起来和 D F T DFT DFT没什么差别

3. F F T FFT FFT

快速傅里叶变换:

是一种快速求出 D F T DFT DFT D F T − 1 DFT^{-1} DFT1的算法,利用了单位复数根的优良性质

我们先列出朴素求 D F T DFT DFT的步骤,为了方便这里先不妨假设多项式次数为2的幂:
1.求出n次单位复数根的幂: w n 0 , w n 1 , w n 2 . . . . . w n n − 1 w_n^0,w_n^1,w_n^2.....w_n^{n-1} wn0,wn1,wn2.....wnn1
2.代入多项式 A ( x ) A(x) A(x),求得以下式子:
A ( w n 0 ) = a 0 + a 1 w n 0 + a 2 ( w n 0 ) 2 + a 3 ( w n 0 ) 3 + … a n − 1 ( w n 0 ) n − 1 A ( w n 1 ) = a 0 + a 1 w n 1 + a 2 ( w n 1 ) 2 + a 3 ( w n 1 ) 3 + … a n − 1 ( w n 1 ) n − 1 A ( w n 2 ) = a 0 + a 1 w n 2 + a 2 ( w n 2 ) 2 + a 3 ( w n 2 ) 3 + … a n − 1 ( w n 2 ) n − 1 A ( w n 3 ) = a 0 + a 1 w n 3 + a 2 ( w n 3 ) 2 + a 3 ( w n 3 ) 3 + … a n − 1 ( w n 3 ) n − 1 … … … … … … … … … … … … … … … … … A ( w n n − 1 ) = a 0 + a 1 w n n − 1 + a 2 ( w n n − 1 ) 2 + a 3 ( w n n − 1 ) 3 + … a n − 1 ( w n n − 1 ) n − 1 A(w_n^0)=a_0+a_1w_n^0+a_2(w_n^0)^2+a_3(w_n^0)^3+\dots a_{n-1}(w_n^0)^{n-1}\\ A(w_n^1)=a_0+a_1w_n^1+a_2(w_n^1)^2+a_3(w_n^1)^3+\dots a_{n-1}(w_n^1)^{n-1}\\ A(w_n^2)=a_0+a_1w_n^2+a_2(w_n^2)^2+a_3(w_n^2)^3+\dots a_{n-1}(w_n^2)^{n-1}\\ A(w_n^3)=a_0+a_1w_n^3+a_2(w_n^3)^2+a_3(w_n^3)^3+\dots a_{n-1}(w_n^3)^{n-1}\\ \dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\dots\\ A(w_n^{n-1})=a_0+a_1w_n^{n-1}+a_2(w_n^{n-1})^2+a_3(w_n^{n-1})^3+\dots a_{n-1}(w_n^{n-1})^{n-1}\\ A(wn0)=a0+a1wn0+a2(wn0)2+a3(wn0)3+an1(wn0)n1A(wn1)=a0+a1wn1+a2(wn1)2+a3(wn1)3+an1(wn1)n1A(wn2)=a0+a1wn2+a2(wn2)2+a3(wn2)3+an1(wn2)n1A(wn3)=a0+a1wn3+a2(wn3)2+a3(wn3)3+an1(wn3)n1A(wnn1)=a0+a1wnn1+a2(wnn1)2+a3(wnn1)3+a

ADC(三)Guard ring的设计艺术:从单元到系统的隔离策略 本文深入探讨了ADC设计中Guard ring(保护环)从单元到系统的多层次隔离策略。文章分享了从新手到专家的认知升级过程,详细分析了在单元内部进行微隔离、在模块间建立噪声屏障以及在系统层面规划全局隔离带的实用方法与设计艺术,强调了Guard ring对于提升混合信号电路性能和可靠性的关键作用。 阅读详情

相关推荐

Android 16(API 36)状态栏颜色适配全攻略:从沉浸式到自定义背景

本文全面解析Android 16(API 36)强制沉浸式状态栏带来的适配挑战,提供了从FrameLayout包裹法到动态修改Window背景色的核心解决方案。针对传统状态栏颜色设置失效问题,详细阐述了如何利用WindowInsets API实现自定义背景,并涵盖全屏模式、Fragment切换及第三方ROM兼容性等实战场景,为开发者提供一站式适配指南。

weixin_29227425的博客 557

【总结】多项式相关的各种算法

多项式相关的各种算法

远行客 4867

Prometheus-2.53.1安装

Prometheus+Grafana安装

qlj062127的博客 1759

多项式算法

普通多项式 一般地,一元n次多项式的求值需要经过(n+1)*n/2次乘法和n次加法 double f1 (int n, double a[], double x) { int i; double p = a[0]; for ( i=1; i<=n; i++ ) p +=(a[i] * pow(x, i)); return p; } 时间复杂度为O(n^2) 秦九韶算法 秦九韶算...

Jason 1616

深入理解多项式求值的原理和意义

                                     多项式求值的原理和意义摘要:多项式是由多个单项(符号项如:5x或者常数项4)通过四则运算组合起来的式子,如P(x)=2x^4+3x^3-3x^2+5x-1  一般的求解会将特定的x代入到上式中,一个一个的计算,共需要花费10次的乘法和4次加法运算,但是我们可以通过霍纳方法对多项式进行组合计算,在需要每秒对多个不同输入的x多次...

大学摄影爱好者 3266

6-2 多项式求值

int i,j;sum=0.00;for(i=0;i<=n;for(j=1;j<i;j++){q=q*x;return sum;结果需优化。

weixin_47079747的博客 238

数学基础 -- 多项式

多项式(Polynomial)是数学中一种表达式,由变量和系数组成,通过加、减和乘运算结合而成。

sz66cm 学习随笔 4005

多项式算法学习笔记

之前零零散散学了一些多项式算法,准备总结一下。 先是大佬博客https://blog.csdn.net/WADuan2/article/details/79529900(原理) 无敌的总结和题目https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 这篇博客没有什么原创的东西,几乎就是看大佬博客学习总...

weixin_30596023的博客 225

[多项式算法]多项式求逆 学习笔记

多项式求逆 和整数的乘法逆元定义类似,对于多项式\(A(x)B(x)=1\),则称\(A(x),B(x)\)互为乘法逆元。 \(A(x)\)存在乘法逆元的充要条件是\([x^0]A(x)\)存在乘法逆元。 现在思考如何用\(O(n\log n)\)的时间计算\(A(x)\)的乘法逆元: 考虑倍增,当前已求出前\(n\)项的逆元,则:\(A(x)B(x)\equiv 1\pmod{x^n...

weixin_30788239的博客 792

学习笔记多项式相关算法

学习笔记多项式相关算法 手动博客搬家: 本文发表于20181125 13:19:28, 原地址https://blog.csdn.net/suncongbo/article/details/84485568 最近学了一下多项式相关算法,简单记录一下 记号说明: \(O(Af(n))\)表示时间复杂度\(O(f(n))\), FFT的常数为\(A\). 例如,进行...

suncongbo's blog 123

[多项式算法](Part 3)MTT 任意模数FFT/NTT 学习笔记

其他多项式算法传送门: [多项式算法](Part 1)FFT 快速傅里叶变换 学习笔记 [多项式算法](Part 2)NTT 快速数论变换 学习笔记 [多项式算法](Part 4)FWT 快速沃尔什变换 学习笔记 [多项式算法](Part 5)分治FFT 学习笔记 \(3.Hard-MTT\) 定义 MTT\((Maoxiao\ Theoretic\ Transforms)\) 中文...

weixin_30319097的博客 511

[多项式算法](Part 5)分治FFT 学习笔记

其他多项式算法传送门: [多项式算法](Part 1)FFT 快速傅里叶变换 学习笔记 [多项式算法](Part 2)NTT 快速数论变换 学习笔记 [多项式算法](Part 3)MTT 任意模数FFT/NTT 学习笔记 [多项式算法](Part 4)FWT 快速沃尔什变换 学习笔记 分治FFT 分治FFT是一种基于CDQ分治(不是很懂和CDQ有什么关系)的算法,主要用于在\(O(nlo...

weixin_30788239的博客 374

数据结构与算法学习笔记——多项式的链表实战

数据结构与算法学习笔记(C语言) 多项式的链表实现 定义:在数学上,形如 的式子叫做一元多项式,包括系数a、b、c、d…还有幂次0、1、2、3… 根据多项式的特征,我们可以定义一个链表,让节点的数据域放系数和幂次,然后让next指针域指向下一个更高幂次的节点 抽象数据类型多项式Polynomial的实现 typedef struct term { int coef; /*系数*/ int expn; /*幂次*/ struct term *next; /*next指针*/ }term, *Polyn

qq_43854196的博客 1565

[学习笔记][省选算法]多项式乘法之 FFT & NTT 及卷积

一、开头 (Place :山东省神犇协会第 998244353 会议厅) SD 神犇 998244353 号(会长):所有神犇,洛谷黑题都切完了吗? 全体神犇:切完了! 神犇 1004535809 号: 998244353 ,我昨天看到一个弱鸡,洛谷名叫 xyz32768 ,他一道黑题都没做,您认为应该怎样呢? 神犇 998244353 号:这个问题您们考虑一下,应该用怎样的方式把 xy...

女装的你,如此好看! 1629

[多项式算法](Part 2)NTT 快速数论变换 学习笔记

其他多项式算法传送门: [多项式算法](Part 1)FFT 快速傅里叶变换 学习笔记 [多项式算法](Part 3)MTT 任意模数FFT/NTT 学习笔记 [多项式算法](Part 4)FWT 快速沃尔什变换 学习笔记 [多项式算法](Part 5)分治FFT 学习笔记 \(2.Medium-NTT(FNT)\) 定义 NTT\((Number\ Theoretic\ Transf...

weixin_30337157的博客 232
上一篇: 【CF662C】Binary Table
下一篇: 【LuoguP4433】[COCI2009-2010#1] ALADIN(含类欧几里得算法推导)
NeosKnight
博客等级 码龄9年 21粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值