GithubHelp home page GithubHelp logo

5ht / unsigned-bigint Goto Github PK

View Code? Open in Web Editor NEW

This project forked from nzh63/unsigned-bigint

0.0 1.0 0.0 148 KB

An efficient big integer C++ library.

License: Apache License 2.0

C++ 96.20% Assembly 3.80%

unsigned-bigint's Introduction

bigint

这是一个大数运算库。

要求

  • 编译时要求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自己进行的性能测试可以在这里找到。

unsigned-bigint's People

Contributors

nzh63 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.