有没有一个适用于 Ocaml 的 Bignum 模块?

8

我查了一些资料,根据这篇文章,标准库中曾经有一个Bignum模块。但是现在,我却没有在标准库中找到任何相关内容。

3个回答

12

OCaml核心发行版中没有bignum模块。 官方建议 是使用第三方Zarith,特别是它的Z模块

如果您已将OCaml安装为操作系统分发的一部分,请查看是否有Zarith的软件包。例如,在Debian、Ubuntu和衍生产品上,它是libzarith-ocaml-dev。如果Zarith在操作系统中不可用,请使用OPAM进行安装:

opam install zarith

在构建应用程序时,使用以下之一进行编译:

ocamlc -I +zarith zarith.cma …
ocamlopt -I +zarith zarith.cmxa …
ocamlfind <COMMAND> -package zarith -linkpkg …

要在toplevel中使用Zarith:

ocaml -I +zarith zarith.cma zarith_top.cma

Ocaml的旧版本在标准发行版中有一个bignum模块(但不在标准库中:它不需要单独安装,但必须显式链接)。这是nums,其主模块为Num。从OCaml 4.06开始,nums库被分开发行

从技术上讲,在标准库中没有bignum模块,因为Ocaml术语中的标准库是程序编译所依赖的默认库,其中没有bignum模块。也没有Bignum库,因为bignum库被称为nums,其主模块称为Num。自Ocaml被称为Ocaml之前,它就已经成为标准Ocaml发行版的一部分,现在仍然如此。


这是一个旧问题,有着旧的答案。对于现在找到它的任何人来说,num已经被取代了。根据https://github.com/ocaml/num的说法,“需要任意精度算术的新应用程序应该使用Zarith库(https://github.com/ocaml/Zarith)而不是Num库,而已经使用Num的旧应用程序则被鼓励切换到Zarith。Zarith比Num具有更好的性能和更好的API。” bignum是Zarith的包装器。 - Mars

9
你正在寻找 num 库。严格来说,它并不是“标准库”的一部分,但是它是标准发行版的一部分。因此,只需使用该库进行编译即可使用。另外,您可能会对新的 zarith 库感兴趣。我不确定这两个库之间的差异。

4
在 Frama-C 的值分析中,多次使用大整数来表示被分析程序的整数以及作为内存模型中的偏移量。将 Big_int 替换为 Zarith 可以节省50%的内存并提高33%的执行时间。在仅使用小整数的纯整数基准测试中,Zarith 的速度提高了8倍。(Big_intint 慢32倍,而 Zarith 比 int 慢3.9倍)。 - Pascal Cuoq
我注意到Zarith来自Xavier Leroy。考虑到它相对于当前的Big_int的优势,似乎Zarith应该成为标准分发的一部分,有人知道是否计划这样做吗? - aneccodeal
1
@aneccodeal 嗯,这里有一个对GMP的依赖。很可能Zarith最终会被集成到OCaml中,但Xavier可能会等待所有问题都得到解决。所以现在就使用它(并让其他人知道),这样它就可以更快地集成 :) - Pascal Cuoq

4

除了其他回答之外,一般的任意精度模块是 Num(它包括大整数和大有理数)。此外,还有一个专门用于大整数的 Big_int 模块;Num 使用 Big_int 模块来支持大整数,但如果您只需要大整数而不是分数,可以直接使用 Big_int。这两者都是 num 库的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接