@@ -51,14 +51,18 @@ impl Derefs {
51
51
pub fn new ( row_ops_val : Vec < DensePolynomial > , col_ops_val : Vec < DensePolynomial > ) -> Self {
52
52
assert_eq ! ( row_ops_val. len( ) , col_ops_val. len( ) ) ;
53
53
54
- // combine all polynomials into a single polynomial (used below to produce a single commitment)
55
- let comb = DensePolynomial :: merge ( row_ops_val. iter ( ) . chain ( col_ops_val. iter ( ) ) ) ;
54
+ let derefs = {
55
+ // combine all polynomials into a single polynomial (used below to produce a single commitment)
56
+ let comb = DensePolynomial :: merge ( row_ops_val. iter ( ) . chain ( col_ops_val. iter ( ) ) ) ;
57
+
58
+ Derefs {
59
+ row_ops_val,
60
+ col_ops_val,
61
+ comb,
62
+ }
63
+ } ;
56
64
57
- Derefs {
58
- row_ops_val,
59
- col_ops_val,
60
- comb,
61
- }
65
+ derefs
62
66
}
63
67
64
68
pub fn commit ( & self , gens : & PolyCommitmentGens ) -> DerefsCommitment {
@@ -339,7 +343,7 @@ impl AppendToTranscript for SparseMatPolyCommitment {
339
343
340
344
impl SparseMatPolynomial {
341
345
pub fn new ( num_vars_x : usize , num_vars_y : usize , M : Vec < SparseMatEntry > ) -> Self {
342
- Self {
346
+ SparseMatPolynomial {
343
347
num_vars_x,
344
348
num_vars_y,
345
349
M ,
@@ -373,9 +377,8 @@ impl SparseMatPolynomial {
373
377
assert_eq ! ( sparse_polys[ i] . num_vars_y, sparse_polys[ 0 ] . num_vars_y) ;
374
378
}
375
379
376
- let N = sparse_polys
377
- . iter ( )
378
- . map ( |sparse_poly| sparse_poly. get_num_nz_entries ( ) )
380
+ let N = ( 0 ..sparse_polys. len ( ) )
381
+ . map ( |i| sparse_polys[ i] . get_num_nz_entries ( ) )
379
382
. max ( )
380
383
. unwrap ( ) ;
381
384
@@ -427,10 +430,13 @@ impl SparseMatPolynomial {
427
430
assert_eq ! ( self . num_vars_x. pow2( ) , eval_table_rx. len( ) ) ;
428
431
assert_eq ! ( self . num_vars_y. pow2( ) , eval_table_ry. len( ) ) ;
429
432
430
- self
431
- . M
432
- . iter ( )
433
- . map ( |SparseMatEntry { row, col, val } | eval_table_rx[ * row] * eval_table_ry[ * col] * val)
433
+ ( 0 ..self . M . len ( ) )
434
+ . map ( |i| {
435
+ let row = self . M [ i] . row ;
436
+ let col = self . M [ i] . col ;
437
+ let val = & self . M [ i] . val ;
438
+ eval_table_rx[ row] * eval_table_ry[ col] * val
439
+ } )
434
440
. sum ( )
435
441
}
436
442
@@ -442,22 +448,25 @@ impl SparseMatPolynomial {
442
448
let eval_table_rx = EqPolynomial :: new ( rx. to_vec ( ) ) . evals ( ) ;
443
449
let eval_table_ry = EqPolynomial :: new ( ry. to_vec ( ) ) . evals ( ) ;
444
450
445
- polys
446
- . iter ( )
447
- . map ( |poly| poly. evaluate_with_tables ( & eval_table_rx, & eval_table_ry) )
451
+ ( 0 ..polys. len ( ) )
452
+ . map ( |i| polys[ i] . evaluate_with_tables ( & eval_table_rx, & eval_table_ry) )
448
453
. collect :: < Vec < Scalar > > ( )
449
454
}
450
455
451
456
pub fn multiply_vec ( & self , num_rows : usize , num_cols : usize , z : & [ Scalar ] ) -> Vec < Scalar > {
452
457
assert_eq ! ( z. len( ) , num_cols) ;
453
458
454
- self . M . iter ( ) . fold (
455
- vec ! [ Scalar :: zero( ) ; num_rows] ,
456
- |mut Mz , SparseMatEntry { row, col, val } | {
457
- Mz [ * row] += val * z[ * col] ;
459
+ ( 0 ..self . M . len ( ) )
460
+ . map ( |i| {
461
+ let row = self . M [ i] . row ;
462
+ let col = self . M [ i] . col ;
463
+ let val = & self . M [ i] . val ;
464
+ ( row, val * z[ col] )
465
+ } )
466
+ . fold ( vec ! [ Scalar :: zero( ) ; num_rows] , |mut Mz , ( r, v) | {
467
+ Mz [ r] += v;
458
468
Mz
459
- } ,
460
- )
469
+ } )
461
470
}
462
471
463
472
pub fn compute_eval_table_sparse (
@@ -468,13 +477,13 @@ impl SparseMatPolynomial {
468
477
) -> Vec < Scalar > {
469
478
assert_eq ! ( rx. len( ) , num_rows) ;
470
479
471
- self . M . iter ( ) . fold (
472
- vec ! [ Scalar :: zero ( ) ; num_cols ] ,
473
- | mut M_evals , SparseMatEntry { row , col , val } | {
474
- M_evals [ * col ] += rx [ * row ] * val ;
475
- M_evals
476
- } ,
477
- )
480
+ let mut M_evals : Vec < Scalar > = vec ! [ Scalar :: zero ( ) ; num_cols ] ;
481
+
482
+ for i in 0 .. self . M . len ( ) {
483
+ let entry = & self . M [ i ] ;
484
+ M_evals [ entry . col ] += rx [ entry . row ] * entry . val ;
485
+ }
486
+ M_evals
478
487
}
479
488
480
489
pub fn multi_commit (
@@ -697,18 +706,18 @@ impl HashLayerProof {
697
706
let ( rand_mem, rand_ops) = rand;
698
707
699
708
// decommit ops-addr at rand_ops
700
- let eval_ops_addr_vec = addr_timestamps
701
- . ops_addr
702
- . iter ( )
703
- . map ( |addr| addr . evaluate ( rand_ops ) )
704
- . collect ( ) ;
709
+ let mut eval_ops_addr_vec: Vec < Scalar > = Vec :: new ( ) ;
710
+ for i in 0 ..addr_timestamps . ops_addr . len ( ) {
711
+ let eval_ops_addr = addr_timestamps . ops_addr [ i ] . evaluate ( rand_ops ) ;
712
+ eval_ops_addr_vec . push ( eval_ops_addr ) ;
713
+ }
705
714
706
715
// decommit read_ts at rand_ops
707
- let eval_read_ts_vec = addr_timestamps
708
- . read_ts
709
- . iter ( )
710
- . map ( |addr| addr . evaluate ( rand_ops ) )
711
- . collect ( ) ;
716
+ let mut eval_read_ts_vec: Vec < Scalar > = Vec :: new ( ) ;
717
+ for i in 0 ..addr_timestamps . read_ts . len ( ) {
718
+ let eval_read_ts = addr_timestamps . read_ts [ i ] . evaluate ( rand_ops ) ;
719
+ eval_read_ts_vec . push ( eval_read_ts ) ;
720
+ }
712
721
713
722
// decommit audit-ts at rand_mem
714
723
let eval_audit_ts = addr_timestamps. audit_ts . evaluate ( rand_mem) ;
@@ -729,15 +738,11 @@ impl HashLayerProof {
729
738
let ( rand_mem, rand_ops) = rand;
730
739
731
740
// decommit derefs at rand_ops
732
- let eval_row_ops_val = derefs
733
- . row_ops_val
734
- . iter ( )
735
- . map ( |row| row. evaluate ( rand_ops) )
741
+ let eval_row_ops_val = ( 0 ..derefs. row_ops_val . len ( ) )
742
+ . map ( |i| derefs. row_ops_val [ i] . evaluate ( rand_ops) )
736
743
. collect :: < Vec < Scalar > > ( ) ;
737
- let eval_col_ops_val = derefs
738
- . col_ops_val
739
- . iter ( )
740
- . map ( |col| col. evaluate ( rand_ops) )
744
+ let eval_col_ops_val = ( 0 ..derefs. col_ops_val . len ( ) )
745
+ . map ( |i| derefs. col_ops_val [ i] . evaluate ( rand_ops) )
741
746
. collect :: < Vec < Scalar > > ( ) ;
742
747
let proof_derefs = DerefsEvalProof :: prove (
743
748
derefs,
@@ -1576,9 +1581,15 @@ impl SparsePolynomial {
1576
1581
1577
1582
fn compute_chi ( a : & [ bool ] , r : & [ Scalar ] ) -> Scalar {
1578
1583
assert_eq ! ( a. len( ) , r. len( ) ) ;
1579
- a. iter ( ) . zip ( r. iter ( ) ) . fold ( Scalar :: one ( ) , |sum, ( a, r) | {
1580
- sum * if * a { * r } else { Scalar :: one ( ) - r }
1581
- } )
1584
+ let mut chi_i = Scalar :: one ( ) ;
1585
+ for j in 0 ..r. len ( ) {
1586
+ if a[ j] {
1587
+ chi_i *= r[ j] ;
1588
+ } else {
1589
+ chi_i *= Scalar :: one ( ) - r[ j] ;
1590
+ }
1591
+ }
1592
+ chi_i
1582
1593
}
1583
1594
1584
1595
// Takes O(n log n). TODO: do this in O(n) where n is the number of entries in Z
@@ -1609,15 +1620,15 @@ mod tests {
1609
1620
let num_vars_x: usize = num_rows. log_2 ( ) ;
1610
1621
let num_vars_y: usize = num_cols. log_2 ( ) ;
1611
1622
1612
- let M = ( 0 ..num_nz_entries )
1613
- . map ( |_i| {
1614
- SparseMatEntry :: new (
1615
- ( csprng . next_u64 ( ) % ( num_rows as u64 ) ) as usize ,
1616
- ( csprng. next_u64 ( ) % ( num_cols as u64 ) ) as usize ,
1617
- Scalar :: random ( & mut csprng ) ,
1618
- )
1619
- } )
1620
- . collect ( ) ;
1623
+ let mut M : Vec < SparseMatEntry > = Vec :: new ( ) ;
1624
+
1625
+ for _i in 0 ..num_nz_entries {
1626
+ M . push ( SparseMatEntry :: new (
1627
+ ( csprng. next_u64 ( ) % ( num_rows as u64 ) ) as usize ,
1628
+ ( csprng . next_u64 ( ) % ( num_cols as u64 ) ) as usize ,
1629
+ Scalar :: random ( & mut csprng ) ,
1630
+ ) ) ;
1631
+ }
1621
1632
1622
1633
let poly_M = SparseMatPolynomial :: new ( num_vars_x, num_vars_y, M ) ;
1623
1634
let gens = SparseMatPolyCommitmentGens :: new (
0 commit comments