NTT:快速数论变化,对于FFT精度减少的情况,NTT可以避免但是会慢一点,毕竟是数论有Mod,和快速米

引用:http://blog.csdn.net/zz_1215/article/details/40430041

周边介绍。

利用原根,在ZP整数域(后悔没学好《信息安全数学基础》

原根介绍:http://baike.baidu.com/link?url=2gVDOcvJL0eTySKDiwFaDE7hNOTSJ087eGtv42QCt8tYEJZyUMXb6Eb40n0E0ygRoj4unNtEwukv3AFD1IEeia

然后对于一个整数域中的值分别对应一个数,具体看下这类数学书,用来替代单位根

对于一个P(素数)

比较快的一种方法找原根:http://blog.csdn.net/zhang20072844/article/details/11541133 (ORZ

大概是对于P的一个大于1的因子满足G^因子%P==1,那么就不是原根,原根很小。

其他跟FFT没区别。

其实傅里叶变化关键还是能够化成卷积的形式(这里只是处理普通和答案要求Mod的时候)

要求答案的逆,和除法,要看Picks的博客:

NTT:

#include<iostream>

#include<string.h>
#include<stdio.h>
#include<math.h> using namespace std;
typedef long long ll;
const int N=<<;
const int P=;
const int G=;
const int NUM=;
ll wn[NUM],a[N],b[N];
char A[N],B[N]; ll Pow(ll a,ll b,ll m)
{
   ll ans=;
   a%=m;
   while (b)
   {
      if (b&) ans=ans*a%m;
      a=a*a%m;
      b/=;
   }
   return ans;
} void Getwn()
{
   for (int i=;i<NUM;i++)
   {
      int t=<<i;
      wn[i]=Pow(G,(P-)/t,P);
   }
} void Rader(ll a[],int len)
{
   int j=len>>;
   for (int i=;i<len-;i++)
   {
      if (i<j) swap(a[i],a[j]);
      int k=len>>;
      while (j>=k)
      {
         j-=k;
         k>>=;
      }
      if (j<k) j+=k;
   }
} void NTT(ll a[],int len,int on)
{
   Rader(a,len);
   int id=;
   for (int h=;h<=len;h<<=)
   {
      id++;
      for (int j=;j<len;j+=h)
      {
         ll w=;
         for (int k=j;k<j+h/;k++)
         {
            ll u=a[k]%P;
            ll t=w*(a[k+h/]%P)%P;
            a[k]=(u+t)%P;
            a[k+h/]=((u-t)%P+P)%P;
            w=w*wn[id]%P;
         }
      }
   }    if (on==-)
   {
      for (int i=;i<len/;i++)
      swap(a[i],a[len-i]);
      ll inv=Pow(len,P-,P);
      for (int i=;i<len;i++)
      a[i]=a[i]%P*inv%P;
   }
}
void Conv(ll a[],ll b[],int n)
{
   NTT(a,n,);
   NTT(b,n,);
   for (int i=;i<n;i++)
   a[i]=a[i]*b[i]%P;
   NTT(a,n,-);
} int pan(char s[],char ss[])
{
   int len=strlen(s);
   len--;
   while (s[len]==''&&len>=) len--;
   if (len<) return ;    len=strlen(ss);
   len--;
   while (ss[len]==''&&len>=) len--;
   if (len<) return ;
   return ;
}
int main()
{
   Getwn();
   while (scanf("%s%s",A,B)!=EOF)
   {
      if (pan(A,B))
      {
       puts("");
       continue;
      }
      int len=;
      int lenA=strlen(A);
      int lenB=strlen(B);
      while (len<=*lenA||len<=*lenB) len<<=;
      for (int i=;i<lenA;i++)
      A[len--i]=A[lenA--i];
      for (int i=;i<len-lenA;i++) A[i]='';       for (int i=;i<lenB;i++)
      B[len--i]=B[lenB--i];
      for (int i=;i<len-lenB;i++) B[i]='';
      for (int i=;i<len;i++) a[len--i]=A[i]-'';
      for (int i=;i<len;i++) b[len--i]=B[i]-'';
      Conv(a,b,len);       int t=;
      for (int i=;i<len;i++)
      {
         a[i]+=t;
         if (a[i]>)
         {
            t=a[i]/;
            a[i]%=;
         }
         else t=;
      }
      len--;
      while (a[len]==) len--;
      for (int i=len;i>=;i--) printf("%d",a[i]);
      puts("");
   }
   return ;
}

关于傅里叶变换NTT(FNT)的周边的更多相关文章

  1. dynamic routing between captual

    对于人脑 决策树形式 对于CNN 层级与层级间的传递 人在识别物体的时候会进行坐标框架的设置 CNN无法识别,只能通过大量训练 胶囊 :一个神经元集合,有一个活动的向量,来表示物体的各类信息,向量的长 ...

  2. FFT的应用

    FFT的应用 --讲稿 概述 FFT的模板很简单,大家都会背,于是出题的空间就在于建模了.FFT的题目难在建模,往往需要将问题抽象出来,经过一系列转化后得到乘积式的和,再赋予式子各个项的系数一定的意义 ...

  3. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

  4. 快速傅里叶变换FFT& 数论变换NTT

    相关知识 时间域上的函数f(t)经过傅里叶变换(Fourier Transform)变成频率域上的F(w),也就是用一些不同频率正弦曲线的加 权叠加得到时间域上的信号. \[ F(\omega)=\m ...

  5. 快速傅里叶变换FFT / NTT

    目录 FFT 系数表示法 点值表示法 复数 DFT(离散傅里叶变换) 单位根的性质 FFT(快速傅里叶变换) IFFT(快速傅里叶逆变换) NTT 阶 原根 扩展知识 FFT 参考blog: 十分简明 ...

  6. 从傅里叶变换(FFT)到数论变换(NTT)

    FFT可以用来计算多项式乘法,但是复数的运算中含有大量的浮点数,精度较低.对于只有整数参与运算的多项式,有时,\(\text{NTT(Number-Theoretic Transform)}\)会是更 ...

  7. Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT

    Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...

  8. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

  9. 快速傅里叶变换(FFT)学习笔记(其二)(NTT)

    再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...

随机推荐

  1. House of Spirit(fastbin)

    0x01 fastbin fastbin所包含chunk的大小为16 Bytes, 24 Bytes, 32 Bytes, … , 80 Bytes.当分配一块较小的内存(mem<=64 Byt ...

  2. ios之UIToolBar

    toolbar除了可以和navigationController一起用之外,也可以独立用到view里.工具栏UIToolbar – 一般显示在底部,用于提供一组选项,让用户执行一些功能,而并非用于在完 ...

  3. awk纯干货

    AWK的惊人表现: Awk设计的目的:简化一般文本处理的工作. 属于POSIX的一部分. AWK命令行: Awk的调用可以定义变量.提供程序并且指定输入文件: Awk [ -F fs ]  [ -v ...

  4. Python基础:列表(list)和元组(tuple)

    学一门语言,可以用对比其他语言方法加深对这门语言特点的理解. 一.定义:列表和元组,都是一个可以放置任意数据类型的有序集合. mutable的列表:动态的,可以改变元素 immutable的元组:静态 ...

  5. (原)剑指offer跳台阶和矩形覆盖

    跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法.   分析同样为斐波那契数列边形这样的题肯定有公式 设 ...

  6. 剑指Offer(书):对称的二叉树

    题目:请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. boolean isSymmetrical(TreeNode pRoot) { r ...

  7. vmalloc_init

    /* linux/mm/vmalloc.c*/ struct vmap_area { unsigned long va_start; unsigned long va_end; unsigned lo ...

  8. Lex与Yacc学习(三)之符号表

    符号表 列举单词表的方式虽然简单但是不全面,如果在词法分析程序运行时可以构建一个单词表,那么就可以在添加新的单词时不用修改词法分析程序. 下面示例便利用符号表实现,即在词法分析程序运行时从输入文件中读 ...

  9. ubuntu14.04安装搜狗拼音以及Google-chrome

    安装搜狗拼音 1.进入https://pinyin.sogou.com/linux/选择合适版本下载: 2.直接打开deb包进行安装: 3.安装完成后,打开系统设置中语言支持选项,在键盘输入方式系统中 ...

  10. cs229_part4

    又到了一节很重要的课,因为这个学习理论是从统计角度为机器学习算法提供了一个理论基础. 学习理论 问题背景 先回顾一下我们第一节课提到的机器学习的组成: 第一节课只是简单的提了一下,现在我们要真正来分析 ...