Skip to content

Commit 4c950bb

Browse files
peterdettmanjonasnick
authored andcommitted
Save some additions per window in _pippenger_wnaf
1 parent a58f543 commit 4c950bb

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

src/ecmult_impl.h

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -654,14 +654,10 @@ static int secp256k1_ecmult_pippenger_wnaf(secp256k1_gej *buckets, int bucket_wi
654654

655655
for (i = n_wnaf - 1; i >= 0; i--) {
656656
secp256k1_gej running_sum;
657-
secp256k1_gej walking_sum;
658657

659658
for(j = 0; j < ECMULT_TABLE_SIZE(bucket_window+2); j++) {
660659
secp256k1_gej_set_infinity(&buckets[j]);
661660
}
662-
for(j = 0; j < bucket_window+1; j++) {
663-
secp256k1_gej_double_var(r, r, NULL);
664-
}
665661

666662
for (np = 0; np < no; ++np) {
667663
int n = state->wnaf_na[np*n_wnaf + i];
@@ -688,24 +684,28 @@ static int secp256k1_ecmult_pippenger_wnaf(secp256k1_gej *buckets, int bucket_wi
688684
secp256k1_gej_add_ge_var(&buckets[idx], &buckets[idx], &tmp, NULL);
689685
}
690686
}
687+
688+
for(j = 0; j < bucket_window; j++) {
689+
secp256k1_gej_double_var(r, r, NULL);
690+
}
691+
691692
secp256k1_gej_set_infinity(&running_sum);
692-
secp256k1_gej_set_infinity(&walking_sum);
693-
/* Compute walking_sum as bucket[0] + 3*bucket[1] + 5*bucket[2] + ...
694-
* by first setting
693+
/* Accumulate the sum: bucket[0] + 3*bucket[1] + 5*bucket[2] + 7*bucket[3] + ...
694+
* = bucket[0] + bucket[1] + bucket[2] + bucket[3] + ...
695+
* + 2 * (bucket[1] + 2*bucket[2] + 3*bucket[3] + ...)
696+
* using an intermediate running sum:
695697
* running_sum = bucket[0] + bucket[1] + bucket[2] + ...
696-
* walking_sum = bucket[0] + 2*bucket[1] + 3*bucket[2] + ...
697-
* and then computing
698-
* walking_sum = 2*walking_sum - running_sum
698+
*
699+
* The doubling is done implicitly by deferring the final window doubling (of 'r').
699700
*/
700-
for(j = ECMULT_TABLE_SIZE(bucket_window+2) - 1; j >= 0; j--) {
701+
for(j = ECMULT_TABLE_SIZE(bucket_window+2) - 1; j > 0; j--) {
701702
secp256k1_gej_add_var(&running_sum, &running_sum, &buckets[j], NULL);
702-
secp256k1_gej_add_var(&walking_sum, &walking_sum, &running_sum, NULL);
703+
secp256k1_gej_add_var(r, r, &running_sum, NULL);
703704
}
704705

705-
secp256k1_gej_double_var(&walking_sum, &walking_sum, NULL);
706-
secp256k1_gej_neg(&running_sum, &running_sum);
707-
secp256k1_gej_add_var(&walking_sum, &walking_sum, &running_sum, NULL);
708-
secp256k1_gej_add_var(r, r, &walking_sum, NULL);
706+
secp256k1_gej_add_var(&running_sum, &running_sum, &buckets[0], NULL);
707+
secp256k1_gej_double_var(r, r, NULL);
708+
secp256k1_gej_add_var(r, r, &running_sum, NULL);
709709
}
710710
return 1;
711711
}

0 commit comments

Comments
 (0)