@@ -37,6 +37,74 @@ mod full_limbs {
3737 }
3838}
3939
40+ #[ test]
41+ fn sum_of_products ( ) {
42+ use ff:: { Field , PrimeField } ;
43+
44+ let one = Bls381K12Scalar :: one ( ) ;
45+
46+ // [1, 2, 3, 4]
47+ let values = {
48+ let mut iter = ( 0 ..4 ) . scan ( one, |acc, _| {
49+ let ret = * acc;
50+ * acc += & one;
51+ Some ( ret)
52+ } ) ;
53+ [
54+ iter. next ( ) . unwrap ( ) ,
55+ iter. next ( ) . unwrap ( ) ,
56+ iter. next ( ) . unwrap ( ) ,
57+ iter. next ( ) . unwrap ( ) ,
58+ ]
59+ } ;
60+
61+ // We'll pair each value with itself.
62+ let expected = Bls381K12Scalar :: from_str_vartime ( "30" ) . unwrap ( ) ;
63+
64+ assert_eq ! ( Bls381K12Scalar :: sum_of_products( values, values) , expected, ) ;
65+ }
66+
67+ #[ test]
68+ fn sum_of_products_iter ( ) {
69+ use ff:: { Field , PrimeField } ;
70+
71+ let one = Bls381K12Scalar :: one ( ) ;
72+
73+ // [1, 2, 3, 4]
74+ let values: Vec < _ > = ( 0 ..4 )
75+ . scan ( one, |acc, _| {
76+ let ret = * acc;
77+ * acc += & one;
78+ Some ( ret)
79+ } )
80+ . collect ( ) ;
81+
82+ // We'll pair each value with itself.
83+ let expected = Bls381K12Scalar :: from_str_vartime ( "30" ) . unwrap ( ) ;
84+
85+ // Check that we can produce the necessary input from two iterators.
86+ assert_eq ! (
87+ // Directly produces (&v, &v)
88+ Bls381K12Scalar :: sum_of_products_iter( values. iter( ) . zip( values. iter( ) ) ) ,
89+ expected,
90+ ) ;
91+
92+ // Check that we can produce the necessary input from an iterator of values.
93+ assert_eq ! (
94+ // Maps &v to (&v, &v)
95+ Bls381K12Scalar :: sum_of_products_iter( values. iter( ) . map( |v| ( v, v) ) ) ,
96+ expected,
97+ ) ;
98+
99+ // Check that we can produce the necessary input from an iterator of tuples.
100+ let tuples: Vec < _ > = values. into_iter ( ) . map ( |v| ( v, v) ) . collect ( ) ;
101+ assert_eq ! (
102+ // Maps &(a, b) to (&a, &b)
103+ Bls381K12Scalar :: sum_of_products_iter( tuples. iter( ) . map( |( a, b) | ( a, b) ) ) ,
104+ expected,
105+ ) ;
106+ }
107+
40108#[ test]
41109fn batch_inversion ( ) {
42110 use ff:: { BatchInverter , Field } ;
0 commit comments