18 size_t points = ((size_t)1) << (teeth - 1);
19 size_t points_total = points * blocks;
31 secp256k1_scalar_half(&half, &secp256k1_scalar_one);
32 secp256k1_gej_set_infinity(&u);
33 for (i = 255; i >= 0; --i) {
35 secp256k1_gej_double_var(&u, &u, NULL);
36 if (secp256k1_scalar_get_bits_limb32(&half, i, 1)) {
37 secp256k1_gej_add_ge_var(&u, &u, gen, NULL);
44 secp256k1_gej_double_var(&double_u, &u, NULL);
49 for (block = 0; block < blocks; ++block) {
53 secp256k1_gej_set_infinity(&
sum);
54 for (tooth = 0; tooth < teeth; ++tooth) {
57 secp256k1_gej_add_var(&
sum, &
sum, &u, NULL);
59 secp256k1_gej_double_var(&u, &u, NULL);
63 if (block + tooth != blocks + teeth - 2) {
65 for (bit_off = 1; bit_off < spacing; ++bit_off) {
66 secp256k1_gej_double_var(&u, &u, NULL);
77 secp256k1_gej_neg(&vs[vs_pos++], &
sum);
81 for (tooth = 0; tooth < teeth - 1; ++tooth) {
82 size_t stride = ((size_t)1) << tooth;
84 for (index = 0; index < stride; ++index, ++vs_pos) {
85 secp256k1_gej_add_var(&vs[vs_pos], &vs[vs_pos - stride], &ds[tooth], NULL);
92 secp256k1_ge_set_all_gej_var(prec, vs, points_total);
94 for (block = 0; block < blocks; ++block) {
96 for (index = 0; index < points; ++index) {
97 VERIFY_CHECK(!secp256k1_ge_is_infinity(&prec[block * points + index]));
98 secp256k1_ge_to_storage(&table[block * points + index], &prec[block * points + index]);