From: Simon Tatham Date: Sat, 12 Apr 2025 07:22:30 +0000 (+0100) Subject: Don't keep recomputing levels during multiplication X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=b268e5f21b896178c805575f78616b5ce55ea1b3;p=nimber.git Don't keep recomputing levels during multiplication --- diff --git a/src/finitenimber.rs b/src/finitenimber.rs index 58e403e..52c830d 100644 --- a/src/finitenimber.rs +++ b/src/finitenimber.rs @@ -316,12 +316,8 @@ impl<'a> FiniteNimberRef<'a> { None => self.into(), } } -} -impl<'a, 'b> Mul> for FiniteNimberRef<'b> { - type Output = FiniteNimber; - fn mul(self, other: FiniteNimberRef<'a>) -> FiniteNimber { - let level = max(self.level(), other.level()); + fn mul_recurse(self, other: FiniteNimberRef<'a>, level: usize) -> FiniteNimber { match level.checked_sub(1) { Some(sublevel) => { let (alo, ahi) = self.split(sublevel); @@ -341,6 +337,14 @@ impl<'a, 'b> Mul> for FiniteNimberRef<'b> { } } +impl<'a, 'b> Mul> for FiniteNimberRef<'b> { + type Output = FiniteNimber; + fn mul(self, other: FiniteNimberRef<'a>) -> FiniteNimber { + let level = max(self.level(), other.level()); + self.mul_recurse(other, level) + } +} + impl_binop_wrappers!(Add, add); impl_binop_wrappers!(Sub, sub); impl_binop_wrappers!(Mul, mul);