梅森素数(Mersenne prime)判断, FFT 大数乘法 (非递归), O(n^2 log n), c++

原创代码,请勿转载!FFT 的单位根采用数论中的模方程根,避免浮点数运算。 w^{2^k}  = 1 (mod MOD)FFT简介:快速傅里叶变换, 参考 http://beige.ucs.indiana.edu/B673/node12.htmln = 8 为例子, 计算两个4位数的乘法。A[0..7][0..7]: A[i][j] = w^{i*j}, 其中 w^n =
摘要由CSDN通过智能技术生成

原创代码,请勿转载!

梅森素数判定:
卢卡斯-莱默检验法:参考https://zh.wikipedia.org/wiki/%E5%8D%A2%E5%8D%A1%E6%96%AF-%E8%8E%B1%E9%BB%98%E6%A3%80%E9%AA%8C%E6%B3%95


卢卡斯-莱默检验法 是迭代算法,需要用到高精度乘法运算。
而现有的乘法运算算法最快的要数 快速傅里叶变换 算法,
可以将两位n-bit的大整数乘法在O(n lg n)计算出来。


FFT简介:快速傅里叶变换, 参考 http://beige.ucs.indiana.edu/B673/node12.html


n = 8 为例子, 计算两个4位数的乘法。
寻找根w使得 w^n = 1.
A[0..7][0..7]: A[i][j] = w^{i*j}, 其中 w^n = 1.
A^{-1} = w^{-1} ^ {i*j}.


对于大整数X和Y,首先做矩阵乘法运算
X' = A*X
Y' = A*Y
然后对X' Y' 对应bit位 对应相乘
Z = X' .* Y' (对应相乘)
最后还原
Z' = A^{-1}*Z


快速傅里叶变换的高效之处在于,A矩阵是具有很强的结构性,因此矩阵乘法运算过程可以优化到O(n lg n).


关于如何选择根w.
采用数论中的 root https://en.wikipedia.org/wiki/Root_of_unity_modulo_n
避免浮点数运算。 


对于n=2^k, 寻找大素数MOD,使得 存在 w, w^{2^k}=1 (mod MOD).

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cmath>

#define EXC(a,b) a ^ b ? a ^= b ^= a ^= b : 0
#define EXCB(a,b) a > b ? a ^= b ^= a ^= b : 0
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define FORE(i,a,b) for(int i=(a);i<=(b);i++)
#define FORI(TYPE,it,s) fo
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值