Sto cercando indicazioni su quando utilizzare Clojure BigInt rispetto a Java BigInteger in Clojure. Entrambi funzionano perfettamente e presumo che la ragione principale per utilizzare BigInt sia quella di sfruttare operatori come +
e =
, ai quali è necessario accedere tramite i metodi di istanza Java .add
e .equals
, ad esempio. Ma ci sono pochi operatori, come ad esempio isProbablePrime
, a cui posso accedere solo da BigInteger.casi d'uso per BigInt contro BigInteger in Clojure
Sembra abbastanza facile passare da BigInt a BigInteger o viceversa, ma la presenza di entrambi rende i casi d'uso poco chiari per me. La mia reazione istintiva è semplicemente quella di restare con BigInteger in assenza di criteri chiari, dal momento che alcuni degli usi suggeriti sembrano non funzionare. Da clojuredocs here:
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)
Dopo aver dato un'occhiata al codice sorgente di BigInt (https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/BigInt.java) sembra che un BigInt contenga entrambi un java.math.Bigint e un lungo. Sulla pagina web Clojure si dice che i BigInts mantengono il loro tipo in tutte le operazioni. Considerando che puoi lanciare facilmente con .toBigInteger e .fromBigInteger nel caso in cui tu voglia usare metodi come isProbablePrime, e anche considerando che non è facile costruire come java.math.BigInteger, mi limiterei a bigint e cast avanti e indietro se necessario (BigInts farlo da sé ad esempio in .add). –
In realtà 'clojure.lang.BigInt/fromBigInteger'; Ho aggiunto un esempio qui http://clojuredocs.org/clojure_core/clojure.core/bigint –
Usavate i numeri di Lucas per caso? – Carcigenicate