12

我正在寻找有关何时在 Clojure 中使用 Clojure BigInt 与 Java BigInteger 的指导。两者都工作得很好,我假设使用 BigInt 的主要原因是利用诸如+and之类的运算符=,例如必须通过 Java 实例方法.addand来访问它们.equals。但是很少有运算符,例如isProbablePrime,我只能从 BigInteger 访问。

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

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)
4

1 回答 1

27

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

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

另一个原因是BigInts 被优化为尽可能使用原始类型,因此在许多情况下性能应该更好。

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

于 2013-08-02T19:06:12.570 回答