forked from TheAlgorithms/Rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfast_power.rs
More file actions
29 lines (26 loc) · 727 Bytes
/
fast_power.rs
File metadata and controls
29 lines (26 loc) · 727 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// fast_power returns the result of base^power mod modulus
pub fn fast_power(mut base: usize, mut power: usize, modulus: usize) -> usize {
assert!(base >= 1);
let mut res = 1;
while power > 0 {
if power & 1 == 1 {
res = (res * base) % modulus;
}
base = (base * base) % modulus;
power >>= 1;
}
res
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test() {
const MOD: usize = 1000000007;
assert_eq!(fast_power(2, 1, MOD), 2);
assert_eq!(fast_power(2, 2, MOD), 4);
assert_eq!(fast_power(2, 4, MOD), 16);
assert_eq!(fast_power(3, 4, MOD), 81);
assert_eq!(fast_power(2, 100, MOD), 976371285);
}
}