2017-04-15 95 views
0

需要存儲非常大的整數,所以我使用boost :: multiprecision :: cpp_int。問題是,當使用這種新類型時,我無法弄清楚如何使用它從pow()和rand()等其他函數獲取我想要的值。對pow()和rand()函數使用boost cpp_int

我需要存儲一個非常大的數,這是通過指數計算得出的。但pow()函數本身不能處理如此大的數字,rand()返回基本整數。

更具體地說,我只需要存儲值2^1024並生成一個介於1和2^1024之間的隨機數。但我一直在努力實現這個目標。

cpp_int x = pow(2,1024); 
x = rand() % x + 1; 

像這樣的東西不起作用的原因我上面說過。我也嘗試了boost :: multiprecision :: pow,但是這似乎不適用於cpp_int。我需要跳過哪些環節才能讓這些相對簡單的操作使用大整數?

+1

參見[用於產生隨機數的文檔(http://www.boost.org/doc/libs/1_63_0/libs/multiprecision/doc/html/boost_multiprecision/tut/random.html )和[整數運算的文檔](http://www.boost.org/doc/libs/1_63_0/libs/multipreci氮氧化硅/ DOC/HTML/boost_multiprecision /嘖嘖/ gen_int.html)。 – Mankarse

+0

我之前確實看到過這些,但我注意到他們使用了「Integer」類型,而不是cpp_int。 boost.integer也可用於像cpp_int這樣的龐大數字嗎? – Bob

+1

'整數'是函數模板的模板類型參數。 'cpp_int'符合'Integer'的類型要求,所以函數模板可以和'cpp_int'類型的值一起使用。 – Mankarse

回答

2

您需要使用multiprecision version of pow(該網頁上搜索pow),然後使用一個隨機數生成器,它支持通用的操作,如Boost.Random(或者說是主要基於Boost.Random的C++11 standard random library):

#include <iostream> 
#include <boost/random/random_device.hpp> 
#include <boost/random.hpp> 
#include <boost/multiprecision/cpp_int.hpp> 
int main() 
{ 
    namespace mp = boost::multiprecision; 
    mp::cpp_int x = mp::pow(mp::cpp_int(2), 1024); 
    std::cout << x << "\n"; 

    boost::random::random_device gen; 
    boost::random::uniform_int_distribution<mp::cpp_int> ui(1, x); 

    for(unsigned i = 0; i < 10; ++i) { 
     mp::cpp_int y = ui(gen); 
     std::cout << y << "\n"; 
    } 
} 

Live code

+0

功能函數工作,但其餘的代碼編譯3錯誤「未定義的引用'boost :: random :: random_device ::〜random_device()'|」 – Bob

+0

順便說一下,我正在使用code :: blocks。顯然這是一個鏈接問題,但我不知道什麼文件我需要鏈接 – Bob

+0

沒關係,用一個不同的隨機生成器計算出來。謝謝您的幫助! – Bob