#include<iostream>
#include<unordered_map>
#include<complex>
#define _USE_MATH_DEFINES
#include<math.h>
#include<algorithm>
using namespace std;
using cp = complex<double>;
vector<complex<double>> w(int n) {
vector<complex<double>> ans;
const double angle = M_PI /(double) n;
double start = 0.0;
for (int i = 0; i < n * 2; i++) {
ans.emplace_back(complex<double>(cos(start), sin(start)));
start += angle;
}
return ans;
}
complex<double> calcitem(vector<complex<double>>& seq, vector<complex<double>>& w, int idx,int cy) {
int len = seq.size();
if (len == 1)return seq[0];
else {
remove_reference<decltype(seq)>::type even;
decltype(even) odd;
int i = 0;
while (i < len) {
even.push_back(seq[i]); i++;
if (i < len) {
odd.push_back(seq[i]); i++;
}
}
return calcitem(even, w, (idx << 1) % cy, cy) + w[idx] * calcitem(odd, w, (idx << 1) % cy, cy);
}
}
vector<complex<double>> calc(vector<complex<double>>& seq, vector<complex<double>>& w) {
vector<complex<double>> ans;
int len = w.size();
for (int i = 0; i < len;i++) {
ans.push_back(calcitem(seq, w, i, len));
}
return ans;
}
template<typename T>
void print(vector<T> &t) {
for (auto i : t) {
cout << i << ' ';
}cout << endl;
};
void deal(vector<complex<double>> A, vector<complex<double>> B) {
int len = A.size();
auto W = w(len);
auto Ax = calc(A, W);
auto Bx = calc(B, W);
len = Ax.size();
decltype(Ax) C;
for (int i = 0; i < len; i++) {
C.push_back(Ax[i] * Bx[i]);
}
auto Dx = calc(C, W);
vector<long long> ans;
ans.emplace_back(lround((Dx[0] / (double)len).real()));
for (int i = Dx.size() - 1; i > 0; i--) {
ans.emplace_back(lround((Dx[i] / (double)len).real()));
}
int n = ans.size();
int carry = 0;
for (int i = 0; i < n; i++) {
ans[i] += carry;
carry = ans[i] / 10;
ans[i] = ans[i] % 10;
}
for (int i = n-1; i >= 0; i--) {
cout << ans[i];
}cout << endl;
}
void sdeal(vector<int> a, vector<int> b) {
vector<complex<double>> aa, bb;
for (auto i : a)aa.push_back(cp(i, 0));
for (auto i : b)bb.push_back(cp(i, 0));
deal(aa, bb);
}
int main() {
sdeal({ 1, 2, 3, 4 }, { 1, 2, 3, 4 });
}
fft实现大整数相乘,由于使用浮点运算,真实速度不怎么快
最新推荐文章于 2021-10-30 17:42:28 发布