首页 > 其他分享 >多项式基本技术整理

多项式基本技术整理

时间:2024-05-15 12:10:34浏览次数:19  
标签:基本 int 多项式 rev NTT 计算 整理 乘法

FFT / NTT

以 \(\Theta(\mathsf{M}(n)) = \Theta(n \log n)\) 的复杂度,快速计算多项式在 \(n\) 个单位根处的点值,以及通过 \(n\) 个单位根处的点值还原多项式的算法。常用于计算多项式乘法。

由于这个算法的原理在 OI 中是相当板的存在,就不在这里列出了。计算多项式乘法基本只需要用到 NTT,即使模数非 NTT 模数也可以结合 NTT 与中国剩余定理求解。下面给出作者计算多项式乘法的模板:

Code
inline void NTT(int type) {
  int n = size(); rev_init(n);
  for(int i = 1; i < n; i++) {
    if(i < rev[i]) swap(a[i], a[rev[i]]);
  }
  static int gr[N]; gr[0] = 1;
  for(int d = 1; d < n; d <<= 1) {
    int gw = qpow(type == 1 ? 3 : invg, (mod - 1) / (d << 1));
    for(int i = 1; i < d; i++) {
      gr[i] = 1ll * gr[i - 1] * gw % mod;
    }
    for(int i = 0; i < n; i += d << 1) {
      for(int j = 0; j < d; j++) {
        int x = a[i + j], y = 1ll * gr[j] * a[i + j + d] % mod;
        a[i + j] = add(x, y);
        a[i + j + d] = dec(x, y);
      }
    }
  }
  if(type == -1) {
    for(int i = 0, invn = inv(n); i < n; i++) {
      a[i] = 1ll * a[i] * invn % mod;
    }
  }
}
inline friend Poly operator * (Poly A, Poly B) {
  int n = A.size() + B.size() - 1, m = 1;
  while(m < n) m <<= 1;
  A.resize(m), B.resize(m);
  A.NTT(1), B.NTT(1);
  for(int i = 0; i < m; i++) {
    A[i] = 1ll * A[i] * B[i] % mod;
  }
  A.NTT(-1), A.resize(n);
  return A;
}

Newton 迭代

可以用它实现大部分多项式基本计算(如 Inv, Sqrt, Exp 等),当然更广泛的用途是求解多项式方程。Newton 迭代的原理(即泰勒展开)此处略过,只记录一下其通用的一种使用方式。

记 \(g(f(x)) = 0\) 为一关于 \(f(x)\) 的方程。则我们可以通过以下方式倍增地求出 \(f(x)\)。

标签:基本,int,多项式,rev,NTT,计算,整理,乘法
From: https://www.cnblogs.com/chroneZ/p/18193539

相关文章

  • Clickhouse常用整理& linux操作clickhouse命令
    进入click(不加上-m的话,进入之后只能一次写一行,不能建表)clickhouseclient-m 查看数据库showdatabases;创建一个数据库createdatabasedb_doit; 删除数据库dropdatabasedb_doit;查看表showtables;查看当前使用的数据库selectcurrentDatabas......
  • 2-HTML语法规范和基本结构
    基本语法概述HTML标签是由尖括号包围的关键字,例如<html>。HTML标签通常是成对出现的,例如<html>和</html>,我们称为双标签。标签对中第一个是开始标签,第二个是结束标签。有些特殊的标签必须是单个标签,例如<br/>,我们称为单标签。标签关系包含关系点击查看代码<body>......
  • 整理面试内容
    一面:报错500是什么错误,安卓iOS区别测试流程、怎么抓包、ios和安卓测试区别cooked和session区别fiddler抓包,抓包机制二面:web测试和app测试的区别,安卓系统和ios的区别,之前印象深的bug,sql语句,还有就是一些稳定性方面的,家住的多远,怎么看加班苹果怎么打测试包,苹果和安卓测试的区别......
  • 【django学习-19】基本流程与用户管理界面(原始方式)
    1.安装及创建项目1.1:安装django,pipinstalldjango1.2:创建项目:django-adminstartproject项目名称1.3:创建app:pythonmanage.pystartappapp名称1.4:使用pychram创建项目:1.4.1:注意点,pycharm在标准的基础上默认给咱们加了点东西1.4.2:创建了一个templates目录【删除】1.......
  • "Bios"是计算机系统中的基本输入输出系统(Basic Input/Output System),负责在计算机启动
    "Bios"是计算机系统中的基本输入输出系统(BasicInput/OutputSystem),负责在计算机启动时初始化硬件设备、检测系统资源,并启动操作系统。Bios开发人员是负责设计、开发和维护计算机系统的Bios软件的专业人员。工作内容:软件设计和开发:Bios开发人员负责设计和编写Bios软件,包......
  • 力扣224.基本计算器(困难)
    题目​ 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。解题思路我们可以使用两个栈nums和ops。nums:存放所有的数字ops:存放所有的数字以外的操作,+/-也看做是一种操作然后从前往后做,对遍历到的字符做分情况讨论:空格:跳过(:直接加入ops......
  • 多项式
    积性函数1.利用欧拉筛求f(1),……,f(n)//欧拉筛求f(1),……,f(n)voideuler{ f[1]=1; for(inti=2;i<=n;i++){ if(!st[i])p[++tot]=i,f[i]=calc_f(i,1); for(intj=1;j<=tot&&i*p[j]<=n;j++){ st[i*p[j]]=true; if(i%p[j]==0){ cnt[i*p[j]]=cnt[i]+1;//cnt......
  • 基于Java的redis客户端的基本使用
    1.简介Java中redis客户端有jedis、lettuce、Redission等2.jedis的基本使用引入依赖<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.2.3</version></dependency>从jedis连接池获取je......
  • 44.Android数据存储再再整理
    主要就是对SQL语句操作数据库和SQLite数据库中的事务之前我用的第三方模拟器然后自带删掉了一些东西如果HAXM无法安装:去文件里找到安装参考https://blog.csdn.net/m0_63131732/article/details/125736265之前一直好奇为啥不能写成switchcase语句:就是R.id找不到就是存储......
  • python 基本日期和时间类型 datetime
    datetime说明datetime模块提供了处理日期和时间的类。它可以帮助你执行日期和时间的计算、转换以及格式化等操作。模块包含了日期(date)、时间(time)、日期时间(datetime)、时间间隔(timedelta)、时区(tzinfo)等类。datetime类:用于操作日期和时间的类,包括年、月、日、时、分、秒等信息......