karatsuba乘法

Karatsuba乘法是一种快速乘法。此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表。[1]此算法主要用于两个大数相乘。普通乘法的复杂度是n2,而Karatsuba算法的复杂度仅为3nlog3≈3n1.585(log3是以2为底的)[2]。

目录

  1. 1 算法描述
  2. ▪ 步骤简介
  3. ▪ 实例展示
  4. 2 效率分析
  5. 3 伪代码描述

算法描述

编辑

步骤简介

Karatsuba算法主要应用于两个大数的相乘,原理是将大数分成两段后变成较小的数位,然后做3次乘法,并附带少量的加法操作和移位操作。
现有两个大数,x,y。
首先将x,y分别拆开成为两部分,可得x1,x0,y1,y0。他们的关系如下:
x = x1 * 10m + x0;
y = y1 * 10m + y0。其中m为正整数,m < n,且x0,y0 小于 10m。
那么 xy = (x1 * 10m + x0)(y1 * 10m + y0)
=z2 * 102m + z1 * 10m + z0,其中:
z2 = x1 * y1;
z1 = x1 * y0 + x0 * y1;
z0 = x0 * y0。
此步骤共需4次乘法,但是由Karatsuba改进以后仅需要3次乘法。因为:
z1 = x1 * y0+ x0 * y1
z1 = (x1 + x0) * (y1 + y0) - x1 * y1 - x0 * y0,
故z1 便可以由一次乘法及加减法得到。

实例展示

设x = 12345,y=6789,令m=3。那么有:
12345 = 12 * 1000 + 345;
6789 = 6 * 1000 + 789。
下面计算:
z2 = 12 * 6 = 72;
z0 = 345 * 789 = 272205;
z1 = (12 + 345) * (6 + 789) - z2 - z0 = 11538。
然后我们按照移位公式(xy = z2 * 10 + z1 * 10 + z0)可得:
xy = 72 * 10002 + 11538 * 1000 + 272205 = 83810205。

效率分析

编辑

对于给定的n位大数,算法的复杂度不超过3nlog3 ≈ 3n1.585。

伪代码描述

编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
procedurekaratsuba(num1,num2)
if(num1<10)or(num2<10)
returnnum1*num2
/*calculatesthesizeofthenumbers*/
m=max(size(num1),size(num2))
m2=m/2
high1,low1=split_at(num1,m2)
high2,low2=split_at(num2,m2)
/*3callsmadetonumbersapproximatelyhalfthesize*/
z0=karatsuba(low1,low2)
z1=karatsuba((low1+high1),(low2+high2))
z2=karatsuba(high1,high2)
return(z2*10^(m))+((z1-z2-z0)*10^(m/2))+(z0)

转载于:https://www.cnblogs.com/freeopen/p/5482949.html

karatsuba乘法相关推荐

  1. Karatsuba乘法--实现大数相乘

    Karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.此算法主要用于两个大数相乘 ...

  2. 设计一个程序实现两个任意长的整数的求和运算_深入 Python (7) Karatsuba 实现长整数乘法...

    Python 的长整数乘法使用了 Karatsuba 算法,昨天写的比较粗,今天仔细研究了下它的实现,真是妙啊. 多项式乘法 在一切开始之前,需要回顾多项式乘法公式: (a + b)(c + d) = ...

  3. karatsuba算法(大整数乘法)

    Karatsuba算法 Karatsuba算法主要应用于两个大数的相乘,原理是将大数分成两段后变成较小的数位,然后做3次乘法,并附带少量的加法操作和移位操作. 可以将X,Y,分开来计算,同时对于AD+ ...

  4. 计算传递函数乘法_软件开发教程:计算机科学最重要的32个算法

    软件开发的根本在于解决各种业务功能需要,实现数字化和自动化,而算法(Algorithm)是对解决方案的准确而完整的描述,是一系列解决问题的清晰指令.算法代表着用系统的方法描述解决问题的策略机制.在计算 ...

  5. 计算机大数乘法引发的思考 | CSDN 博文精选

    作者 | dog250 责编 | 屠敏 出品 | CSDN博客 近日,看了小小的一道学而思数学作业: 计算 201×33×707+484×636321×33×707+484×6363 我知道肯定是把数 ...

  6. 大整数乘法的5种方法

    模拟小学乘法:最简单的乘法竖式手算的累加型: 分治乘法:最简单的是Karatsuba乘法,一般化以后有Toom-Cook乘法: 快速傅里叶变换FFT:(为了避免精度问题,可以改用快速数论变换FNTT) ...

  7. 【算法】大数乘法问题及其高效算法

    题目 编写两个任意位数的大数相乘的程序,给出计算结果.比如: 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 和 123 输出: 输出乘积,如:15185 ...

  8. 计算机大数乘法引发的思考

    国庆假期最后一天,看了小小的一道学而思数学作业: 计算 201×33×707+484×6363201\times 33\times 707+484\times 6363201×33×707+484×6 ...

  9. 你知道几种乘法的计算方式?

    前言 家里有本<算法详解>一直没有看,昨天晚上打开翻了翻,觉得写的挺有趣的,第一章讨论了一个大家都学过的内容,乘法的计算.大部分人计算乘法,应该都只有一种方式,乘法的计算,也算是一种算法, ...

最新文章

  1. Rocksdb 的 BlobDB key-value 分离存储插件
  2. 【iOS】NSDate分类,获得中国农历
  3. 软件开发是一门手艺活
  4. UVA10970大块巧克力
  5. 【PC工具】chrome浏览器插件vimium:传说上网可以不用鼠标。VIM入门工具,妈妈再也不用担心我学不会vim了...
  6. 为 Neutron 准备物理基础设施(II) - 每天5分钟玩转 OpenStack(76)
  7. 大数据技术之kafka (第 3 章 Kafka 架构深入 ) offset讲解
  8. html jsf ajax blur,是否可以使用JSF ajax更新非JSF组件(纯HTML)?
  9. c语言sort函数排序二维数组,关于C++ 的 sort 对二维数组排序。该如何解决
  10. 已获千赞,从理论到实践!
  11. 生成式预训练之MASS
  12. 谷歌推出一款72个量子比特的通用量子计算机
  13. 防止用户删除数据库表
  14. 5G~ SON和MDT
  15. html图片热区map、area的使用
  16. 太用力的人跑不远,android开发视频
  17. Git、GitHub、Gitee、GitLab的学习
  18. 性能优化的指标和工具
  19. 关于10G/40G/100G数据中心光纤布线知识
  20. GNU Radio系列教程(三):初级篇之GNU Radio GRC流图

热门文章

  1. *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)
  2. java读取yaml配置文件,snakeyaml读取yaml配置文件
  3. java位操作_关于java按位操作运算
  4. 乐乐勇智能教育机器人有多少型号_【头条】协作机器人平台化趋势将会是柔性自动化的破局之道...
  5. java的md5盐值加密_MD5盐值加密
  6. leetcode1047. 删除字符串中的所有相邻重复项(栈的日常应用)
  7. python学习实例(5)
  8. C++:12---运算符重载
  9. 二级c语言评分标准一样吗,计算机二级评分严格吗 步骤错了有分吗
  10. mysql 源码 缓存_MySQL源码:MYSQL存储过程/函数的分析原理及缓存机制