Ich schreibe eine effiziente Quadrierung Methode in Rust. Nehmen wir an, dass die Mul
Eigenschaft von AbstractNumber
eine Blackbox ist und dass wir nur sichere, idiomatische Rust erlauben.Schreiben einer effizienten Power-Funktion in Rust
Unten ist ein erster Durchgang, der wiederholte Quadrierung für größere Indizes verwendet. Ich bin mir nicht sicher, wie LLVM Rust arithmetische Methodenaufrufe wie checked_next_power_of_two()
übersetzen wird.
Sieht das Folgende vernünftig aus? Wäre es effizienter, den kleineren Zweig in seine eigene Inline-Funktion zu zerlegen?
/// Compute an integer power of this number efficiently with repeated squaring.
pub fn pow(&self, n: u32) -> AbstractNumber {
let optimization = 5;
if n < optimization {
let mut x = Complex::one();
for _ in 0..n {
x *= *self;
}
x
} else {
// l = floor(log_2(n)), r = n - 2^l
let (l, r) = if n.is_power_of_two() {
(n.trailing_zeros(), 0)
} else {
let p = n.checked_next_power_of_two().unwrap().trailing_zeros() - 1;
(p, n - 2u32.pow(p))
};
let mut x = *self;
for _ in 0..l {
x *= x;
}
self.pow(r) * x
}
}
Danke - ich werde das verwenden. –