multiexp: bos coster now works for just one point

This commit is contained in:
moneromooo-monero 2018-01-18 12:00:47 +00:00
parent 9ce9f8caf6
commit 7f48bf05d7
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -155,7 +155,7 @@ rct::key bos_coster_heap_conv_robust(std::vector<MultiexpData> data)
MULTIEXP_PERF(PERF_TIMER_START_UNIT(bos_coster, 1000000)); MULTIEXP_PERF(PERF_TIMER_START_UNIT(bos_coster, 1000000));
MULTIEXP_PERF(PERF_TIMER_START_UNIT(setup, 1000000)); MULTIEXP_PERF(PERF_TIMER_START_UNIT(setup, 1000000));
size_t points = data.size(); size_t points = data.size();
CHECK_AND_ASSERT_THROW_MES(points > 1, "Not enough points"); CHECK_AND_ASSERT_THROW_MES(points > 0, "Not enough points");
std::vector<size_t> heap; std::vector<size_t> heap;
heap.reserve(points); heap.reserve(points);
for (size_t n = 0; n < points; ++n) for (size_t n = 0; n < points; ++n)
@ -164,6 +164,16 @@ rct::key bos_coster_heap_conv_robust(std::vector<MultiexpData> data)
heap.push_back(n); heap.push_back(n);
} }
points = heap.size(); points = heap.size();
if (points == 0)
return rct::identity();
if (points < 2)
{
ge_p2 p2;
ge_scalarmult(&p2, data[0].scalar.bytes, &data[0].point);
rct::key res;
ge_tobytes(res.bytes, &p2);
return res;
}
auto Comp = [&](size_t e0, size_t e1) { return data[e0].scalar < data[e1].scalar; }; auto Comp = [&](size_t e0, size_t e1) { return data[e0].scalar < data[e1].scalar; };
std::make_heap(heap.begin(), heap.end(), Comp); std::make_heap(heap.begin(), heap.end(), Comp);