Skip to content

With-Sky/HyperInt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

关于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可以积极反馈~
感谢支持~

About

A single head file high precision integer library

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages