2017-04-15 75 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