Luogu P3803 多项式乘法(ntt版)


题目链接

思路

相信大家都已经学会了 F F T FFT FFT,若不会,请看这篇博客
一个同学写的,自认为不错
在我们的 F F T FFT FFT中,我们使用了复数来进行计算
但是我们可以发现复数的乘法时间复杂度是 O ( 4 ) O(4) O(4)
d o u b l e double double的计算则更加增添了时间复杂度
同时因为浮点数计算     \sqrt{\ \ \ }     的精度会有误差
导致我们最终的所有部分的和反而与完整的 360 360 360°
那么我们不妨试想,若是在系数为整数的情况下
或者需要取模的时候,我们该如何来解决呢?

NTT

于是我们就可以介绍今天的主角了
NTT —— 快速数论变换
是一种建立在数论上的对FFT的优化
(或者可以说是取模运算的FFT)
只不过由于FFT用到是复数
而且double在做了大量的实数运算之后
精度损失较大
而我们的NTT就可以在模意义下
快速做这样的一个多项式乘法
NTT常数小一些
一般这个模数被认为是 x ∗ 2 k + 1 x * 2^k+1 x2k+1

原根

接下来我们介绍一个东西——原根
m m m是正整数, a a a是整数
a a a m m m的阶等于 φ ( m ) \varphi(m) φ(m)
则称 a a a为模 m m m的一个原根。
假设一个数 g g g P P P的原根
那么 g i   m o d   P g^i\ mod\ P gi mod P的结果两两不同
且有 1 < g < P 1<g<P 1<g<P 0 < i < P 0<i<P 0<i<P
归根到底就是 g P − 1 ≡ 1 ( m o d   P ) g^{P-1} \equiv 1 (mod\ P) gP11(mod P)
当且仅当指数为 P − 1 P-1 P1的时候成立( P P P是素数)。
简单来说, g i   m o d   p ≠ g j m o d   p g^i\ mod\ p \neq g^j mod\ p gi mod p=gjmod p ( p p p为素数)
其中 i ≠ j i \ne j i=j i , j i, j i,j介于 1 1 1 ( p − 1 ) (p-1) (p1)之间
g g g p p p的原根。
提供一种暴力的原根的求法

int calc(int x)// 求原根
{
   
    if (x == 2)
        return 1;
    for 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值