快速幂

快速幂

什么是快速幂

顾名思义,快速幂就是跑得特别快的算一个数几次方的的运算。

朴素算法

an a n 的值

for (int i = 1; i <= n; i++) {
    res *= a;
}

显然,复杂度是O( n n )的,这显然不是十分快速的算法。

利用cmath库

res = pow(a, b);

告诉你,实际上它的复杂度也不是很健康,可能不如你的朴素算法快

快速幂

快速幂的速度到底有都快呢

an的值,只需要O( logn l o g n )的时间。

快速幂是如何实现的呢

an a n 的值,我们思考一个问题。

如果 n n 是一个偶数:
an = a×a×a...×a a × a × a . . . × a ( n n a) = a2×a2×...×a2 a 2 × a 2 × . . . × a 2 ( n/2 n / 2 a2 a 2 )

如果 n n 是一个奇数 :
an = an1×a a n − 1 × a ,之后就转化成了偶数的问题。

这样,我们不难发现,每进行一次偶数操作, n n 的值都会变为原来的一半,这样,我们就可以在O(logn)的时间内求出 an a n 的值了。

递归代码:(求 an a n )

int Kasumi(int n) {
    if (n == 0) {
        return 1;
    }
    int res = Kasumi(n / 2);
    res = res * res;
    if (n % 2 == 1) {
        res *= a;
    }
    return res;
}

非递归代码:(求 an a n )

int Kasumi(int n) {
    int res = 1, base = a;
    while (n) {
        if (b % 2 == 1) {
            ans *= base;
        }
        base *= base;
        b /= 2;
    }
    return res;
}

如果需要取膜呢?

前提知识储备

a×b a × b % c c = (a % c c ) × × ( b b % c) % c c

然后就没什么了

递归代码:(求an % mod m o d )

int Kasumi(int n) {
    if (n == 0) {
        return 1;
    }
    int res = Kasumi(n / 2);
    res = res * res % mod;
    if (n % 2 == 1) {
        res = (res * a) % mod;
    }
    return res;
}

非递归代码:(求 an a n % mod m o d )

int Kasumi(int n) {
    int res = 1, base = a;
    while (n) {
        if (b % 2 == 1) {
            ans = (ans * base) % mod;
        }
        base = (base * base) % mod;
        b /= 2;
    }
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值