Clojure中BigInt与BigInteger的用例

Clojure中BigInt与BigInteger的用例,clojure,Clojure,我正在寻找关于何时在Clojure中使用Clojure BigInt和Java BigInteger的指导。这两种方法都可以很好地工作,我假设使用BigInt的主要原因是利用像+和=这样的操作符,它们必须通过Java实例方法.add和.equals进行访问。但是,我只能从BigInteger访问一些运算符,例如isProbablePrime 从BigInt转换到biginger似乎很容易,反之亦然,但两者的存在使我不清楚用例。我下意识的反应是在没有明确标准的情况下坚持使用BigInteger,因

我正在寻找关于何时在Clojure中使用Clojure BigInt和Java BigInteger的指导。这两种方法都可以很好地工作,我假设使用BigInt的主要原因是利用像
+
=
这样的操作符,它们必须通过Java实例方法
.add
.equals
进行访问。但是,我只能从BigInteger访问一些运算符,例如
isProbablePrime

从BigInt转换到biginger似乎很容易,反之亦然,但两者的存在使我不清楚用例。我下意识的反应是在没有明确标准的情况下坚持使用BigInteger,因为一些建议的用法似乎不起作用。发件人:

在C.Emerick等人的“Clojure编程”第428页中,有一个侧栏主题,“为什么Clojure有自己的BigInt类,而Java已经在BigInteger中提供了一个?”

他们指出了两个喜欢
BigInt
而不喜欢Java的
biginger
的原因。首先,后者的
.hashCode
实现与
Long
的实现不一致(每种类型中表示的相同数字给出不同的哈希值)。在比较哈希映射等中的等效值时,这通常不是您想要的

另一个原因是,
BigInt
s经过优化,尽可能使用基本类型,因此在许多情况下性能应该更好


我会使用Clojure的数字类型,除非你有很好的理由不这样做(你使用
.isProbablePrime
表明你可能有足够好的理由)。

看了BigInt()的源代码后,BigInt似乎同时包含java.math.BigInt和long。在Clojure的网页上,它说Bigint在所有操作中都保持其类型。考虑到您可以轻松地使用.tobiginger和.fromBigInteger强制转换,以防您想要使用isProbablePrime之类的方法,同时考虑到构建为java.math.BigInteger并不容易,我会坚持使用bigint,并在必要时来回转换(bigint本身会这样做,例如in.add).它实际上是
clojure.lang.BigInt/fromBigInteger
;我在这里加了一个例子,谢谢你的回答。他们应该在docstring中写入这些内容。我认为
hash code
和其他操作符(如
range
)的连续性是偏向
BigInt
的充分理由。我可以为
.isProbablePrime
之类的东西创建一个桥接操作的小库。这一策略将使我总体上拥有一个更小的库,因为在另一种情况下,我开始沉迷于通过
biginger
编写整个数学库,例如
big range
big le
,等等。
user=> (def x (bigint 97))
user=> (.isProbablePrime x 1)
IllegalArgumentException No matching method found: isProbablePrime for class     
clojure.lang.BigInt  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)