1
0
Fork 0
forked from lthn/blockchain

crypto: constexpr helpers moved to crypto-sugar, constexpr_pow added

This commit is contained in:
sowle 2023-03-26 22:33:47 +02:00
parent beccc55788
commit fdc1ceea62
No known key found for this signature in database
GPG key ID: C07A24B2D89D49FC
3 changed files with 41 additions and 24 deletions

View file

@ -20,6 +20,34 @@ namespace crypto
// Helpers
//
// returns greatest k, s.t. n**k <= v
// tests in crypto_tests_range_proofs.h
constexpr uint64_t constexpr_floor_log_n(uint64_t v, uint64_t n)
{
return (v < n || n <= 1) ? 0 : constexpr_floor_log_n(v / n, n) + 1;
}
// returns smallest k, s.t. v <= n**k
// tests in crypto_tests_range_proofs.h
constexpr uint64_t constexpr_ceil_log_n(uint64_t v, uint64_t n)
{
return (v <= 1 || n <= 1) ? 0 : constexpr_floor_log_n(v - 1, n) + 1;
}
// returns smallest k, s.t. v <= 2**k
// tests in crypto_tests_range_proofs.h
constexpr uint64_t constexpr_ceil_log2(uint64_t v)
{
return constexpr_ceil_log_n(v, 2);
}
// returns base ** k
constexpr uint64_t constexpr_pow(uint64_t k, uint64_t base)
{
return k == 0 ? 1 : base * constexpr_pow(k - 1, base);
}
template<class pod_t>
std::string pod_to_hex_reversed(const pod_t &h)
{

View file

@ -23,30 +23,6 @@ namespace crypto
return result;
}
// returns greatest k, s.t. n**k <= v
// tests in crypto_tests_range_proofs.h
constexpr size_t constexpr_floor_log_n(size_t v, size_t n)
{
return (v < n || n <= 1) ? 0 : constexpr_floor_log_n(v / n, n) + 1;
}
// returns smallest k, s.t. v <= n**k
// tests in crypto_tests_range_proofs.h
constexpr size_t constexpr_ceil_log_n(size_t v, size_t n)
{
return (v <= 1 || n <= 1) ? 0 : constexpr_floor_log_n(v - 1, n) + 1;
}
// returns smallest k, s.t. v <= 2**k
// tests in crypto_tests_range_proofs.h
constexpr size_t constexpr_ceil_log2(size_t v)
{
return constexpr_ceil_log_n(v, 2);
}
// returns least significant bit uing de Bruijn sequence
// http://graphics.stanford.edu/~seander/bithacks.html
inline uint8_t calc_lsb_32(uint32_t v)

View file

@ -89,6 +89,19 @@ static_assert(constexpr_ceil_log2(100000000) == 27, "");
static_assert(constexpr_ceil_log2(0x7fffffffffffffff) == 63, "");
static_assert(constexpr_ceil_log2(SIZE_MAX) == 64, "");
static_assert(constexpr_pow(0, 0) == 1, "");
static_assert(constexpr_pow(0, 1) == 1, "");
static_assert(constexpr_pow(1, 1) == 1, "");
static_assert(constexpr_pow(1, 0) == 0, "");
static_assert(constexpr_pow(0, 2) == 1, "");
static_assert(constexpr_pow(1, 2) == 2, "");
static_assert(constexpr_pow(10, 2) == 1024, "");
static_assert(constexpr_pow(63, 2) == 1ull << 63, "");
static_assert(constexpr_pow(3, 3) == 27, "");
static_assert(constexpr_pow(33, 3) == 5559060566555523ull, "");
TEST(bpp, basics)
{