这是一个大数运算库。
- 编译时要求Visual Studio 2017
- 运行时要求支持ADX、BMI2、RDRAND指令集
- 运行时支持Intel Haswell或更新,AMD Ryzen或更新
unsigned_bigint<16> foo; // 16表示这个数有16*64=1024位二进制位
unsigned_bigint<16> a, b;
std::cin >> std::hex >> a >> b; // 十六进制输入
std::cout << std::hex << "a = " << a << std::endl; // 十六进制输出
std::cin >> std::dec >> a >> b; // 十进制输入
std::cout << std::dec << "a = " << a << std::endl; // 十进制输出
std::cin >> std::oct >> a >> b; // 八进制输入
std::cout << std::oct << "a = " << a << std::endl; // 八进制输出
unsigned_bigint<16> a;
a = 65535;
std::cout << std::hex << "a = " << a << std::endl;
但如果要赋值为大数,由于C++常量不支持大整数(要支持的话我还写这个库做什么),请使用字符串进行赋值:
unsigned_bigint<16> a;
a = unsigned_bigint<16>("0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF");
std::cout << std::hex << "a = " << a << std::endl;
unsigned_bigint<16> a, b;
std::cin >> std::hex >> a >> b;
std::cout << std::hex << "a + b = " << a + b << std::endl
<< "a - b = " << a - b << std::endl
<< "a * b = " << a * b << std::endl
<< "a / b = " << a / b << std::endl
<< "a % b = " << a % b << std::endl;
foo = fast_pow_mod(a, n, m); // foo = (a ^ n) % m
bar = multiply_mod(a, b, m); // foo = (b * b) % m
unsigned_bigint<16> a, b;
std::cin >> std::hex >> a >> b;
std::cout << std::hex << "(a > 0) = " << (a > 0) << std::endl
<< "(a == b) = " << (a == b) << std::endl
<< "(a != b) = " << (a != b) << std::endl
<< "(a < b) = " << (a < b) << std::endl
<< "(a <= b) = " << (a <= b) << std::endl
<< "(a > b) = " << (a > b) << std::endl
<< "(a >= b) = " << (a >= b) << std::endl
<< "(a | b) = " << (a | b) << std::endl
<< "(a & b) = " << (a & b) << std::endl
<< "(a ^ b) = " << (a ^ b) << std::endl;
unsigned_bigint<16> a;
std::cin >> std::hex >> a;
a.bit(0) = 1; // 最低位置1
std::cout << a.bit(0) << std::endl; // 输出最低位
unsigned_bigint<16> a, b;
std::cin >> std::hex >> a >> b;
// 使用Intel CPU中的指令获得真随机数,仅在Intel CPU上可用
std::cout << std::hex << "unsigned_bigint<16>::randIntel() = "
<< unsigned_bigint<16>::randIntel() << std::endl;
// 生成伪随机数
std::cout << std::hex << "unsigned_bigint<16>::rand() = "
<< unsigned_bigint<16>::rand() << std::endl;
unsigned_bigint<16> a;
std::cin >> std::hex >> a;
std::cout << "a " << (a.is_prime_number() ? "is" : "isn't")
<< " a prime number" << std::endl;
与Boost比较如下。(数据为运行时间,越小越好)
其中四则运算运算次数为500000次,模幂运算次数为1000次。
操作 | 256位 | 512位 | 1024位 | 2048位 | 4096位 | |||||
---|---|---|---|---|---|---|---|---|---|---|
Unsigned Bigint | boost | Unsigned Bigint | boost | Unsigned Bigint | boost | Unsigned Bigint | boost | Unsigned Bigint | boost | |
加 | 0.0060686 | 0.0083953 | 0.0064107 | 0.0115023 | 0.0091979 | 0.0212813 | 0.0151207 | 0.0388485 | 0.0315682 | 0.0767778 |
减 | 0.0052497 | 0.0079826 | 0.0062715 | 0.0123272 | 0.0095903 | 0.0280378 | 0.0165817 | 0.0494003 | 0.0354999 | 0.0785873 |
乘 | 0.019142 | 0.0335125 | 0.063854 | 0.2700601 | 0.111633 | 0.3944791 | 0.3698449 | 1.4607164 | 1.2972828 | 5.5994093 |
除 | 0.9787682 | 0.2175322 | 1.6977481 | 0.3206437 | 2.571229 | 0.6465876 | 5.7703808 | 4.6256008 | 11.174972 | 10.216111 |
模幂 | 0.0675292 | 0.2627964 | 0.2580181 | 1.6192191 | 1.2872345 | 10.114824 | 7.361546 | 76.14449 | 52.701681 | 445.34939 |
boost自己进行的性能测试可以在这里找到。