karatsuba乘法
来源:互联网 发布:淘宝网手套 编辑:程序博客网 时间:2024/05/01 00:45
karatsuba乘法
Karatsuba乘法是一种快速乘法。此算法在1960年由Anatolii Alexeevitch Karatsuba 提出,并于1962年得以发表。[1] 此算法主要用于两个大数相乘。普通乘法的复杂度是n2,而Karatsuba算法的复杂度仅为3nlog3≈3n1.585(log3是以2为底的)[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 + 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)
0 0
- karatsuba乘法
- Karatsuba 乘法
- karatsuba乘法
- 乘法算法-Karatsuba算法
- Karatsuba algorithm乘法问题
- 乘法——Karatsuba乘法
- karatsuba乘法及相关实现
- 大整数乘法的Karatsuba算法实现
- KaraTsuba乘法——高效的大数乘法
- KaraTsuba乘法——高效的大数乘法
- 从大整数乘法的实现到 Karatsuba 快速算法
- Karatsuba Multiplication
- Karatsuba algorithm C++ implementation
- karatsuba算法——(分治算法)
- 乘法
- 乘法
- 乘法
- 乘法
- Eclipse中Maven管理的jar没有发布到WEB-INF/lib下的解决方案
- 共用数据保护(const 常量)
- hibernate反向生成奇葩错误
- leetcode-260. Single Number III
- hdu 5671 Matrix
- karatsuba乘法
- Activity销毁时返回数据
- 目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)
- c语言小项目个人实现
- JSONObject解析json字符串实现
- 使用快速傅里叶变换计算大整数乘法-代码
- hdu 5672 String
- Java基础二
- eclispse项目导入Android项目 java.lang.UnsatisfiedLinkError: Native method not found: