@@ -11,7 +11,7 @@ use ark_std::{
11
11
fmt:: Formatter ,
12
12
iter:: IntoIterator ,
13
13
log2,
14
- ops:: { Add , AddAssign , Index , Neg , Sub , SubAssign } ,
14
+ ops:: { Add , AddAssign , Index , Mul , MulAssign , Neg , Sub , SubAssign } ,
15
15
rand:: Rng ,
16
16
slice:: { Iter , IterMut } ,
17
17
vec:: * ,
@@ -331,6 +331,44 @@ impl<'a, F: Field> SubAssign<&'a DenseMultilinearExtension<F>> for DenseMultilin
331
331
}
332
332
}
333
333
334
+ impl < F : Field > Mul < F > for DenseMultilinearExtension < F > {
335
+ type Output = DenseMultilinearExtension < F > ;
336
+
337
+ fn mul ( self , scalar : F ) -> Self :: Output {
338
+ & self * & scalar
339
+ }
340
+ }
341
+
342
+ impl < ' a , ' b , F : Field > Mul < & ' a F > for & ' b DenseMultilinearExtension < F > {
343
+ type Output = DenseMultilinearExtension < F > ;
344
+
345
+ fn mul ( self , scalar : & ' a F ) -> Self :: Output {
346
+ if scalar. is_zero ( ) {
347
+ return DenseMultilinearExtension :: zero ( ) ;
348
+ } else if scalar. is_one ( ) {
349
+ return self . clone ( ) ;
350
+ }
351
+ let result: Vec < F > = self . evaluations . iter ( ) . map ( |& x| x * scalar) . collect ( ) ;
352
+
353
+ DenseMultilinearExtension {
354
+ num_vars : self . num_vars ,
355
+ evaluations : result,
356
+ }
357
+ }
358
+ }
359
+
360
+ impl < F : Field > MulAssign < F > for DenseMultilinearExtension < F > {
361
+ fn mul_assign ( & mut self , scalar : F ) {
362
+ * self = & * self * & scalar
363
+ }
364
+ }
365
+
366
+ impl < ' a , F : Field > MulAssign < & ' a F > for DenseMultilinearExtension < F > {
367
+ fn mul_assign ( & mut self , scalar : & ' a F ) {
368
+ * self = & * self * scalar
369
+ }
370
+ }
371
+
334
372
impl < F : Field > fmt:: Debug for DenseMultilinearExtension < F > {
335
373
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> Result < ( ) , fmt:: Error > {
336
374
write ! ( f, "DenseML(nv = {}, evaluations = [" , self . num_vars) ?;
@@ -394,7 +432,7 @@ impl<F: Field> Polynomial<F> for DenseMultilinearExtension<F> {
394
432
#[ cfg( test) ]
395
433
mod tests {
396
434
use crate :: { DenseMultilinearExtension , MultilinearExtension , Polynomial } ;
397
- use ark_ff:: { Field , Zero } ;
435
+ use ark_ff:: { Field , One , Zero } ;
398
436
use ark_std:: { ops:: Neg , test_rng, vec:: * , UniformRand } ;
399
437
use ark_test_curves:: bls12_381:: Fr ;
400
438
@@ -471,6 +509,7 @@ mod tests {
471
509
const NV : usize = 10 ;
472
510
let mut rng = test_rng ( ) ;
473
511
for _ in 0 ..20 {
512
+ let scalar = Fr :: rand ( & mut rng) ;
474
513
let point: Vec < _ > = ( 0 ..NV ) . map ( |_| Fr :: rand ( & mut rng) ) . collect ( ) ;
475
514
let poly1 = DenseMultilinearExtension :: rand ( NV , & mut rng) ;
476
515
let poly2 = DenseMultilinearExtension :: rand ( NV , & mut rng) ;
@@ -482,6 +521,8 @@ mod tests {
482
521
assert_eq ! ( ( & poly1 - & poly2) . evaluate( & point) , v1 - v2) ;
483
522
// test negate
484
523
assert_eq ! ( poly1. clone( ) . neg( ) . evaluate( & point) , -v1) ;
524
+ // test mul poly by scalar
525
+ assert_eq ! ( ( & poly1 * & scalar) . evaluate( & point) , v1 * scalar) ;
485
526
// test add assign
486
527
{
487
528
let mut poly1 = poly1. clone ( ) ;
@@ -515,6 +556,16 @@ mod tests {
515
556
assert_eq ! ( zero. evaluate( & point) , scalar * v1) ;
516
557
}
517
558
}
559
+ // test mul_assign for poly * scalar
560
+ {
561
+ let mut poly1_cloned = poly1. clone ( ) ;
562
+ poly1_cloned *= Fr :: one ( ) ;
563
+ assert_eq ! ( poly1_cloned. evaluate( & point) , v1) ;
564
+ poly1_cloned *= scalar;
565
+ assert_eq ! ( poly1_cloned. evaluate( & point) , v1 * scalar) ;
566
+ poly1_cloned *= Fr :: zero ( ) ;
567
+ assert_eq ! ( poly1_cloned, DenseMultilinearExtension :: zero( ) ) ;
568
+ }
518
569
}
519
570
}
520
571
0 commit comments