快速幂
Fast Power
TypeScript
export function fastPow(a: number, n: number): number {
const $ = BigInt
const MOD = $(1e9 + 7)
let b = $(a) % MOD
let res = 1n
while (n) {
if (n % 2 === 1) res = (res * b) % MOD
b = (b * b) % MOD
n = Math.trunc(n / 2)
}
return Number(res % MOD)
}
JavaScript
export function fastPow(a, n) {
const $ = BigInt
const MOD = $(1e9 + 7)
let b = $(a) % MOD
let res = 1n
while (n) {
if (n % 2 === 1) res = (res * b) % MOD
b = (b * b) % MOD
n = Math.trunc(n / 2)
}
return Number(res % MOD)
}
Rust
pub fn fast_pow(a: i64, mut n: i64, m: i64) -> i64 {
let mut b = a % m;
let mut res = 1;
while n > 0 {
if n & 1 == 1 {
res = (res * b) % m;
}
b = (b * b) % m;
n = n / 2;
}
return res % m;
}
Java
class Fastpow {
public static long fastpow(long a, long b, long MOD) {
long base = a % MOD, res = 1;
while (b != 0) {
if ((b & 1) == 1) {
res = res * base % MOD;
}
base = base * base % MOD;
b >>>= 1;
}
return res % MOD;
}
public static long fastpow(long a, long b) {
int MOD = (int) 1e9 + 7;
return fastpow(a, b, MOD);
}
}
Python
# python 的 built-in pow 自带快速幂
# pow(base, exp, mod) Go
package algo
func FastPow(a, n, m int64) int64 {
b := a % m
res := int64(1)
for n > 0 {
if n&1 == 1 {
res = (res * b) % m
}
b = b * b % m
n = n / 2
}
return res % m
}