关于傅里叶变换NTT(FNT)的周边
NTT:快速数论变化,对于FFT精度减少的情况,NTT可以避免但是会慢一点,毕竟是数论有Mod,和快速米
引用:http://blog.csdn.net/zz_1215/article/details/40430041
周边介绍。
利用原根,在ZP整数域(后悔没学好《信息安全数学基础》
然后对于一个整数域中的值分别对应一个数,具体看下这类数学书,用来替代单位根
对于一个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)的周边的更多相关文章
- dynamic routing between captual
对于人脑 决策树形式 对于CNN 层级与层级间的传递 人在识别物体的时候会进行坐标框架的设置 CNN无法识别,只能通过大量训练 胶囊 :一个神经元集合,有一个活动的向量,来表示物体的各类信息,向量的长 ...
- FFT的应用
FFT的应用 --讲稿 概述 FFT的模板很简单,大家都会背,于是出题的空间就在于建模了.FFT的题目难在建模,往往需要将问题抽象出来,经过一系列转化后得到乘积式的和,再赋予式子各个项的系数一定的意义 ...
- 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】
原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...
- 快速傅里叶变换FFT& 数论变换NTT
相关知识 时间域上的函数f(t)经过傅里叶变换(Fourier Transform)变成频率域上的F(w),也就是用一些不同频率正弦曲线的加 权叠加得到时间域上的信号. \[ F(\omega)=\m ...
- 快速傅里叶变换FFT / NTT
目录 FFT 系数表示法 点值表示法 复数 DFT(离散傅里叶变换) 单位根的性质 FFT(快速傅里叶变换) IFFT(快速傅里叶逆变换) NTT 阶 原根 扩展知识 FFT 参考blog: 十分简明 ...
- 从傅里叶变换(FFT)到数论变换(NTT)
FFT可以用来计算多项式乘法,但是复数的运算中含有大量的浮点数,精度较低.对于只有整数参与运算的多项式,有时,\(\text{NTT(Number-Theoretic Transform)}\)会是更 ...
- Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT
Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- 快速傅里叶变换(FFT)学习笔记(其二)(NTT)
再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...
随机推荐
- shell脚本,逻辑结构题练习。
awk '/5/{a=1}!a' file2结果:1234解释:第一行 /5/不匹配跳过{a=1},继续!a,此时a没有值属于假取反为真,故输出第一行 第二行 /5/不匹配跳过{a=1},继续!a,此 ...
- java在线聊天项目 swt可视化窗口Design 好友列表窗口
熟练使用各种布局方式 FlowLayout 流布局 left center right等 BorderLayout 边框布局 east west sorth north center Absolute ...
- Watch Before You Feel Pressure
Today's assembly is about the start of a journey. 今天的大会是一个旅程的开始. The start of the rest of your lives ...
- 【数论 dp】2048
考场上一个DFS优化乱加就对了一个无解的点 题目描述 给定一个长度为 n 的数列,在这个数列中选取一个子序列使得这个子序列中的数能合出2048 对于合并操作,可以选择这个序列中的任意两个数进行合并,当 ...
- Tcp 三次握手 四次分手
看了 余晟以为的 “tcp没那么难吧”,算是对三次握手,四次分手有了一点点理解,记录下来以方便自己以后的查看. 原文链接:https://mp.weixin.qq.com/s?__biz=MzA3MD ...
- (26)zabbix脚本报警介质自定义(钉钉)
zabbix机器人告警配置 首先在钉钉中创建一个群然后设置群机器人添加自定义机器人(webhook...) 添加后复制其中的webhook地址到报警脚本dingding.py中的webhook=... ...
- 怎么用js写一个类似于百度输入框的搜索插件
PS:这次做的这个小插件只是在前端实现,并没有经过数据库.需要用到的的框架:1.bootstrap.css的样式 2.Vue.js 最终效果如下: JS部分: $(window).click(func ...
- webpack hmr
参考: https://webpack.js.org/concepts/hot-module-replacement/ https://webpack.js.org/guides/hot-module ...
- 关于priority_queue的一些说明
参考GGBeng 相关定义 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大 ...
- 求分数序列的前n项之和
有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和. 输入 测试数据有多组,其第一行为一个正整数k(0<k<=90),表示测试数据的 ...