pub struct Wnaf<W, B, S> { /* private fields */ }
Expand description
A “w-ary non-adjacent form” scalar multiplication (also known as exponentiation) context.
§Examples
This struct can be used to implement several patterns:
§One base, one scalar
For this pattern, you can use a transient Wnaf
context:
use group::Wnaf;
let result = Wnaf::new().scalar(&scalar).base(base);
§Many bases, one scalar
For this pattern, you create a Wnaf
context, load the scalar into it, and then
process each base in turn:
use group::Wnaf;
let mut wnaf = Wnaf::new();
let mut wnaf_scalar = wnaf.scalar(&scalar);
let results: Vec<_> = bases
.into_iter()
.map(|base| wnaf_scalar.base(base))
.collect();
§One base, many scalars
For this pattern, you create a Wnaf
context, load the base into it, and then process
each scalar in turn:
use group::Wnaf;
let mut wnaf = Wnaf::new();
let mut wnaf_base = wnaf.base(base, scalars.len());
let results: Vec<_> = scalars
.iter()
.map(|scalar| wnaf_base.scalar(scalar))
.collect();
§Many bases, many scalars
Say you have n
bases and m
scalars, and want to produce n * m
results. For this
pattern, you need to cache the w-NAF tables for the bases and then compute the w-NAF
form of the scalars on the fly for every base, or vice versa:
use group::Wnaf;
let mut wnaf_contexts: Vec<_> = (0..bases.len()).map(|_| Wnaf::new()).collect();
let mut wnaf_bases: Vec<_> = wnaf_contexts
.iter_mut()
.zip(bases)
.map(|(wnaf, base)| wnaf.base(base, scalars.len()))
.collect();
let results: Vec<_> = wnaf_bases
.iter()
.flat_map(|wnaf_base| scalars.iter().map(|scalar| wnaf_base.scalar(scalar)))
.collect();
Alternatively, use the WnafBase
and WnafScalar
types, which enable the various
tables and w-NAF forms to be cached individually per base and scalar. These types can
then be directly multiplied without any additional runtime work, at the cost of fixing
a specific window size (rather than choosing the window size dynamically).
Implementations§
source§impl<G: WnafGroup> Wnaf<(), Vec<G>, Vec<i64>>
impl<G: WnafGroup> Wnaf<(), Vec<G>, Vec<i64>>
source§impl<'a, G: Group> Wnaf<usize, &'a [G], &'a mut Vec<i64>>
impl<'a, G: Group> Wnaf<usize, &'a [G], &'a mut Vec<i64>>
Constructs new space for the scalar representation while borrowing the computed window table, for sending the window table across threads.
source§impl<'a, G: Group> Wnaf<usize, &'a mut Vec<G>, &'a [i64]>
impl<'a, G: Group> Wnaf<usize, &'a mut Vec<G>, &'a [i64]>
Constructs new space for the window table while borrowing the computed scalar representation, for sending the scalar representation across threads.