zoukankan      html  css  js  c++  java
  • 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 * 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))/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
     
  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/8656460.html
Copyright © 2011-2022 走看看