@@ -250,36 +250,36 @@ impl<M> Uninit<M> {
250250 }
251251}
252252
253- // TODO: Document why this works for all Montgomery factors.
254- pub fn elem_add < M , E > ( mut a : Elem < M , E > , b : Elem < M , E > , m : & Mont < M > ) -> Elem < M , E > {
255- limb:: limbs_add_assign_mod ( a . limbs . as_mut ( ) , b. limbs . as_ref ( ) , m. limbs ( ) )
256- . unwrap_or_else ( unwrap_impossible_len_mismatch_error) ;
257- a
258- }
253+ impl < M , E > Elem < M , E > {
254+ pub fn add ( mut self , b : & Elem < M , E > , m : & Mont < M > ) -> Elem < M , E > {
255+ limb:: limbs_add_assign_mod ( self . limbs . as_mut ( ) , b. limbs . as_ref ( ) , m. limbs ( ) )
256+ . unwrap_or_else ( unwrap_impossible_len_mismatch_error) ;
257+ self
258+ }
259259
260- // TODO: Document why this works for all Montgomery factors.
261- pub fn elem_sub < M , E > ( mut a : Elem < M , E > , b : & Elem < M , E > , m : & Mont < M > ) -> Elem < M , E > {
262- prefixed_extern ! {
263- // `r` and `a` may alias.
264- fn LIMBS_sub_mod (
265- r: * mut Limb ,
266- a: * const Limb ,
267- b: * const Limb ,
268- m: * const Limb ,
269- num_limbs: c:: NonZero_size_t ,
270- ) ;
260+ pub fn sub ( mut self , b : & Elem < M , E > , m : & Mont < M > ) -> Elem < M , E > {
261+ prefixed_extern ! {
262+ // `r` and `a` may alias.
263+ fn LIMBS_sub_mod (
264+ r: * mut Limb ,
265+ a: * const Limb ,
266+ b: * const Limb ,
267+ m: * const Limb ,
268+ num_limbs: c:: NonZero_size_t ,
269+ ) ;
270+ }
271+ let num_limbs = NonZeroUsize :: new ( m. limbs ( ) . len ( ) ) . unwrap ( ) ;
272+ let _: & [ Limb ] = ( InOut ( self . limbs . as_mut ( ) ) , b. limbs . as_ref ( ) )
273+ . with_non_dangling_non_null_pointers ( num_limbs, |mut r, [ a, b] | {
274+ let m = m. limbs ( ) . as_ptr ( ) ; // Also non-dangling because num_limbs is non-zero.
275+ unsafe {
276+ LIMBS_sub_mod ( r. start_mut_ptr ( ) , a, b, m, num_limbs) ;
277+ r. deref_unchecked ( ) . assume_init ( )
278+ }
279+ } )
280+ . unwrap_or_else ( unwrap_impossible_len_mismatch_error) ;
281+ self
271282 }
272- let num_limbs = NonZeroUsize :: new ( m. limbs ( ) . len ( ) ) . unwrap ( ) ;
273- let _: & [ Limb ] = ( InOut ( a. limbs . as_mut ( ) ) , b. limbs . as_ref ( ) )
274- . with_non_dangling_non_null_pointers ( num_limbs, |mut r, [ a, b] | {
275- let m = m. limbs ( ) . as_ptr ( ) ; // Also non-dangling because num_limbs is non-zero.
276- unsafe {
277- LIMBS_sub_mod ( r. start_mut_ptr ( ) , a, b, m, num_limbs) ;
278- r. deref_unchecked ( ) . assume_init ( )
279- }
280- } )
281- . unwrap_or_else ( unwrap_impossible_len_mismatch_error) ;
282- a
283283}
284284
285285/// Verified a == b**-1 (mod m), i.e. a**-1 == b (mod m).
0 commit comments