【分治算法】大整数乘法Python实现

文章目录

    • @[toc]
      • 问题描述
      • 基础算法
        • 时间复杂性
      • 优化算法
        • 时间复杂性
      • `Python`实现

因上努力

个人主页:丷从心.

系列专栏:Python基础

学习指南:Python学习指南

果上随缘


问题描述

  • X X X Y Y Y都是 n n n位二进制整数,计算它们的乘积 X Y XY XY

基础算法

  • n n n位二进制整数 X X X Y Y Y都分为 2 2 2段,每段的长为 n / 2 n / 2 n/2位(假设 n n n 2 2 2的幂)
    • X = A × 2 n / 2 + B X = A \times 2^{n / 2} + B X=A×2n/2+B
    • Y = C × 2 n / 2 + D Y = C \times 2^{n / 2} + D Y=C×2n/2+D
    • X Y = ( A × 2 n / 2 + B ) ( C × 2 n / 2 + D ) = A C × 2 n + ( A D + B C ) × 2 n / 2 + B D XY = (A \times 2^{n / 2} + B)(C \times 2^{n / 2} + D) = AC \times 2^{n} + (AD + BC) \times 2^{n / 2} + BD XY=(A×2n/2+B)(C×2n/2+D)=AC×2n+(AD+BC)×2n/2+BD
时间复杂性
  • 如果按此式计算 X Y XY XY,必须进行 4 4 4 n / 2 n / 2 n/2位整数的乘法, 3 3 3次不超过 2 n 2n 2n位的整数加法,以及 2 2 2次移位,所有这些加法和移位共用 O ( n ) O(n) O(n)步运算

T ( n ) = { O ( 1 ) n = 1 4 T ( n / 2 ) + O ( n ) n > 1 T(n) = \begin{cases} O(1) & n = 1 \\ 4 T(n / 2) + O(n) & n > 1 \end{cases} T(n)={O(1)4T(n/2)+O(n)n=1n>1

T ( n ) = O ( n 2 ) T(n) = O(n^{2}) T(n)=O(n2)


优化算法

  • 要想改进算法的计算复杂性,必须减少乘法次数,把 X Y XY XY写成另一种形式
    • X Y = A C × 2 n + ( ( A − B ) ( D − C ) + A C + B D ) × 2 n / 2 + B D XY = AC \times 2^{n} + ((A - B)(D - C) + AC + BD) \times 2^{n / 2} + BD XY=AC×2n+((AB)(DC)+AC+BD)×2n/2+BD
时间复杂性
  • 需做 3 3 3 n / 2 n / 2 n/2位整数的乘法, 6 6 6次加减法和 2 2 2次移位

T ( n ) = { O ( 1 ) n = 1 3 T ( n / 2 ) + O ( n ) n > 1 T(n) = \begin{cases} O(1) & n = 1 \\ 3 T(n / 2) + O(n) & n > 1 \end{cases} T(n)={O(1)3T(n/2)+O(n)n=1n>1

T ( n ) = O ( n log ⁡ 3 ) = O ( n 1.59 ) T(n) = O(n^{\log{3}}) = O(n^{1.59}) T(n)=O(nlog3)=O(n1.59)


Python实现

def karatsuba_multiply(x, y):# 如果乘数之一为 0, 则直接返回 0if x == 0 or y == 0:return 0# 将乘数转换为字符串, 并获取它们的位数x_str = str(x)y_str = str(y)n = max(len(x_str), len(y_str))# 达到基本情况时, 使用传统的乘法if n == 1:return x * y# 将乘数补齐到相同的位数x_str = x_str.zfill(n)y_str = y_str.zfill(n)# 将乘数划分为两部分m = n // 2high1, low1 = int(x_str[:m]), int(x_str[m:])high2, low2 = int(y_str[:m]), int(y_str[m:])# 递归地计算三个乘法z0 = karatsuba_multiply(low1, low2)z1 = karatsuba_multiply((low1 + high1), (low2 + high2))z2 = karatsuba_multiply(high1, high2)# 计算结果res = (z2 * 10 ** (2 * m)) + ((z1 - z2 - z0) * 10 ** m) + z0return resx = 123456789012345678901234567890
y = 987654321098765432109876543210res = karatsuba_multiply(x, y)print(f'{x} * {y} = {res}')
123456789012345678901234567890 * 987654321098765432109876543210 = 1118682545728135594602764865374020721634181747367148900

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/599620.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp - 微信小程序 - 使用uCharts的一些问题

文章目录 uniapp - 微信小程序 - 使用uCharts的一些问题一、开发者工具显示正常,真机调试统计图不随页面滚动二、数据过多开启滚动条,无法滑动滚动条三、饼图点击不显示提示窗/点击位置bug、多个同类型统计图点击不显示提示框问题四、 formatter 自定义 …

AURORA64B66B IP核使用

文章目录 前言一、IP核配置二、设计框图三、上板效果总结 前言 前面我们基于GT 64B66B设计了自定义PHY层,并且也介绍过了基于AURORA8B18B IP核的使用,AURORA8B18B IP核的使用可以说是与AURORA8B18B IP核完全一致,可参考前文:http…

simulink 的stm32 ADC模块输出在抽筋,不知为何

% outtypecast(uint16(1000),uint8) % 10003E8,E8232,out232 3 function [y,len] myfcn(u1) headuint8([255 85]);%帧头 out1typecast(uint16(u1),uint8); % out2typecast(uint16(u2),uint8); y[head,out1]; lenuint16(length(y)); 2023b版本,stm32硬件支持…

探索数据中心系统功能架构的演进与未来

随着信息技术的快速发展和数据规模的爆炸性增长,数据中心已经成为现代社会不可或缺的基础设施之一。数据中心系统功能架构的设计和演进对于数据中心的性能、效率和安全至关重要。本文将探讨数据中心系统功能架构的演进历程以及未来发展趋势。 随着云计算、大数据、…

IntelliJ IDEA - Since Maven 3.8.1 http repositories are blocked

问题描述 新下载的 IDEA 在构建项目时,在下载引用的包时出现 “Since Maven 3.8.1 http repositories are blocked” 的问题。 原因分析 从 Maven 3.8.1 开始,不再支持 http 的包了。由于现在对网络安全的日益重视,都在向 https 转变&#…

服务器主机安全受到危害的严重性

为了让小伙伴们了解到服务器主机安全受到危害的严重性,以下详细说明一下:1. 数据泄露:如果服务器主机遭受攻击,攻击者可能会窃取敏感数据,如用户数据、商业秘密、机密文件等,导致数据泄露和商业机密的泄漏。…

鸿蒙(HarmonyOS)APP开发实战课程(入门到精通)

2024培训课程 2024技术交流群 CSDN在线课程地址: https://edu.csdn.net/course/detail/39448 推荐阅读 鸿蒙Harmony OS核心架构 鸿蒙内核源码分析(系统调用篇) 鸿蒙(HarmonyOS)APP开发培训课程 鸿蒙(HarmonyOS)APP开发实战课程 鸿蒙系统(HarmonyOS&#xff0…

PCF8591(ADDA转换芯片)

工具 1.Proteus 8 仿真器 2.keil 5 编辑器 原理图 讲解 PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行IC总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接…

RabbitMQ Docker 安装与应用

1.官方镜像 该镜像包含用户操作界面 2.Docker运行,并设置开机自启动 docker run -d --restartalways --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management 默认登录账户和密码 guest 3、使用 队列和交换机绑定

2024/4/1—力扣—栈的最小值

代码实现: typedef struct node {int val;struct node *next; } Node;typedef struct {struct node *top;int min; } MinStack;/** initialize your data structure here. */MinStack* minStackCreate() {MinStack *obj malloc(sizeof(*obj));obj->top NULL;ob…

手机软件何时统一--桥接模式

1.1 凭什么你的游戏我不能玩 2007年苹果手机尚未出世,机操作系统多种多样(黑莓、塞班、Tizen等),互相封闭。而如今,存世的手机操作系统只剩下苹果OS和安卓,鸿蒙正在稳步进场。 1.2 紧耦合的程序演化 手机…

【c语言】strncpy函数模拟实现

strncpy函数模拟实现 strncpy函数在cplusplus网站中的定义 模拟实现源码 //模拟实现 #include <stdio.h> #include <string.h> #include <assert.h>char* my_strncpy(char* destination, const char* source, size_t num) {assert(destination && so…