日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FFT实现高精度乘法

發(fā)布時間:2023/12/1 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FFT实现高精度乘法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

你應(yīng)該知道$FFT$是用來處理多項(xiàng)式乘法的吧。

那么高精度乘法和多項(xiàng)式乘法有什么關(guān)系呢?

觀察這樣一個$20$位高精度整數(shù)$11111111111111111111$

我們可以把它處理成這樣的形式:$\sum_{i=0}^{19}1\times10^i$

這樣就變成了一個多項(xiàng)式了!

直接上代碼吧(以$Luogu\ P1919$為例):

#include <cmath> #include <cstdio> #include <algorithm> using std::swap;const int N = 1.4e5 + 10; const double Pi = acos(-1); int n, m, r[N], P, ans[N]; char s[N]; struct C { double x, y; } a[N], b[N]; C operator + (C a, C b) { return (C){ a.x + b.x, a.y + b.y }; } C operator - (C a, C b) { return (C){ a.x - b.x, a.y - b.y }; } C operator * (C a, C b) { return (C){ a.x * b.x - a.y * b.y, a.x * b.y + b.x * a.y }; }void FFT(C f[], int opt) {for(int i = 0; i < n; ++i) if(i < r[i]) swap(f[i], f[r[i]]);for(int len = 1, nl = 2; len < n; len = nl, nl <<= 1) {C rot = (C){cos(Pi / len), opt * sin(Pi / len)};for(int l = 0; l < n; l += nl) {C w = (C){1, 0}; int r = l + len;for(int k = l; k < r; ++k, w = w * rot) {C x = f[k], y = w * f[k + len];f[k] = x + y, f[k + len] = x - y;}}} } int main() {scanf("%d%s", &n, s + 1);for(int i = 1; i <= n; ++i) a[i - 1].x = s[n - i + 1] - '0';scanf("%s", s + 1);for(int i = 1; i <= n; ++i) b[i - 1].x = s[n - i + 1] - '0';//將字符串轉(zhuǎn)化為多項(xiàng)式的系數(shù)--n;for(m = n + n, n = 1; n <= m; n <<= 1, ++P);for(int i = 0; i < n; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (P - 1));//蝴蝶變換FFTFFT(a, 1), FFT(b, 1);for(int i = 0; i < n; ++i) a[i] = a[i] * b[i];FFT(a, -1);for(int i = 0; i <= m; ++i) ans[i] = (int)(a[i].x / n + .5);for(int i = 0, tmp1, tmp2; i < m; ++i)ans[i + 1] += (ans[i] / 10), ans[i] %= 10;//處理進(jìn)位(每個系數(shù)最多為兩位數(shù))for(int i = m, flag = 0; i >= 0; --i) {if(ans[i] != 0) flag = 1;else if(!flag) continue;printf("%d", ans[i]); }//flag為前導(dǎo)零標(biāo)記return puts("") & 0; }

$PS:$代碼中沒有處理$0\times0$的情況,請讀者自行處理。

轉(zhuǎn)載于:https://www.cnblogs.com/water-mi/p/10198586.html

總結(jié)

以上是生活随笔為你收集整理的FFT实现高精度乘法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。