use num_bigint::BigUint; pub fn powm(base: &BigUint, exp: &BigUint, modulus: &BigUint) -> BigUint { let zero = BigUint::from(0u32); let one = BigUint::from(1u32); let two = BigUint::from(2u32); let mut exp = exp.clone(); let mut result = one.clone(); let mut base = base % modulus; while exp > zero { if &exp % &two == one { result = (result * &base) % modulus; } exp >>= 1; base = (&base * &base) % modulus; } result }