https://github.com/with-sky/hyperint
A single head file high precision integer library
https://github.com/with-sky/hyperint
cpp high-performance-computing
Last synced: 12 months ago
JSON representation
A single head file high precision integer library
- Host: GitHub
- URL: https://github.com/with-sky/hyperint
- Owner: With-Sky
- License: mit
- Created: 2021-11-06T05:44:25.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2023-03-10T12:20:25.000Z (about 3 years ago)
- Last Synced: 2025-03-25T19:11:15.146Z (about 1 year ago)
- Topics: cpp, high-performance-computing
- Language: C++
- Homepage:
- Size: 196 KB
- Stars: 22
- Watchers: 1
- Forks: 3
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# 关于HyperInt
## 概述:HyperInt是一个单头文件的大整数库,主要通过定义 HyperInt 类计算大整数。库内hint命名空间定义了常用数学函数:复数类,FFT/IFFT,NTT/INTT,中国剩馀定理CRT,快速(带模除和不带模除)整数幂。
## 计算效率分析
### 关于空间:
HyperInt通过一个32位整数数组来存储数字,即原生使用2^32进制,最大化内存空间利用率。而在转为10进制字符串或者通过10进制字符串转入的过程中,使用的fft算法将消耗大量内存,解决方法是使用print_hex()方法输出16进制数避免进制转换。
### 关于时间:
对于被操作的位数为M、N的两数,通过常规算法计算加减法,时间复杂度为O(max(M,N))。乘法视MN的大小而定,在调用常规乘法时为O(M\*N),fft和ntt为O((M+N)log(M+N)),但ntt的时间常数较大,对于特别大的数是使用karatsuba算法递归分割,单纯的karatsuba算法时间复杂度为O(n^(log3)),分割到其他算法可以处理时调用其他算法。对于除法,有长除法和牛顿迭代法,长除法在M和N较小时速度较快,为O(M\*N),牛顿迭代法速度取决于其内部使用的乘法速度,在使用FFT时为O(Nlog(N)log(M))(*被除数的位数是M,除数的位数是N*),例外情况是被除数和除数有多位相似时长除法表现的速度会很快。支持多线程计算乘除法,默认关闭,取消宏MULTITHREAD的注释即可开启。其他方法的时间复杂度暂不分析~
## 如何使用
### 引入头文件
在程序的开头需要包含头文件
`#include "hint.hpp"`
### 创建一个HyperInt 对象
`HyperInt a(12345678); //使用整数初始化`
`HyperInt b(-12345678);`
`HyperInt c("12345678");//使用字符串初始化`
`HyperInt d("-12345678");`
`HyperInt e(string("12345678"));//使用string字符串初始化`
`HyperInt f(string("-12345678"));`
除此以外,使用 `=` 初始化也可
如 `HyperInt g = "123456";`整数和string同理
### 算术运算(在初始化上述变量的前提下)
`a = b + c;//加法`
`a = b - c;//减法`
`d = e * f;//乘法`
`e = d / f;//除法`
`e = d % f;//模除`
`a = b.square();//a被赋值为b的平方`
`a = b.square_root();//a被赋值为b的平方根`
以及&、&=、|、|=、^、^=的位运算
### 逻辑比较
`bool is_bigger = HyperInt("200000000000000000000000") > HyperInt("100000000000000000000000");//true`
此外>=、<、<=、==、!=同理
### 打印输出
`HyperInt a = "123456789123456789";`
`string s = s.to_string()//转10进制字符串`
`string s = to_string(a)//转10进制字符串`
`a.print_hex();//以16进制打印输出`
`a.print_dec();//以10进制打印输出`
`print(a);//a的位数较小时以10进制打印输出,内部数组长度大于1000000时打印16进制数`
`cout << a;//直接打印a的10进制数`
### 附加函数
`HyperInt a = factrial(10000);//a被初始化为10000!`
`HyperInt b = factorial(100,50);//b被初始化为50到100的连乘,即排列数排列数A(n,m) n!/(n-m)!`
`HyperInt c = combination(100,50);//c被初始化为组合数C(n,m) n!/((n-m)!m!)`
## 性能实测
### 测试平台
硬件
`CPU:AMD Ryzen 7 3700X 8-Core 八核`
`主 板:华硕 ROG STRIX B450-I GAMING`
`内 存:32 GB ( KLEVV DDR4 3600MHz )`
软件平台
`版本 Windows 11 专业工作站版`
`版本 21H2`
`操作系统版本 22000.1042`
`体验 Windows 功能体验包 1000.22000.1042.0`
`编译器:gcc version 12.1.0 (x86_64-posix-seh-rev3, Built by MinGW-W64 project)`
`编译选项:-std=c++14 -O`
编译运行Main.cpp 即计算10000!、100000!、1000000!
用时分别为3.369ms、89.529ms、2368.69ms
开启多线程时间分别为3.342ms、37.459ms、679.134ms
使用Visual C++编译器速度会更快一点~
更多运算请使用者自行测试~
遇到bug可以积极反馈~
感谢支持~