• 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
     
  • 相关阅读:
    关于Xcode的Other Linker Flags
    ios开发――解决UICollectionView的cell间距与设置不符问题
    源码篇:MBProgressHUD
    ios中VRGCalendarView日历控件
    Xcode6与Xcode5中沙盒的变动以及偏好设置目录的变动
    开发者总结的WatchKit App提交技巧
    iOS开发周报-- 第一期
    selective gaussian blur /adaptive-blur
    hader特效——“Barrel Blur”的实现
    OpenCV——径向模糊
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/8656460.html
Copyright © 2020-2023  润新知