多精度2-10进制下大整数运算python的实现(二)

多精度2-10进制下大整数模指数运算的实现

一、重复平方乘算法原理:

在这里插入图片描述

二、代码:(注:需调用上篇博客中Calculate的代码)

# coding=utf-8 #
import Calculate
import time

#分治递归求大数幂运算,然后求模的余,较复杂,耗时久
def help_( x:str, n:int):
        if n == 0:
            return '1'
        elif n==1:
            return x
        Mul = Calculate.BigMul(x, x, '10')
        if n % 2 == 0:  # 如果是偶数

            return help_(Mul, int(n /2))
        # 如果是奇数
        return Calculate.BigMul(help_(Mul, int((n - 1) / 2)), x, '10')

def Modular_operation(p:str,q:str,m:str):       #p为底数,q为指数的方幂,m为除数
    q=int(q)
    Mul=help_( p, q)
    _,_,r=Calculate.BigDivision(Mul,m,'10')
    return r


#求余运算,耗时短
def pow1(p:str,q:str,m:str):
    q=int(q)
    Mul='1'
    for i in range(q):
        Mul=Calculate.BigMul(Mul,p,'10')
        if (Calculate.Number_Comparision(Mul,m)>=0 ):       #判别中间乘积是否大于模
            _,_,Mul=Calculate.BigDivision(Mul, m, '10')     #大于模则先进行求余,以便减少计算量
    _,_, r = Calculate.BigDivision(Mul, m, '10')

    return r

#重复平方乘算法
def Repeated_square_multiplication_algorithm(p:str,q:str,m:str):
    k_list = []
    b = '1'
    if q=='0':
        return b
    P = p
    #将q用二进制表示,逆序存储在列表k_list中
    while (q!='0'):
        _,q,k=Calculate.BigDivision(q, '2', '10')
        k_list.append(k)
    if k_list[0]=='1':
        _,_,b=Calculate.BigDivision(q, m, '10')
    for i in range(1,len(k_list)):
        sqrt = Calculate.BigMul(P,P,"10")
        _,_,P=Calculate.BigDivision(sqrt, m, '10')
        if k_list[i]=='1':
            P_MUL_b=Calculate.BigMul(P,b,'10')
            _,_,b=Calculate.BigDivision(P_MUL_b,m,'10')     #更新b为b,P乘积模m的余
    return b


p=input("请输入指数的底:")
q=input("请输入指数的方幂:")
m=input("请输入除数:")
start_time=time.time()
r=Modular_operation(p,q,m)
end_time=time.time()
dtime=end_time-start_time
print(r)
print("(分值递归求幂运算再求余)程序运行时间:%.8s s" % dtime)  #显示到微秒
start_time1=time.time()
r1=pow1(p,q,m)
end_time1=time.time()
dtime1=end_time1-start_time1
print(r1)
print("(边求幂运算之积边求余)程序运行时间:%.8s s" % dtime1)  #显示到微秒
start_time3=time.time()
r3=Repeated_square_multiplication_algorithm(p,q,m)
end_time3=time.time()
dtime3=end_time3-start_time3
print(r3)
print("(重复平方乘算法)程序运行时间:%.8s s" % dtime3)  #显示到微秒
start_time2=time.time()
p=int(p)
q=int(q)
m=int(m)
mul=pow(p,q)
r2=mul%m
end_time2=time.time()
dtime2=end_time2-start_time2
print(r2)
print("(调用大数据库求余)程序运行时间:%.8s s" % dtime2)  #显示到微秒

三、运行结果截图:

示例一:253596 mod 654
在这里插入图片描述
示例二:2596 mod 1234
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那由塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值