32 #ifndef VSMC_RNG_ARS_HPP 33 #define VSMC_RNG_ARS_HPP 40 #ifndef VSMC_RNG_ARS_ROUNDS 41 #define VSMC_RNG_ARS_ROUNDS 5 46 #ifndef VSMC_RNG_ARS_BLOCKS 47 #define VSMC_RNG_ARS_BLOCKS 4 56 template <std::
size_t>
61 UINT64_C(0x9E3779B97F4A7C15)>
67 UINT64_C(0xBB67AE8584CAA73B)>
79 template <std::
size_t I>
90 using key_type = std::array<T, M128I<T>::size()>;
94 template <
typename U, std::
size_t Rp1>
100 std::get<0>(rk).load(key.data());
101 generate<1>(rk, weyl, std::integral_constant<bool, 1 < Rp1>());
105 template <std::
size_t,
typename U, std::
size_t Rp1>
107 std::false_type)
const 111 template <std::
size_t N,
typename U, std::
size_t Rp1>
112 void generate(std::array<
M128I<U>, Rp1> &rk,
116 _mm_add_epi64(std::get<N - 1>(rk).value(), weyl.
value());
117 generate<N + 1>(rk, weyl, std::integral_constant<bool, N + 1 < Rp1>());
180 #endif // VSMC_RNG_ARS_HPP
Using __m128i as integer vector.
Counter based RNG engine.
std::array< T, M128I< T >::size()> key_type
#define VSMC_RNG_ARS_ROUNDS
ARSEngine default rounds.
ARSEngine Weyl sequence constants.
void operator()(const key_type &key, std::array< M128I< U >, Rp1 > &rk) const
void reset(const key_type &)
#define VSMC_RNG_ARS_BLOCKS
ARSEngine default blocks.
Default ARSEngine key sequence generator.