@@ -113,6 +113,9 @@ macro_rules! widening_impl {
113
113
/// This returns the low-order (wrapping) bits and the high-order (overflow) bits
114
114
/// of the result as two separate values, in that order.
115
115
///
116
+ /// If you also need to add a carry to the wide result, then you want
117
+ /// [`Self::carrying_mul`] instead.
118
+ ///
116
119
/// # Examples
117
120
///
118
121
/// Basic usage:
@@ -148,6 +151,8 @@ macro_rules! widening_impl {
148
151
/// additional amount of overflow. This allows for chaining together multiple
149
152
/// multiplications to create "big integers" which represent larger values.
150
153
///
154
+ /// If you don't need the `carry`, then you can use [`Self::widening_mul`] instead.
155
+ ///
151
156
/// # Examples
152
157
///
153
158
/// Basic usage:
@@ -167,6 +172,31 @@ macro_rules! widening_impl {
167
172
) ]
168
173
/// ```
169
174
///
175
+ /// This is the core operation needed for scalar multiplication when
176
+ /// implementing it for wider-than-native types.
177
+ ///
178
+ /// ```
179
+ /// #![feature(bigint_helper_methods)]
180
+ /// fn scalar_mul_eq(little_endian_digits: &mut Vec<u16>, multiplicand: u16) {
181
+ /// let mut carry = 0;
182
+ /// for d in little_endian_digits.iter_mut() {
183
+ /// (*d, carry) = d.carrying_mul(multiplicand, carry);
184
+ /// }
185
+ /// if carry != 0 {
186
+ /// little_endian_digits.push(carry);
187
+ /// }
188
+ /// }
189
+ ///
190
+ /// let mut v = vec![10, 20];
191
+ /// scalar_mul_eq(&mut v, 3);
192
+ /// assert_eq!(v, [30, 60]);
193
+ ///
194
+ /// assert_eq!(0x87654321_u64 * 0xFEED, 0x86D3D159E38D);
195
+ /// let mut v = vec![0x4321, 0x8765];
196
+ /// scalar_mul_eq(&mut v, 0xFEED);
197
+ /// assert_eq!(v, [0xE38D, 0xD159, 0x86D3]);
198
+ /// ```
199
+ ///
170
200
/// If `carry` is zero, this is similar to [`overflowing_mul`](Self::overflowing_mul),
171
201
/// except that it gives the value of the overflow instead of just whether one happened:
172
202
///
0 commit comments