问题描述:
用分治思想设计一个有效的算法,
-
可以进行两个n位大整数的乘法运算?
-
并计算其时间复杂度?(要求写出递推公式,及其求解过程)
代码如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 12 13:08:03 2022
@author: Dell
"""
from math import log2, ceil
def pad(string: str, real_len: int, max_len: int) -> str:
pad_len: int = max_len - real_len
return f"{'0' * pad_len}{string}"
def mul(n1: int, n2: int) -> int:
if n1 < 10 or n2 < 10:
return n1 * n2
n1_str: str = str(n1)
n2_str: str = str(n2)
n1_len: int = len(n1_str)
n2_len: int = len(n2_str)
real_len: int = max(n1_len, n2_len)
max_len: int = 2 ** ceil(log2(real_len))
mid_len: int = max_len >> 1
n1_pad: str = pad(n1_str, n1_len, max_len)
n2_pad: str = pad(n2_str, n2_len, max_len)
p: int = int(n1_pad[:mid_len])
q: int = int(n1_pad[mid_len:])
r: int = int(n2_pad[:mid_len])
s: int = int(n2_pad[mid_len:])
u: int = mul(p, r) #用递归开始分段相乘
v: int = mul(q-p, r-s)
w: int = mul(q, s)
return u * 10 ** max_len + (u+v+w) * 10 ** mid_len + w
if __name__=='__main__':
n1 = 123456789
n2 = 987654321
print('第一个数为:',n1)
print('第二个数为:',n2)
print('计算结果为:',mul(n1, n2))
递推公式:
- 还有一种方法,是将大整数分为三段来计算,这样会使计算次数变为n2/9,但是在大基数下,根据主定理来说,时间复杂度还是O(n2),所有不是很推荐。