这个README.md已经不是最新的了,因为这个写工具库的人懒得更新。征求一位共同开发者,负责写外面的README.md。
(只有中文版)
这是给需要一些工具的人用的。下面是对各个文件的功能详述:
matrix.cpp里面有matrix类。这个类的功能是实现矩阵。目前实现了矩阵的加、减、乘、除运算(除法只能是对一个整数),还有返回转置矩阵的
const Matrix<Int> transpose() const;以及对矩阵求矩阵的迹(注意如果大小不是N*N的会出错):
const Int trace() const;如果你需要将矩阵的元素改成其他的,请使用模板类
template <typename Int> class Matrix;其中的Int即为元素类型。要求支持四则运算。
BigInt.cpp里面包含UnsignedBigInt类和BigInt类。其中BigInt类由UnsignedBigInt类实现。请注意,严格模式(后面有介绍)开启后,程序如果出错就会抛出一些错误信息(以cerr进行),并抛出exception()异常。对于一些普通函数,请注意其声明后面的注释,这个注释是用于说明功能的。
UnsignedBigInt类是无符号大整型类。构造函数:
UnsignedBigInt();
UnsignedBigInt(string& s, mode_type _strict = default_strict_mode);
UnsignedBigInt(string&& s, mode_type _strict = default_strict_mode);
UnsignedBigInt(const maxinteger_type _val,
mode_type _strict = default_strict_mode);
UnsignedBigInt(const vector<value_type>& val,
mode_type _strict = default_strict_mode);
UnsignedBigInt(const vector<value_type>&& val,
mode_type _strict = default_strict_mode);从中可以看到,UnsignedBigInt类可以由string构造,也可以由const UnsignedBigInt::maxinteger_type类型构造,或者由vector<UnsignedBigInt::value_type>构造。具体地,string会被逐个字符转化为数字并被存储起来;const UnsignedBigInt::maxinteger_type会被按照十进制的解释被存储起来;vector<UnsignedBigInt::value_type>会被按照下标解释为顺序的数字并被存储起来。
至于除了默认构造函数以外,所有的构造函数后面都可以附加一项mode_type的数字,指出是否开启严格模式。具体地,mode_type被定义为一个typedef,而以mode_type为存储类型的enum是strict_mode,其中储存着的就是指出是否开启严格模式的两种状态。
UnsignedBigInt类有完整的重载函数,使之可以处理基本的运算,具体地,UnsignedBigInt类重载了:+、-、*、/、%,以及流运算符和幂运算^。对于所有运算符重载,都有其累积形式(如+=、-=)。当然,流运算符并没有此类重载。目前正在试验qpow外部函数,请不要尝试。
由于UnsignedBigInt是无符号的,所以无法处理负数。每当使用时遇到负数,UnsignedBigInt均会抛出异常。
BigInt是有符号大整型类。构造函数:
BigInt();
BigInt(string& s, mode_type _strict = UnsignedBigInt::default_strict_mode);
BigInt(string&& s, mode_type _strict = UnsignedBigInt::default_strict_mode);
BigInt(maxinteger_type _val,
mode_type _strict = UnsignedBigInt::default_strict_mode);
BigInt(const UnsignedBigInt&);
BigInt(UnsignedBigInt&&) noexcept;能够看到,BigInt类比UnsignedBigInt类多了可以接受一个UnsignedBigInt类参数的构造函数。
BigInt类的功能与UnsignedBigInt类是大致相同的,具体可以参阅相关程序。
- **注:**本文经过重写,漏掉了某些函数。对于更多有用的函数,可以参阅相关文档。
maths.h是数学库,可以对BigInt类和UnsignedBigInt类做开平方根的运算,以及对BigInt类做绝对值的运算。开平方根的运算的调用方法是:
Sqrt(a);//返回a的平方根,误差不超过1。如果尝试对一个负数开平方根,程序将抛出以下错误:
BigInt Sqrt(const BigInt x):Cannot do sqrt() with x<0!
求绝对值的调用方法是:
Abs(a);//返回a的绝对值,仅适用于BigInt类因为UnsignedBigInt类是无符号类,本身就是正数,所以不用求绝对值。
同时这里有一些函数工具:
Code命名空间中储存了加密解密的函数,需要包含code.cpp。其中实现了4个函数:
const std::string decode_base64(const std::string&); //用base64解码,返回
void decode_base64_this(std::string&); //用base64解码,原地操作
const std::string encode_base64(const std::string&); //用base64加密,返回
void encode_base64_this(std::string&); //用base64加密,原地操作从注释中可以得知它们是用于base64编码的加密解密的。注意如果其中发生错误,程序会抛出类型为Code::base64_error的错误,成员what指出了具体错误。
--snip--
2022/12/21: 已经添加了除法运算。现在正在尝试对BigInt类和UnsignedBigInt类做开平方根的运算。有知道代码的可以联系我。
2022/12/22:
- 修正一点小错误。
- 已经可以对
BigInt类和UnsignedBigInt类做开平方根的运算了。 - 添加了
BigInt类和UnsignedBigInt类的取余运算。
2022/12/28:添加了Code函数工具命名空间,用于密码。
2023/1/3:放松了matrix类相乘的限制,现在一个N行L列的矩阵可以乘以一个L行M列的矩阵,不再要求N和M相等。
2023/1/28:
- 添加了
BigInt类和UnsignedBigInt类的是否严格模式的设置。 - 添加分数模板类
Fraction,但未实现其功能。
2023/2/5:
- 实现了分数模板类
Fraction的部分构造函数,但开发方向可能不在这上面。 - 修复了若干
BigInt类的bug,并采取新的测试方式。
2023/2/6:
- 对
README.md进行了结构调整,现在结构相当清晰。 - 错误的显示方式已经模板化。
对于一个长n宽m的Matrix类,大部分操作的时间复杂度都为O(nm)。但是求矩阵的迹(const Int trace() const;)的时间复杂度为O(n)。
对于一个长度为a的UnsignedBigInt类和一个长度为b的UnsignedBigInt类(a是左操作数,b是右操作数),执行加法、减法的时间复杂度为O(max(a,b)),执行乘法、除法、取余的时间复杂度为O(ab)。
对于一个长度为a的UnsignedBigInt类和一个UnsignedBigInt::maxinteger_type类型的数b,执行幂运算的时间复杂度为O(a^(log b))。
导入的时候请注意导入的后缀名为.cpp,这一点与标准库不同。
程序的报错会通过cerr进行,如果不想显示可以对cerr进行重定向。