(快速幂)(数论)

数论

对于像Java也不能处理的大数,存在的问题:一数字大,二计算时间长
对于幂数来说,很容易想到快速幂的办法来解决:

int f(int a,int n)
{
    if(n==1) return 0;
    int t=f(a,n/2);  //分治
    if(n%2==1)     //奇数情况
        return t*t*a;
    else return t*t;//偶数情况
}

更好的一种位运算做快速幂,时间复杂度也是O(log2 n)
a11= a8+ a2+ a1
11: 1011 (二进制)
11= 8+0+2+1

这个判断利用二进制的位运算很容易判断:
1)n&1,取最后一位,并判断是否是0
2)n>>1,把n右移一位,去掉n的最右面的一位

int f(int a,int n)
{
    int t=a;//不定义也可以
    int r=1;//返回结果
    while(n)
    {
        if(n&1) r*=t;//如果n的这个地方是1,就需要乘以
        t*=t;//2,4,8,,,
        n>>1;//去掉刚刚处理过的一位
        
    }
    return r;
}

快速幂常常涉及到大数,这样的题目通常还会使用取模操作
这里,anmod m=(a mod m)n mod m

 if(n&1) 
    r = (t*r) % mod ;
  t = (t*t) % mod;

矩阵快速幂:

运用了线性代数的知识矩阵乘法.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值