任意模数的多项式乘法

一、 NTT的局限

对于模数符合下列条件的多项式乘法,我们可以用NTT。

  • 模数为 P = r ∗ 2 k + 1 P=r*2^k+1 P=r2k+1, 其中 k k k足够大,满足 2 k > = N 2^k>=N 2k>=N N N N为多项式扩充后的项数。因为多项式乘法都需要将项数扩充到 2 2 2的幂。

而如果不满足这个条件,则我们无法使用 N T T NTT NTT直接做了。

而要使用 F F T FFT FFT解决带模的多项式乘法,则要保证在不考虑模数的情况下,多项式乘积的系数不能超过 d o u b l e double double能表示的精度。一般 d o u b l e double double的精度在 1 0 16 10^{16} 1016,所以如果系数超过 1 0 16 10^{16} 1016以后,则用double不能精确表示了。

二、 任意模数的多项式乘法

模数为任意整数时的多项式乘法该如何解决呢?

1. 三模数NTT

有两种解决思路,第一种是三模数 N T T NTT NTT。即找三个模数,这三个模数都需满足上述 N T T NTT NTT的条件。分别求出在三个模数下的多项式乘法的结果,然后再利用中国剩余定理,求出在给定模数下的结果。
设给定的模数为 m o d mod mod, 自己找的三个模数为 m o d 1 , m o d 2 , m o d 3 mod1,mod2,mod3 mod1,mod2,mod3,这三个模数除了要满足上述 N T T NTT NTT的条件外,还需要满足:
m o d 1 × m o d 2 × m o d 3 mod1\times mod2 \times mod3 mod1×mod2×mod3大于结果多项式中的所有系数,其中两个 m o d mod mod的乘积要在long long 范围以内。
对多项式结果的系数 c c c:有:

{ c ≡ c 1 ( m o d m o d 1 ) c ≡ c 2 ( m o d m o d 2 ) c ≡ c 3 ( m o d m o d 3 ) \begin{aligned} \begin{cases} c \equiv c_1 \pmod {mod1} \\ c \equiv c_2 \pmod {mod2} \\ c \equiv c_3 \pmod{mod3} \end{cases} \end{aligned} cc1(modmod1)cc2(modmod2)cc3(modmod3)

根据扩展中国剩余定理,由前两个方程可知:
c 1 + m o d 1 × k 1 = c 2 + m o d 2 × k 2 c1+mod_1 \times k_1 = c2+ mod_2 \times k_2 c1+mod1×k1=c2+mod2×k2
k 1 × m o d 1 ≡ ( c 2 − c 1 ) ( m o d m o d 2 ) k_1 \times mod_1 \equiv (c2-c1) \pmod{mod_2} k1×mod1(c2c1)(modmod2)
k 1 = ( c 2 − c 1 ) × m o d 1 − 1 ( m o d m o d 2 ) k_1 = (c_2-c_1) \times mod_1^{-1} \pmod{mod_2} k1=(c2c1)×mod11(modmod2)
求出了 k 1 k_1 k1以后,就可以求出来前两个方程下的 c c c的值:
c ≡ ( c 2 − c 1 ) × m o d 1 − 1 × m o d 1 + c 1 ( m o d m o d 1 × m o d 2 ) (2) c \equiv (c_2-c_1) \times mod_1^{-1} \times mod_1+c_1 \pmod{mod_1 \times mod_2} \tag {2} c(c2c1)×mod11×mod1+c1(modmod1×mod2)(2)

观察上式,发现有 m o d 1 − 1 × m o d 1 mod_1^{-1} \times mod_1 mod11×mod1,这不就是 1 1 1吗?
2 2 2式不变成了 c ≡ c 2 c \equiv c2 cc2了吗?
不是的,这里要注意,上面的式子中 m o d 1 − 1 mod_1^{-1} mod11是指在模 m o d 2 mod_2 mod2意义下 m o d 1 mod_1 mod1的逆元,而在模 m o d 1 × m o d 2 mod_1 \times mod_2 mod1×mod2意义下, m o d 1 − 1 × m o d 1 mod_1^{-1} \times mod_1 mod11×mod1就不是逆元了,其不一定为 1 1 1.

举个例子: m o d 1 mod_1 mod1 5 5 5, m o d 2 mod_2 mod2 7 7 7, 在 m o d 2 mod_2 mod2意义下, m o d 1 − 1 mod_1^{-1} mod11 3 3 3, 在 m o d 1 × m o d 2 mod_1\times mod_2 mod1×mod2意义下, 5 × 3 5 \times 3 5×3并不等于 1 1 1.

然后将该式与方程组中的第三个方程联立起来,设 m = ( c 2 − c 1 ) × m o d 1 − 1 × m o d 1 + c 1 m=(c_2-c_1) \times mod_1^{-1} \times mod_1+c_1 m=(c2c1)×mod11×mod1+c1,
可以得到:
c ≡ ( c 3 − m ) × ( m o d 1 × m o d 2 ) − 1 × ( m o d 1 × m o d 2 ) + m ( m o d m o d 1 × m o d 2 × m o d 3 ) c \equiv (c_3-m) \times (mod_1 \times mod_2)^{-1} \times (mod_1 \times mod_2) + m \pmod{mod_1\times mod_2 \times mod_3} c(c3m)×(mod1×mod2)1×(mod1

变分模态分解(Variational Mode Decomposition, VMD)是一种强大的非线性、无参数信号处理技术,专门用于复杂非平稳信号的分析与分解。它由Eckart Dietz和Herbert Krim于2011提出,主要针对传统傅立叶变换在处理非平稳信号时的不足。VMD的核心思想是将复杂信号分解为一系列模态函数(即固有模态函数,IMFs),每个IMF具有独特的频率成分和局部特性。这一过程与小波分析或经验模态分解(EMD)类似,但VMD通过变分优化框架显著提升了分解的稳定性和准确性。 在MATLAB环境中实现VMD,可以帮助我们更好地理解和应用这一技术。其核心算法主要包括以下步骤:首先进行初始化,设定模态数并为每个模态分配初始频率估计;接着采用交替最小二乘法,通过交替最小化残差平方和以及模态频率的离散时间傅立叶变换(DTFT)约束,更每个模态函数和中心频率;最后通过迭代优化,在每次迭代中优化所有IMF的幅度和相位,直至满足停止条件(如达到预设迭代次数或残差平方和小于阈值)。 MATLAB中的VMD实现通常包括以下部分:数据预处理,如对原始信号进行归一化或去除直流偏置,以简化后续处理;定义VMD结构,设置模态数、迭代次数和约束参数等;VMD算法主体,包含初始化、交替最小二乘法和迭代优化过程;以及后处理,对分解结果进行评估和可视化,例如计算每个模态的频谱特性,绘制IMF的时频分布图。如果提供了一个包含VMD算法的压缩包文件,其中的“VMD”可能是MATLAB代码文件或完整的项目文件夹,可能包含主程序、函数库、示例数据和结果可视化脚本。通过运行这些代码,可以直观地看到VMD如何将复杂信号分解为独立模态,并理解每个模态的物理意义。 VMD在多个领域具有广泛的应用,包括信号处理(如声学、振动、生物医学信号分析)、图像处理(如图像去噪、特征提取)、金融时间序列分析(识
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值