Karatsuba乘法

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

算法介绍

步骤简介

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^(2m) + z1 * 10^(m) + z0)可得:
xy = 72 * 10002 + 11538 * 1000 + 272205 = 83810205。
#-*- coding:utf-8 -*-
import math
n=long(input())
m=long(input())l=0
t=0
if len(str(n))<len(str(m)):l = len(str(m))/2t = len(str(m)) - l
else:l = len(str(n))/2t = len(str(n)) - l
a=long(n/(math.pow(10,t)))
b=long(n%(math.pow(10,t)))
c=long(m/(math.pow(10,t)))
d=long(m%(math.pow(10,t)))print a,b,c,dresult_1=long(a*c)
result_2=long(b*d)
result_3=long(a+b)*long(c+d)-long(result_1)-long(result_2)
print result_1,result_2,result_3
result=long(result_1*math.pow(10,2*t))+long(result_3*math.pow(10,t))+long(result_2)
print result
print m*n

转载于:https://www.cnblogs.com/ybf-yyj/p/8656460.html

Karatsuba乘法--实现大数相乘相关推荐

  1. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  2. karatsuba乘法

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

  3. 大数相乘(C语言,分治算法)

    问题: 由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算.大数运算主要有加.减.乘三种方法. 下面就 ...

  4. 大数相乘、大数相加、大数相减Java版本

    为什么80%的码农都做不了架构师?>>>    题目:两个非常大的数字相乘(相加,相减) 该题目在java中可以使用BigInteger类中的方法来实现.否则的话可以使用如下方式来实 ...

  5. 大数相乘(c语言/c++)

    大数相乘(c语言/c++) 方法一:做加法 方法二.做乘法 方法一:做加法 思路:模拟竖乘过程.将num2从后往前一个一个的去乘num1.然后累加.在累加的时候记得在末尾补0.补的0的个数就是第二个字 ...

  6. 算法题-大数相乘问题

    今天在网上看到一个大数相乘的问题,题目是这样的:输入两个整数,要求输出这两个数的乘积.输入的数字可能超过计算机内整形数据的存储范围. 分析: 由于数字无法用一个整形变量存储,很自然的想到用字符串来表示 ...

  7. 大数相乘(数组表示)

    大数相乘 首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到 ...

  8. 历届试题 矩阵翻硬币 蓝桥杯 大数开方 大数相乘

    历届试题 矩阵翻硬币   时间限制:1.0s   内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬 ...

  9. 超大数相乘的java代码,java版大数相乘

    在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 用java搞了一个版本 这里说一下思路 将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次 ...

最新文章

  1. 为了孩子上名校,他们发论文给子女署名,Nature发文报道韩国学术不当行为
  2. vue 多页面iframe不刷新_Vue中iframe保持活动状态(不刷新)
  3. Boost库学习(0)
  4. 东北全面放开生育,数据揭秘人口和GDP和房价间联系
  5. 更新项目经常使用的Linux命令
  6. Linux学习之第二课时--linux命令格式及命令概述
  7. Heroku和Java –从新手到初学者,第2部分
  8. php 变量 可用拼音表示,php汉字转拼音的示例
  9. Oracle 数据怎么实时同步到 SQL Server | 亲测干货分享建议收藏
  10. 计算坐标点的距离计算机公式,计算两个GPS坐标点的距离
  11. 资源放送丨《基于IB网络的Oracle Extend RAC最佳实践》PPT视频
  12. CSS绝对定位absolute元素的初始包含块不是body元素,也不是html元素
  13. [流媒体]Android 播放HLS/RTSP的原生类库 MediaPlayer
  14. neo4j︱Cypher完整案例csv导入、关系联通、高级查询(三)
  15. FLV格式视频转换成MP4格式教程
  16. sql连表查询、子查询、组合查询
  17. 高仿今日头条视频列表功能
  18. ctfshow 爆破(web入门)
  19. c++实现经典游戏贪吃蛇(超详解)
  20. tableau通过集动作改变突出显示

热门文章

  1. Kotlin Android (从零开始一个项目)
  2. 小程序textarea在ios中内边距的解决办法
  3. 一个研三女人想告诉后辈的事!
  4. 测绘计算机编程心得体会,测绘心得体会
  5. 【JoJo的摄影笔记】百年尼康——相机之殇
  6. 十大家用投影仪排名,什么牌子的投影仪质量最好?
  7. 免费影像数据下载网站汇总——2010年7月28[转自ESRI中国]
  8. spring integration-概述
  9. 1095 解码PAT准考证
  10. 数据库大赛50强之「中国人民大学」:培养工程性精英人才,共筑数据库美好未来