快速幂取模(python)

定理:要计算只包含加减乘的整数表达式除以整数m的余数时,可以在每步计算时对m取余

对于:a*a %n= (a%n) *(a%n) %n

解决 a*a %n 或 a**k %n 中 数据太大超出范围的问题

乘法求模数

对于

a*a%n

可以

#如果n*n的计算不超出数的范围
def multi(a,b,n):
	ans = 0;
   	ans=a%n
    ans=ans*(b%n)%n
    return ans
}
#如果超出范围
def multi(a,b,n):
    ans =0;
    while(b!=0):
        if(b%2==1)   #b为奇数 a*b=a*(b-1)+a
        	ans+=a
            ans=ans%n		#b-1为偶数 
        #a*b=(a*2%n) * b//2
        a*=2;
        a%n
        b=b//2;
    return ans

乘方取模数

a**k%n

1.一般

由于

a**k%n
=a%n* a**(k-1)%n  %n
=a*(a%n)%n* a**(k-2)%n  %n

代码

ans=1
for i in range(k):
	ans=ans*a%n
    
但指数k一次减1太慢

2.优化

a**k%n
k为奇数  指数变换
a**k%n
=a%n* a**(k-1)%n  %n
k为偶数
a**k%n	基数变换
=(a*a)**k/2 %n

奇数时指数k-1
偶数时基数a*a
n//2后不是奇数就是偶数
最后一次n=n//2 =0时 n一定为1
则最后一次执行操作一定会将结果保存到ans里

代码

def multimod(a,k,n):
    ans=1
    while(k!=0):  
        if k%2==1:         #奇数
            ans=ans*a%n
        a=a*a%n
        k=k//2          #整除2
    return ans
    

快速幂取模

将上面结合起来

def multimod(a,k,n):
    ans=1
    while(k!=0):  
        if k%2:         #奇数
            ans=multi(ans,a,n)
        a=multi(a,a,n)
        k=k//2          #整除2
    return ans
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值