matlab中fft_MATLAB 大数乘法

一、模拟大数乘法

输入是用字符串表示的乘数与被乘数,输出也需要转化为字符串。

思路是用数组的每个元素表示每一位的数,乘数与被乘数每一位都相乘,对应值再相加,最后for循环处理进位。

function re = simuMultiply(a,b)
A = a - '0';
B = b - '0';
D = arrayfun(@(k) sum(diag(rot90(A'*B),k)),(1-numel(b)):(numel(a)-1));
for ii = length(D):-1:2
    D(ii-1) = D(ii-1) + floor(D(ii)/10);
    D(ii)   = mod(D(ii),10);
end
re = [int2str(D(1)) cast(D(2:end)+'0','char')];
end

二、卷积算法

卷积的概念这里就不解释了,每一位对应相乘后对应相加的意义恰好与卷积相通。

function re = convMultiply(a,b)
D = conv(a - '0',b-'0');
for ii = length(D):-1:2
    D(ii-1) = D(ii-1) + floor(D(ii)/10);
    D(ii)   = mod(D(ii),10);
end
re = [int2str(D(1)) cast(D(2:end)+'0','char')];
end

三、FFT快速算法

根据频域相乘等于时域卷积的原理,可以用FFT算法实现卷积。事实上,MATLAB中的卷积就是用FFT实现的。

function re = fftMultiply(a,b)
A = a - '0';
B = b - '0';
D = ifft(fft([zeros(size(B)) A]).*fft([zeros(size(A)) B]));
for ii = length(D):-1:2
    D(ii-1) = D(ii-1) + floor(D(ii)/10);
    D(ii)   = mod(D(ii),10);
end
re = [int2str(D(1)) cast(D(2:end-1)+'0','char')];
end

四、速度比较

a = randi([0,9],[1,1e5]);
a = num2str(a,'%d');
b = randi([0,9],[1,1e5]);
b = num2str(b,'%d');

%% 1000位×1000位乘法
tic;simuMultiply(a(1:1000),b(1:1000));toc
% 时间已过 7.239500 秒。
tic;convMulitply(a(1:1000),b(1:1000));toc
% 时间已过 0.002231 秒。
tic;fftMultiply(a(1:1000),b(1:1000));toc
% 时间已过 0.002402 秒。

%% 10000位×10000位乘法
tic;simuMultiply(a,b);toc
% Out of Memory,内存不足,无法计算
tic;convMulitply(a,b);toc
% 时间已过 0.260405 秒。
tic;fftMultiply(a,b);toc
% 时间已过 0.053287 秒。

总结:模拟计算的方法中间结果太多,内存占用大。卷积与FFT的方法占用内存小,速度相近,但总的来说,直接使用FFT更快。

易夕:MATLAB Tricks 专栏目录​zhuanlan.zhihu.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值