pub(super) fn modpow(x: &BigUint, exponent: &BigUint, modulus: &BigUint) -> BigUint {
assert!(
!modulus.is_zero(), "attempt to calculate with zero modulus!"
);
if modulus.is_odd() { // For an odd modulus, we can use Montgomery multiplication in base 2^32.
monty_modpow(x, exponent, modulus)
} else { // Otherwise do basically the same as `num::pow`, but with a modulus.
plain_modpow(x, &exponent.data, modulus)
}
}
fn plain_modpow(base: &BigUint, exp_data: &[BigDigit], modulus: &BigUint) -> BigUint {
assert!(
!modulus.is_zero(), "attempt to calculate with zero modulus!"
);
let i = match exp_data.iter().position(|&r| r != 0) {
None => return BigUint::one(),
Some(i) => i,
};
letmut base = base % modulus; for _ in0..i { for _ in0..big_digit::BITS {
base = &base * &base % modulus;
}
}
letmut r = exp_data[i]; letmut b = 0u8; while r.is_even() {
base = &base * &base % modulus;
r >>= 1;
b += 1;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.