#原始整数 #大数

bin+lib malachite-nz

包含从 GMP 和 FLINT 部分推导出的有效算法的自然数和大整数类型

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数学 中排名

Download history 6970/week @ 2024-05-04 8325/week @ 2024-05-11 16934/week @ 2024-05-18 8682/week @ 2024-05-25 8293/week @ 2024-06-01 14131/week @ 2024-06-08 7866/week @ 2024-06-15 10368/week @ 2024-06-22 9273/week @ 2024-06-29 9834/week @ 2024-07-06 5401/week @ 2024-07-13 8047/week @ 2024-07-20 7587/week @ 2024-07-27 7648/week @ 2024-08-03 11218/week @ 2024-08-10 14295/week @ 2024-08-17

每月下载量 41,993
用于 58 个软件包 (5 个直接使用)

LGPL-3.0-only

11MB
211K SLoC

而不是直接使用此软件包,请使用 malachite 元软件包。它导出此软件包的所有公共成员。

malachite-nz 的文档测试中,您通常会看到以 malachite_nz:: 开头的导入路径。当使用 malachite 软件包时,将路径的这一部分替换为 malachite::

NaturalInteger 类型的导入路径进行了进一步缩短,变为 malachite::Naturalmalachite::Integer

malachite-nz

此软件包定义了 Natural(非负整数)和 Integer。与原始整数(如 u32i32 等)不同,这些可以是任意大的。此软件包的名称指的是自然数和整数的数学符号,ℕ 和 ℤ。

  • NaturalInteger 上定义了许多函数。这包括

  • 这些函数的实现使用高性能算法,对于大数工作效率高。例如,乘法使用原始的二次算法,或者13种Toom-Cook乘法变体之一,或者根据输入大小使用Schönhage-Strassen(FFT)乘法

  • 小数也被高效处理。任何小于264Natural都不使用任何分配的内存,与这些数字的工作速度几乎与原始整数一样快。因此,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 时会发生什么,其中每个 Naturaln 位。Malachite 必须为结果分配大约 n 位,但对于中间总和 &x + &y 呢?Malachite 需要为它再分配 n 位,总共 2 n 位吗?不!Malachite 首先为 &x + &y 分配 n 位,然后使用上述描述的 Natural + &Natural 实现将这个部分总和以值的形式取出;因此,这些 n 位被重用于最终的总和。

数位

NaturalInteger 将其数据存储为某些原始类型的 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
    
    或基准测试
    cargo run --features bin_build --release -- -l 1000000 -m random -b \
        benchmark_natural_gcd_library_comparison -o gcd-bench.gp
    
    这会创建一个名为 gcd-bench.gp 的文件。您可以使用 gnuplot 将其转换为 SVG,如下所示
    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_buildrandom

Malachite 由 Mikhail Hogrefe 开发。感谢 b4D8、florian1345、konstin、Rowan Hart、YunWon Jeong、Park Joon-Kyu、Antonio Mamić、OliverNChalk 和 shekohex 的额外贡献。

版权所有 © 2024 Mikhail Hogrefe

依赖项

~2–12MB
~149K SLoC