From fce4f1be23615d7c89c5f9aaa817a60258d1bf19 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Thu, 6 Oct 2022 21:38:51 +0200 Subject: [PATCH] Updating intermediates generation, and fix some const correctness (#132) Co-authored-by: Raphael Toledo --- src/nucomp.h | 4 ++-- src/prover_slow.h | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/nucomp.h b/src/nucomp.h index 9437e376..aef14a47 100644 --- a/src/nucomp.h +++ b/src/nucomp.h @@ -51,7 +51,7 @@ typedef struct qfb typedef qfb qfb_t[1]; // From Antic using Flint (works!) -void qfb_nucomp(qfb_t r, const qfb_t f, const qfb_t g, mpz_t& D, mpz_t& L) +void qfb_nucomp(qfb_t r, const qfb_t f, const qfb_t g, mpz_t const& D, mpz_t const& L) { mpz_t a1, a2, c2, ca, cb, cc, k, s, sp, ss, m, t, u2, v1, v2; @@ -192,7 +192,7 @@ void qfb_nucomp(qfb_t r, const qfb_t f, const qfb_t g, mpz_t& D, mpz_t& L) } // a = b * c -void nucomp_form(form &a, form &b, form &c, integer &D, integer &L) { +void nucomp_form(form &a, form const& b, form const& c, integer const& D, integer const& L) { qfb fr, fr2, fr3; *fr.a = *a.a.impl; diff --git a/src/prover_slow.h b/src/prover_slow.h index 2cb18e84..de3f5108 100644 --- a/src/prover_slow.h +++ b/src/prover_slow.h @@ -30,7 +30,7 @@ uint64_t GetBlock(uint64_t i, uint64_t k, uint64_t T, integer& B) { form GenerateWesolowski(form &y, form &x_init, integer &D, PulmarkReducer& reducer, - std::vector
& intermediates, + std::vector const& intermediates, uint64_t num_iterations, uint64_t k, uint64_t l) { integer B = GetB(D, x_init, y); @@ -82,20 +82,26 @@ std::vector ProveSlow(integer& D, form& x, uint64_t num_iterations) { integer L = root(-D, 4); PulmarkReducer reducer; form y = form::from_abd(x.a, x.b, D); - std::vector intermediates; - int k, l; int d_bits = D.num_bits(); + int k, l; ApproximateParameters(num_iterations, l, k); if (k <= 0) k = 1; if (l <= 0) l = 1; - for (int i = 0; i < num_iterations; i++) { - if (i % (k * l) == 0) { - intermediates.push_back(y); + int const kl = k * l; + + uint64_t const size_vec = (num_iterations + kl - 1) / kl; + std::vector intermediates(size_vec); + form* cursor = intermediates.data(); + for (uint64_t i = 0; i < num_iterations; i++) { + if (i % kl == 0) { + *cursor = y; + ++cursor; } nudupl_form(y, y, D, L); reducer.reduce(y); } + form proof = GenerateWesolowski(y, x, D, reducer, intermediates, num_iterations, k, l); std::vector result = SerializeForm(y, d_bits); std::vector proof_bytes = SerializeForm(proof, d_bits);