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

news2024/11/27 8:21:05

文章目录

    • @[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, 则直接返回 0
    if 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 // 2

    high1, 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) + z0

    return res


x = 123456789012345678901234567890
y = 987654321098765432109876543210

res = karatsuba_multiply(x, y)

print(f'{x} * {y} = {res}')
123456789012345678901234567890 * 987654321098765432109876543210 = 1118682545728135594602764865374020721634181747367148900

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

System Verilog中的线程fork...join_none的#0时延

System Verilog 首先对fork…join_none里的线程进行调度,但是由于#0时延阻塞了当前线程,并且将它重新调度到当前时间片之后启动时延使得当前线程必须等到所有在fork…join_none语句中产生的线程执行完之后才得以运行。 program no_auto;initial beginfo…

二叉树练习day.3

104.二叉树的最大深度 链接:. - 力扣(LeetCode) 题目描述: 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root…

使用单点登录(SSO)如何提高安全性和用户体验

什么是单点登录(SSO) 对于所有大量采用云应用程序的组织来说,有效的身份管理是一个巨大的挑战,如果每个 SaaS 应用程序的用户身份都是独立管理的,则用户必须记住多个密码,技术支持技术人员在混合环境中管理…

JavaScript - 你遇到过哪几种Javascript的错误类型

难度级别:中级及以上 提问概率:50% 我们在开发Javascript代码的时候,经常一不小心就会遇到各种各样的异常,浏览器也会及时给出错误信息,那么一般会遇到哪几种异常情况呢,我们来看一下。 1 ReferenceError错误 ReferenceError几乎是最…

「漫画」数据工程师面试常见问题之数据倾斜

话说,闹钟一响,现实照进梦想,又是李大虎面试找工作的一天。 李大虎心里一直有个想法,如果一天睡20个小时,然后这20个小时全做美梦,醒来的4个小时用来吃喝拉撒,这样岂不就和那些富二代一样了&am…

网络基础——vrrp

前言:除了一个MPLS这个协议,其他的协议都差不多会在后面介绍,但是MPLS却不会介绍,因为自己本人学的不是很好,而且在企业网中,接触的机会也更少,除非是做ISP网络的,下面会先介绍VRRP和…

大学课堂点名程序

大学课堂点名程序 目录 main.py import tkinter as tk import pygame import csv import random from datetime import datetime from tkinter import messagebox from tkinter import simpledialog input_data="student1" def langDu(text):print(text)pygame.mi…

CSS常见样式

字体相关的样式 <style>div{/* 斜体 */font-style: italic;/* 加粗 100-900*/font-weight: 900;/* 字体大小 */font-size: 20px;/* 声明字体格式 */font-family: "微软雅黑";}</style> div内部文字垂直居中 只需要将行高设为其height的大小即可。 div{…

C语言高效的网络爬虫:实现对新闻网站的全面爬取

1. 背景 搜狐是一个拥有丰富新闻内容的网站&#xff0c;我们希望能够通过网络爬虫系统&#xff0c;将其各类新闻内容进行全面地获取和分析。为了实现这一目标&#xff0c;我们将采用C语言编写网络爬虫程序&#xff0c;通过该程序实现对 news.sohu.com 的自动化访问和数据提取。…

Golang 开发实战day06 - Boolean Conditional

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 教程06 - Boolean &a…

FIN和RST的区别,几种TCP连接出现RST的情况

一、RST跟FIN的区别&#xff1a; 正常关闭连接的时候发的包是FIN&#xff0c;但是如果是异常关闭连接&#xff0c;则发送RST包 两者的区别在于&#xff1a; 1.RST不必等缓冲区的包都发出去&#xff0c;直接就丢弃缓存区的包发送RST包。而FIN需要先处理完缓存区的包才能发送F…

前端自动化测试-Jest

前端自动化测试 Jest官网&#xff1a;https://jestjs.io 安装方式 npm install --save-dev jest yarn add --dev jest cnpm add --save-dev jest 使用方法 所有以 .test.js 结尾的都是测试文件 基础用法示例 num.js&#xff1a; export function getSum (a, b) {return a b…

Vulnhub:MHZ_CXF: C1F

目录 信息收集 arp-scan nmap nikto WEB web信息收集 dirmap gobuster ssh登录 提权 获得初始立足点 系统信息收集 横向渗透 提权 信息收集 arp-scan ┌──(root㉿ru)-[~/桌面] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:…

YOLOV9 + 双目测距

YOLOV9 双目测距 1. 环境配置2. 测距流程和原理2.1 测距流程2.2 测距原理 3. 代码部分解析3.1 相机参数stereoconfig.py3.2 测距部分3.3 主代码yolov9-stereo.py 4. 实验结果4.1 测距4.2 视频展示 相关文章 1. YOLOV5 双目测距&#xff08;python&#xff09; 2. YOLOv7双目…

智慧能耗预付费系统解决方案——用户侧能源计量及收费

安科瑞电气股份有限公司 祁洁 15000363176 一、方案组织架构 二、方案特点 &#xff08;1&#xff09;多样组网&#xff0c;多样设备接入&#xff0c;多样部署&#xff1b; &#xff08;2&#xff09;集团管理、项目分级、分层拓扑&#xff1b; &#xff08;3&#xff09…

三流大学毕业,物流专业转行自述:“从月薪4K到现在月入2W+,我做到了哪些?”

我是25岁转行学python的。说实在&#xff0c;转行就是奔着挣钱去的。希望我的经历可以给想转行的朋友带来一点启发和借鉴。 先简单介绍下个人背景&#xff0c;三流大学毕业&#xff0c;物流专业&#xff0c;学习能力一般&#xff0c;没啥特别技能&#xff0c;反正就很普通的一…

Linux使用宝塔面板部署Discuz结合内网穿透实现公网访问本地论坛

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

【LAMMPS学习】八、基本知识的讨论(1.3)从一个输入脚本运行多个模拟

8. 基本知识的讨论 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和…

二分查找 -- 力扣(LeetCode)第704题

题目 https://leetcode.cn/problems/binary-search/description/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例…

【STL】查找

#include<algorithm>binary_search 该函数功能是查找指定元素是否存在&#xff0c;存在返回true&#xff0c; 不存在返回false 函数原型&#xff1a;bool binary_search(iterator beg, iterator end, value); 注意&#xff1a;该函数内部通过二分查找实现&#xff0c;二…