Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
3年前关闭。
注意:此问答不是关于Mersenne twister,而是关于Mersenne numbers。
我想在编译时计算一个大小为N的数组,其中包含[0,N-1]中n的梅森素数(2n-1)。
我该如何实施?
Demo
甚至在c ++ 14中
Demo
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
3年前关闭。
注意:此问答不是关于Mersenne twister,而是关于Mersenne numbers。
我想在编译时计算一个大小为N的数组,其中包含[0,N-1]中n的梅森素数(2n-1)。
template <std::uint8_t N>
static constexpr std::array<std::uint16_t, N> mersenne_numbers()
{
// Compute Mersenne numbers for N, N-1 ... 1 and return the array
return { 1, 2, 3 };
};
int main()
{
constexpr std::array<std::uint16_t, 5> arr = mersenne_numbers<5>();
}
我该如何实施?
最佳答案
因此,要在编译时计算(2 ^ n-1)的数组,您可以
template <std::size_t ... Is>
constexpr std::array<std::uint16_t, sizeof...(Is)>
mersenne_numbers(std::index_sequence<Is...>)
{
return {{ ((1u << Is) - 1u)... }};
}
template <std::uint8_t N>
constexpr std::array<std::uint16_t, N>
mersenne_numbers()
{
return mersenne_numbers(std::make_index_sequence<N>{});
}
Demo
index_sequence
的实现可以在c ++ 11中完成,并且很容易在SO上找到。甚至在c ++ 14中
template <std::uint8_t N>
constexpr std::array<std::uint16_t, N> mersenne_numbers()
{
std::array<std::uint16_t, N> res{};
for (uint i = 0; i != N; ++i)
{
res [i] = (1u << i) - 1;
}
return res;
}
Demo
关于c++ - 如何在编译时计算梅森数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38402914/
10-11 16:57