6#ifndef THEORETICA_BIT_OP_H 
    7#define THEORETICA_BIT_OP_H 
   25        uint64_t a, uint64_t b,
 
   26        uint64_t& c_low, uint64_t& c_high) {
 
   29        const uint64_t a_low = a & 0xffffffff;
 
   30        const uint64_t a_high = a >> 32;
 
   32        const uint64_t b_low = b & 0xffffffff;
 
   33        const uint64_t b_high = b >> 32;
 
   39        m[1] = a_low * b_high;
 
   40        m[2] = a_high * b_low;
 
   41        m[3] = a_high * b_high;
 
   47            (m[2] & 0xffffffff)) >> 32;
 
   49        c_low = m[0] + (m[1] << 32) + (m[2] << 32);
 
   50        c_high = m[3] + (m[1] >> 32) + (m[2] >> 32) + carry;
 
 
   62    inline uint64_t 
mix_mum(uint64_t a, uint64_t b) {
 
   64        uint64_t c_low, c_high;
 
   67        return c_high ^ c_low;
 
 
   76    template<
typename Un
signedIntType>
 
   80        return (x << i) | (x >> ((
sizeof(UnsignedIntType) * 8) - i));
 
 
   89    template<
typename Vector, enable_vector<Vector> = true>
 
   92        if (x.size() < (uint64_t(1) << m)) {
 
   93            TH_MATH_ERROR(
"swap_bit_reverse", x.size(), INVALID_ARGUMENT);
 
   97        for (
unsigned int i = 0; i < x.size(); i++) {
 
  101            for (
unsigned int k = 0; k < m; k++)
 
  102                j = (j << 1) | ((i >> k) & 0x01);
 
  105                std::swap(x[i], x[j]);
 
 
#define TH_CONSTEXPR
Enable constexpr in function declarations if C++14 is supported.
Definition constants.h:161
 
#define TH_MATH_ERROR(F_NAME, VALUE, EXCEPTION)
TH_MATH_ERROR is a macro which throws exceptions or modifies errno (depending on which compiling opti...
Definition error.h:225
 
Main namespace of the library which contains all functions and objects.
Definition algebra.h:27
 
TH_CONSTEXPR UnsignedIntType bit_rotate(UnsignedIntType x, unsigned int i)
Bit rotation of unsigned integer types using shifts.
Definition bit_op.h:78
 
uint64_t mix_mum(uint64_t a, uint64_t b)
MUM bit mixing function, computes the 128-bit product of a and b and the XOR of their high and low 64...
Definition bit_op.h:62
 
void mul_uint128(uint64_t a, uint64_t b, uint64_t &c_low, uint64_t &c_high)
Multiply two 64-bit unsigned integers and store the result in two 64-bit variables,...
Definition bit_op.h:24
 
void swap_bit_reverse(Vector &x, unsigned int m)
Swap the elements of a vector pair-wise, by exchanging elements with indices related by bit reversion...
Definition bit_op.h:90