Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过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