大数算法

当程序计算的两个数字的乘积超过了基本类型的表示范围,可以使用Karatsuba算法,即采用分治的思想。

Karatsuba于1960年发明在 O ( n log ⁡ 2 3 ) {\rm O}(n^{\log 2^3 } ) O(nlog23) 步骤内将两个n位数相乘的Karatsuba算法。它反证了安德雷·柯尔莫哥洛夫于1956年认为这个乘法需要 Ω ( n 2 ) \Omega (n^{2}) Ω(n2) 步骤的猜想。
在这里插入图片描述

代码如下

def karatsuba_mul(num2,num2):
	if len(str(num1))==1 or len(str(num2))==1:
		return num1*num2
    n=max(len(str(num1)),len(str(num2)))
    half=n//2
    a=num1//10**half
    b=num1%10**half
    c=num2//10**half
    d=num2%10**half
    ac=karatsuba_mul(a,c) #计算a*c
    bd=karatsuba_mul(b,d) #计算b*d
    abcd=karatsuba_mul(a+b,c+d) #计算(a+b)*(c+d)
    adbc=abcd-ac-bd
    return ac*10**(2*half)+adbc*10**half+bd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值