pub fn modular_exponent<T: PrimInt>(base: T, exponent: T, modulo: T) -> T
computes base^exponent % modulo using the standard exponentiation by squaring algorithm