首页 > 其他分享 >NTT

NTT

时间:2024-10-27 11:10:15浏览次数:6  
标签:__ 卷积 NTT int vector int128

NTT

线性卷积

定义:

\[(f * g)[i] = \sum_{j=0}^{i} f[j] \cdot g[i-j] \]

卷积定理:

\[\mathcal{F}(f * g) = \mathcal{F}(f) \cdot \mathcal{F}(g) \]

于是,求线性卷积可以转化为,先变换,再直接相乘,最后逆变换。

注意:序列长度须变成N+M-1,对齐2^k。

循环卷积(圆周卷积)

一般用于两个等长序列。

定义:

\[(f * g)[i] = \sum_{j=0}^{N-1} f[j] \cdot g[i-j] \]

循环卷积可以通过线性卷积来求解。设 \(B[i]\) 为线性卷积结果,
则循环卷积 \(C[i]=B[i]+B[i+N]\)。

大模数NTT

适用于答案为整数,范围4e18以内,有效弥补FFT在大于1e15后精度不足的缺陷。

__int128常数较大,若答案范围较小(9e8以内),则用小模数或FFT

struct Polynomial
{
    static const ll mod = 4179340454199820289LL; // 998244353LL
    vector<ll> z;
    vector<int> r;
    Polynomial(vector<ll> &a):z(a)
    {
        int n = a.size();
        r.resize(n);
        for (int i=0; i<n; i++)
            r[i] = (i&1)*(n/2) + r[i/2]/2;
        ntt(z, n, 1);
    }
    ll power(ll a, ll b)
    {
        ll res = 1;
        for(; b; b>>=1, a = (__int128)a * a % mod)
            if(b&1) res = (__int128)res * a % mod;
        return res;
    }
    void ntt(vector<ll> &a, int n, int opt)
    {
        for(int i=0; i<n; i++)
            if (r[i]<i) swap(a[i], a[r[i]]);
        
        for(int k=2; k<=n; k*=2)
        {
            ll gn = power(3, (mod-1)/k);
            for(int i=0; i<n; i+=k)
            {
                ll g = 1;
                for(int j=0; j<k/2; j++, g = (__int128)g * gn % mod)
                {
                    ll t = (__int128)a[i+j+k/2] * g % mod;
                    a[i+j+k/2] = (a[i+j] + mod - t) % mod;
                    a[i+j] = (a[i+j] + t) % mod;
                }
            }
        }
        if (opt == -1)
        {
            reverse(a.begin()+1, a.end());
            ll inv = power(n, mod-2);
            for(int i=0; i<n; i++) a[i] = (__int128)a[i] * inv % mod;    
        }
    }
};

标签:__,卷积,NTT,int,vector,int128
From: https://www.cnblogs.com/DPPTSD/p/18508076

相关文章

  • EventTranscript.db占用空间太大,文件能否移动到其他位置?
    在大多数情况下,EventTranscript.db 文件可以被移动到其他位置(不建议移动、删除),这样做可能会对系统日志记录功能产生影响:日志记录功能:移动 EventTranscript.db 文件可能会导致系统日志记录工具无法正常工作。系统完整性:在操作系统中,日志文件的位置是系统配置的一部分,移动......
  • 重要升级:DHTMLX Gantt 9.0
    DHTMLXGantt9.0具有全面改进的主题、新的深色主题、手动安排的摘要、内置基线等经过数月的精心工作,我们很高兴推出DHTMLXGantt9.0。这一里程碑版本使我们的JavaScript甘特图界面焕然一新。9.0版带来了彻底改进的主题,并大大简化了甘特图的外观和感觉自定义。......
  • 【分治】线段树 SegmentTree
    算法描述线段树是一种能够处理区间修改和区间查询的数据结构。顾名思义,线段树就是一种存储着线段数据的树形结构。它的每个节点都表示一个线段区间,每个节点的孩子节点存储的就是该区间的左半段和右半段。每个线段区间都存储着一个值,一般是区间和,也有可能是区间最大/最小值。......
  • 项目管理中进度管理工具——甘特图(Gantt Chart)
    这道题目考查的是关于项目管理中进度管理工具——甘特图(GanttChart)的知识点。甘特图是一种用于项目进度管理的条形图,它通过水平条形图来展示项目中各个任务的开始时间、结束时间和持续时间,以及任务之间的依赖关系。甘特图的主要特点和用途包括:任务时间线的可视化:甘特图可以清......
  • 'FK_StudentEducation_Student_StudentTrackSignupId' 不是约束。 未能删除约束。请参
    Student主表StudentEducation从表建表的时候外键约束名写错了,不能数据库直接改通过映射文件想要删掉外键重新生成protectedoverridevoidUp(MigrationBuildermigrationBuilder){migrationBuilder.DropForeignKey("FK_StudentEducation_Student_StudentTrackSignupId",......
  • 浅谈 DFT、IDFT、NTT
    DFT(离散傅里叶变换)多项式分治。最早可能是由高斯发现的多项式可以分治,但他的手稿并未作为论文发表。考虑多项式\(F(x)=a_0+a_1x^{1}+a_2x^{2}+\cdots+a_{n-1}x^{n-1}\)其中\(n=2^{k}\(k\geq0)\)。(任意多项式可以通过高位补\(0\)化为这个形式。)......
  • WPF ListBox ContextMenu MenuItem Command CommandParameter Path PlacementTarget
    <ListBox.ContextMenu><ContextMenu><MenuItemHeader="ExportNewtonSoftJson"FontSize="50"Foreground="Red"Command="{BindingExportNewt......
  • AgentTuning:提升大型语言模型的通用Agent能力
    人工智能咨询培训老师叶梓转载标明出处大模型被用作现实中复杂任务的Agent时,它们的表现往往不如商业模型,如ChatGPT和GPT-4。这些任务要求LLMs作为中央控制器,负责规划、记忆和工具利用,这就需要精巧的提示方法和鲁棒性强的LLMs来实现。尽管已有多种提示方法被提出来完成特定的A......
  • WPF DataGrid ContextMenu CommandParameter Relative x:Type ContextMenu ,Path=Plac
    //xaml<DataGrid.ContextMenu><ContextMenu><MenuItemHeader="SerializeBinary"Command="{BindingBinSerializeCmd}"CommandParameter="{BindingRelativeSource={Relativ......
  • 一步到位的任务栏优化方案,TranslucentTB让你秒变桌面达人!
    前言"技术应当服务于人类的最大利益,而非成为束缚。"——这是一个广为人知却常新的科技理念,它提醒我们技术的本质在于提升人类的生活品质。正是在这样的背景下,TranslucentTB应运而生,它以其独特的创新理念和对用户体验的极致追求,同时,也成为了Windows平台上备受瞩目的软件之一......