首页 > 其他分享 >NTT 的三次变八次优化

NTT 的三次变八次优化

时间:2024-04-19 21:12:23浏览次数:12  
标签:取模 八次 高斯 int NTT 整数 然后 三次

就是将 NTT 的域扩到复数。

我不知道高斯整数的其他取模方式,所以巨慢/xk。而且没用。

我们知道高斯整数的神秘取模方式,使得其结果的范数小于除数的一半。然而我们发现这个取模在整数下的结果仍然在整数取模的同余系中!

好很有精神!

我们选取 \(g=3,mod=998244353\),我们只需要验证 \(\omega_{n}^k=-\omega_{n}^{\frac{n}{2}+k}\)。就大功告成啦!

然后我们写一个这样的程序:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
signed main(){
	ios::sync_with_stdio(0);
	int g=1,p=-1;
	for(int i=1;i<=(mod-1)/2;i++){
		g=g*3;
		int op=round(1.0*g/mod);
		g=g-mod*op;
		p=p*3;
		op=round(1.0*p/mod);
		p=p-mod*op;
		assert(g==-p);
		// assert(g>0);
	}
	cout<<g<<" "<<p;
	return 0;
}

跑出来没有 RE!好!

于是理论上 NTT 可以扩域到高斯整数。然后就可以用类似于 FFT 的三次变两次优化啦!

然后写一发,中间我都不知道我写了什么神秘东西,然后它 TLE 啦!

66pts 记录

说实话,它是正确的我都很惊讶,于是我更有兴趣了。

注意到这里我直接用 __int128 为了在高斯整数运算的时候不会出现溢出。

然后我们直接写一个全部取模的版本:

它居然也是正确的!!!

过于神秘了。

77pts

然后我就不想写了,因为验证这个东西是正确的就已经达到我的目的了,过于神秘了还是。

然后我转念一想,我不是全部取模了吗?那我直接启动原神!把高斯整数的取模直接删掉!

它过了。

????????

AC 记录

然后我把乘法里面的那个取模删掉,它快了 0.4s!!!

2.10s -> 1.64s

这个时候它的效率就和我第一版 NTT 的效率差不多了。

说实话,它能表现成这样,无论是它的正确性或者速度就已经很令我震惊了。

最后那个在 NTT 中只有两层取模的那个优化我就不加了。

现在这个东西就根本不是高斯整数了,就是只是在实部和虚部这两个东西里直接取模,它居然是正确的/xk。

所以虚数神通广大!

标签:取模,八次,高斯,int,NTT,整数,然后,三次
From: https://www.cnblogs.com/xingyuxuan/p/18146779

相关文章

  • FFT 与 NTT 学习笔记
    【概念】点值:给定多项式\(f(x)=a_0+a_1x+\cdots+a_{n-1}x^{n-1}\)和\(x_1\simx_m\),求\(f(x_1),f(x_2),\dots,f(x_m)\)。(\(m=n\))求点值的算法一般是\(O(n^2)\)的,但对于特殊的多项式,可以做到更快。插值:给定\((x_0,y_0),(x_1,y_1),\dots,(x_{n-1},y_{n-1})\),其中\(x_0\s......
  • 【模板】任意模数多项式乘法:三模 NTT
    前置知识https://www.cnblogs.com/caijianhong/p/template-crt.htmlhttps://www.cnblogs.com/caijianhong/p/template-fft.html题目描述任意模数多项式乘法solution首先我们打开https://blog.miskcoo.com/2014/07/fft-prime-table这篇文章找到\(998244353\)附近的几个质......
  • 书生浦语大模型实战营第二期 第三次课笔记
    课程内容概述本节课介绍了RAG(RetrievalAugmentedGeneration)技术的基础知识。展示了如何使用茴香豆(Huixiangdou)搭建一个RAG智能助理。讲解了茴香豆的进阶用法,包括网络搜索、使用远程模型、搭建网页Demo等。1.RAG技术概述RAG技术结合了检索和生成,通过检索相关信息片段来增......
  • JSX.Element 和 React.ElementType的区别是什么?
    在React和TypeScript中,JSX.Element和React.ElementType代表了两种不同的概念:JSX.Element:JSX.Element是一个类型,表示由JSX编译后生成的实际React元素对象。当你在React应用中使用JSX编写组件时,每一个JSX表达式都会编译为一个JSX.Element对象。例如:constMyComponent:React.......
  • TCP 三次握手与四次挥手面试题(计算机网络)
    TCP基本认识TCP头格式有哪些?  序列号:在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应......
  • WPF GroupBox Expander ExpandDirection="Down" Expander.HeaderTemplate Expander.C
    //xaml<Windowx:Class="WpfApp43.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic......
  • 说说TCP为什么需要三次握手和四次挥手?
    一、三次握手三次握手(Three-wayHandshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备过程如下:第一次握手:客户端给服务端发一个SYN报文,并指明客......
  • 全量知识系统 程序详细设计 “三次演算” 再探(Q&A)之2 (百度搜索)
    说明:以下关于全知系统中程序详细设计的沟通是基于今天正在完成中的全量知识系统程序详细设计之“命名法”“正文”的"前言"之1“前提”篇中提出的所有程序要求的基础上的。(这些相同问题的同时沟通 )Q1.这些规则在程序被设计为λ表达式的三个转换规则,分别适用于三条线......
  • 计网:TCP三次握手和四次挥手
    老生常谈的问题,直接参考连接:https://zhuanlan.zhihu.com/p/108504297(存在部分问题,配合下面CSDN)https://blog.csdn.net/m0_56649557/article/details/119492899 自己需要记住的点:三次握手:第一次:客户端:只有SYN置1,发送seq=J第二次:服务端:SYN和ACK都置1,......
  • 前端系列-三次握手
     客户端和服务器端的交互简单过程:seq=xseq=yack=x+1seq=y+1 第一次握手(SYN)客户端(Client)向服务器(Server)发出一个带有SYN标志的数据段,其中包含一个随机序列号seq=x(x为随机生成的数字)。1Client->Server:SYN(seq=x)第二次握手(SYN+ACK)服务器接收到客户端的SYN数......