25 个版本
新版本 0.4.15 | 2024 年 8 月 18 日 |
---|---|
0.4.14 | 2024 年 6 月 22 日 |
0.4.10 | 2024 年 5 月 31 日 |
0.4.5 | 2024 年 2 月 12 日 |
0.2.5 | 2022 年 7 月 18 日 |
643 在 数学 中排名
每月下载量 41,993
用于 58 个软件包 (5 个直接使用)
11MB
211K SLoC
而不是直接使用此软件包,请使用 malachite
元软件包。它导出此软件包的所有公共成员。
在 malachite-nz
的文档测试中,您通常会看到以 malachite_nz::
开头的导入路径。当使用 malachite
软件包时,将路径的这一部分替换为 malachite::
。
对 Natural
和 Integer
类型的导入路径进行了进一步缩短,变为 malachite::Natural
和 malachite::Integer
。
malachite-nz
此软件包定义了 Natural
(非负整数)和 Integer
。与原始整数(如 u32
、i32
等)不同,这些可以是任意大的。此软件包的名称指的是自然数和整数的数学符号,ℕ 和 ℤ。
-
在
Natural
和Integer
上定义了许多函数。这包括- 所有您期望的,如加法、减法、乘法和整数除法;
DivRound
的实现,它提供根据指定的RoundingMode
四舍五入的除法;- 各种数学函数,例如实现
FloorSqrt
和Gcd
; - 模运算函数,例如实现
ModAdd
和ModPow
,以及针对2的幂次的算术特性的特性,如ModPowerOf2Add
和ModPowerOf2Pow
; - 用于逻辑和位操作的各种函数,例如
BitAnd
和BitAccess
。
-
这些函数的实现使用高性能算法,对于大数工作效率高。例如,乘法使用原始的二次算法,或者13种Toom-Cook乘法变体之一,或者根据输入大小使用Schönhage-Strassen(FFT)乘法。
-
小数也被高效处理。任何小于264的
Natural
都不使用任何分配的内存,与这些数字的工作速度几乎与原始整数一样快。因此,Malachite不提供将Natural
添加到u64
的实现,因为u64
可以非常便宜地转换为Natural
。 -
Malachite 智能地处理内存。考虑这样一个问题:将一个1000位的
Natural
和一个500位的Natural
相加。如果我们只有这些Natural
的引用,那么我们必须为新结果分配新的内存,这就是&Natural + &Natural
实现所做的事情。然而,如果我们能够以值的形式获取第一个(较大的)Natural
,那么我们就不需要分配任何内存(除了不太可能的进位情况):我们可以重用第一个Natural
的内存来存储结果,这正是Natural + &Natural
实现所做的事情。另一方面,如果我们只能以值的形式获取第二个(较小的)Natural
,那么我们只有500位的内存可用,这不足以存储总和。在这种情况下,包含较小Natural
数据的Vec
可以扩展以容纳1000位,希望这将比在全新的Vec
中分配1000位更有效率。最后,如果两个Natural
都是以值的形式获取的,那么Natural + Natural
实现将选择重用较大的一个的内存。现在考虑在计算表达式
&x + &y + &z
时会发生什么,其中每个Natural
有 n 位。Malachite 必须为结果分配大约 n 位,但对于中间总和&x + &y
呢?Malachite 需要为它再分配 n 位,总共 2 n 位吗?不!Malachite 首先为&x + &y
分配 n 位,然后使用上述描述的Natural + &Natural
实现将这个部分总和以值的形式取出;因此,这些 n 位被重用于最终的总和。
数位
大 Natural
和 Integer
将其数据存储为某些原始类型的 Vec
。这些 Vec
的元素在 GMP 术语中被称为“数位”,因为它们是大的数位。默认情况下,Limb
的类型是 u64
,但您可以使用 32_bit_limbs
功能将其设置为 u32
。
演示和基准测试
这个软件包附带了一个 bin
目标,可用于运行演示和基准测试。
- 这个软件包中几乎所有公共函数都有一个相关的演示。运行演示可以展示函数在大量输入上的行为。例如,要演示在
mod_pow
函数上的Natural
,可以使用以下命令
此命令使用cargo run --features bin_build --release -- -l 10000 -m exhaustive -d demo_natural_mod_pow
exhaustive
模式,它生成所有可能的输入,通常从最简单的输入开始,逐步过渡到更复杂的输入。另一种模式是random
。-l
标志指定应生成多少个输入。 - 您可以使用类似的命令来运行基准测试。以下命令对各种
u64
的 GCD 算法或其他库的 GCD 实现进行基准测试
或基准测试cargo run --features bin_build --release -- -l 1000000 -m random -b \ benchmark_natural_gcd_algorithms -o gcd-bench.gp
这会创建一个名为 gcd-bench.gp 的文件。您可以使用 gnuplot 将其转换为 SVG,如下所示cargo run --features bin_build --release -- -l 1000000 -m random -b \ benchmark_natural_gcd_library_comparison -o gcd-bench.gp
gnuplot -e "set terminal svg; l \"gcd-bench.gp\"" > gcd-bench.svg
可用的演示和基准测试列表尚未记录;您必须通过浏览 bin_util/demo_and_bench
来查找它们。
特性
32_bit_limbs
:将Limb
的类型设置为u32
而不是默认的u64
。random
:此特性提供了一些用于随机生成值的函数。默认情况下是关闭的,以避免引入一些额外的依赖项。enable_serde
:启用使用 serde 的序列化和反序列化。test_build
:这个软件包中很大一部分代码仅用于测试。对于典型用户,构建此代码会导致编译时间过长,生成的二进制文件过大。其中一些也用于测试malachite-q
,因此不能仅限于tests
目录。我的解决方案是在启用test_build
特性时仅构建此代码。如果您想运行单元测试,则必须启用test_build
。但是,文档测试不需要它,因为它们仅测试公共接口。启用此特性也会启用random
。bin_build
:此特性用于构建用于演示和基准测试的代码,构建时间也较长。启用此特性也会启用test_build
和random
。
Malachite 由 Mikhail Hogrefe 开发。感谢 b4D8、florian1345、konstin、Rowan Hart、YunWon Jeong、Park Joon-Kyu、Antonio Mamić、OliverNChalk 和 shekohex 的额外贡献。
版权所有 © 2024 Mikhail Hogrefe
依赖项
~2–12MB
~149K SLoC