Karatsuba乘法--实现大数相乘
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 * y1z1 = (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))/2
t = len(str(m)) - l
else:
l = len(str(n))/2
t = 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,d result_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
Karatsuba乘法--实现大数相乘的更多相关文章
- suseoj 1207: 大整数的乘法(java, 大数相乘, C/C++, 大数相乘)
1207: 大整数的乘法 时间限制: 1 Sec 内存限制: 128 MB提交: 7 解决: 2[提交][状态][讨论版][命题人:liyuansong] 题目描述 求两个不超过200位的非负整数 ...
- karatsuba乘法
karatsuba乘法 Karatsuba乘法是一种快速乘法.此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表.[1] 此算法主要用于两个 ...
- 大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- [转]大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- Java 大数相乘、大数相加、大数相减
思路来源:: https://blog.csdn.net/lichong_87/article/details/6860329 /** * @date 2018/6/22 * @description ...
- POJ 2389 Bull Math(水~Java -大数相乘)
题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...
- 大数相乘算法C++版
#include <iostream> #include <cstring> using namespace std; #define null 0 #define MAXN ...
- java版大数相乘
在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的 http://blog.csdn.net/jianzhibeihang/article/details/4948267 用j ...
- Linux C/C++ 编程练手 --- 大数相加和大数相乘
最近写了一个大数相乘和相加的程序,结果看起来是对的.不过期间的效率可能不是最好的,有些地方也是临时为了解决问题而直接写出来的. 可以大概说一下相乘和相加的解决思路(当然,大数操作基本就是两个字符串的操 ...
随机推荐
- python面向对象-1方法、构造函数
类是指:描述一种事物的定义,是个抽象的概念 实例指:该种事物的一个具体的个体,是具体的东西 打个比方: “人”是一个类.“张三”是人类的一个具体例子 在编程时也是同样的道理,你先自己定义一个“类”,当 ...
- DIV+CSS实战(二)
一.说明 在DIV+CSS实战(一)中,已经把框架搭建起来了,现在就需要往框架里面添加内容了.需要实现的内容如下图: 二.头部的设计(全媒体订阅) 左侧是一张图片+标题 ,右侧是登录名 和上次登录的时 ...
- 百度Webuploader 大文件分片上传(.net接收)
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
- 字符串转换成NSDate类型的 为nil解决方法
方法一 通过下列函数来解决 但是得到的日期会改变 修改方法fix - (NSDate *)timeForString:(NSString *)string { NSMut ...
- java的IO操作
转自http://zhangbaoming815.iteye.com/blog/1578438 将字符串写入到txt文件中import java.io.BufferedWriter; import j ...
- Shell编程-06-Shell中的if语句
目录 基本语法 if示例 在任何一门语言中,判断语句总是少不了,今天来学习一下Shell中的if语句. 基本语法 单分支情况 第一种语法 if <条件表达式> then 语句 fi ...
- (动态规划 01背包 打印路径) CD --UVA --624
链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87813#problem/G 每个CD的时间不超过 20没有哪个CD的时间是超过N ...
- jmap的几个操作要慎用
JDK中带有了一堆的工具是可以用来查看运行状况,排查问题的,但对于这些工具还是要比较清楚执行后会发生什么,否则有可能会因为执行了一个命令就导致严重故障,重点讲下影响比较大的jmap. 最主要的危险操作 ...
- TFlearn——(1)notMNIST
1, 数据集简介 notMNIST, 看名字就知道,跟MNIST脱不了干系,其实就是升级版的MNIST,含有 A-J 10个类别的艺术印刷体字符,字符的形状各异,噪声更多,难度比 MNIST 要 ...
- hdu 5024 最长的L型
http://acm.hdu.edu.cn/showproblem.php?pid=5024 找到一个最长的L型,L可以是斜着的 简单的模拟 #include <cstdio> #incl ...