Skip to content

Commit 17ae741

Browse files
authored
Use Bernstein-Yang for BoxedMontyForm::invert (#494)
Results in a massive performance improvement: Boxed Montgomery arithmetic/invert, U256 time: [273.74 µs 274.79 µs 275.90 µs] change: [-95.729% -95.714% -95.696%] (p = 0.00 < 0.05) Performance has improved.
1 parent a5663d7 commit 17ae741

File tree

1 file changed

+4
-19
lines changed
  • src/modular/boxed_monty_form

1 file changed

+4
-19
lines changed

src/modular/boxed_monty_form/inv.rs

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
33
use super::{BoxedMontyForm, BoxedMontyParams};
44
use crate::{
5-
modular::{reduction::montgomery_reduction_boxed_mut, BoxedBernsteinYangInverter},
6-
Invert, Inverter, PrecomputeInverter, PrecomputeInverterWithAdjuster,
5+
modular::BoxedBernsteinYangInverter, Invert, Inverter, PrecomputeInverter,
6+
PrecomputeInverterWithAdjuster,
77
};
88
use core::fmt;
99
use subtle::CtOption;
@@ -15,23 +15,8 @@ impl BoxedMontyForm {
1515
/// Computes `self^-1` representing the multiplicative inverse of `self`.
1616
/// I.e. `self * self^-1 = 1`.
1717
pub fn invert(&self) -> CtOption<Self> {
18-
let (mut inverse, is_some) = self.montgomery_form.inv_odd_mod(&self.params.modulus);
19-
20-
let mut product = inverse.mul(&self.params.r3);
21-
22-
montgomery_reduction_boxed_mut(
23-
&mut product,
24-
&self.params.modulus,
25-
self.params.mod_neg_inv,
26-
&mut inverse,
27-
);
28-
29-
let value = Self {
30-
montgomery_form: inverse,
31-
params: self.params.clone(),
32-
};
33-
34-
CtOption::new(value, is_some)
18+
let inverter = self.params.precompute_inverter();
19+
inverter.invert(self)
3520
}
3621
}
3722

0 commit comments

Comments
 (0)