2013-08-02 2 views
11

Clojure에서 Clojure BigInt와 Java BigInteger를 사용하는 경우에 대한 지침을 찾고 있습니다. 둘 다 잘 작동합니다. BigInt를 사용하는 가장 큰 이유는 +=과 같은 연산자를 활용하는 것이고, Java 인스턴스 메서드 .add.equals을 통해 액세스해야한다고 가정합니다. 하지만 isProbablePrime과 같이 BigInteger에서만 액세스 할 수있는 연산자는 거의 없습니다.Clojure에서 BigInt 대 BigInteger의 사용 사례

BigInt에서 BigInteger로 또는 그 반대로 이동하는 것은 꽤 쉬운 것처럼 보이지만, 둘 다 존재하면 유스 케이스가 불분명하게됩니다. 제안 된 사용법 중 일부는 작동하지 않는 것처럼 보이기 때문에 명확한 기준이 없으면 BigInteger를 사용하는 것이 좋습니다.

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) 
+1

BigInt (https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/BigInt.java)의 소스 코드를 살펴본 후 BigInt에 둘 다 포함 된 것처럼 보입니다. java.math.Bigint 및 long. Clojure 웹 페이지에는 BigInts가 모든 작업에 걸쳐 유형을 유지한다고 나와 있습니다. isProbablePrime과 같은 메서드를 사용하고 java.math.BigInteger로 쉽게 생성 할 수 없다는 점을 고려하여 .toBigInteger 및 .fromBigInteger를 사용하여 쉽게 캐스팅 할 수 있다고 가정 할 때 bigint를 사용하여 앞으로 캐스팅합니다. 필요할 경우 다시 가져옵니다 (BigInts는 .add에서이 작업을 직접 수행합니다). –

+0

사실 그것은'clojure.lang.BigInt/fromBigInteger'입니다; 여기에 예제를 추가했습니다. http://clojuredocs.org/clojure_core/clojure.core/bigint –

+0

우연히 lucas 번호를 사용 했습니까? – Carcigenicate

답변

22

C. Emerick 등으로 "Clojure의 프로그래밍"에서 : clojuredocs here에서. al., p.428에는 사이드 바 주제 인 "Java가 BigInteger에서 하나를 제공 할 때 Clojure가 자체 BigInt 클래스를 갖는 이유는 무엇입니까?"라는 주제가 있습니다.

그들은 BigIntegerBigInt을 선호하는 두 가지 이유에 유의하십시오. 첫째, 후자의 .hashCode 구현은 Long의 구현과 일치하지 않습니다. 각 유형에 표시된 동일한 숫자는 다른 해시 값을 제공합니다. 일반적으로이 값을 비교할 때 일반적으로 원하는 값이 아닙니다. 해시 맵.

다른 이유는 BigInt이 가능한 경우 기본 유형을 사용하도록 최적화되어 있기 때문에 성능이 많은 경우에 더 좋을 것입니다.

좋은 이유가없는 한 Clojure의 숫자 유형을 사용합니다 (.isProbablePrime을 사용하면 충분한 이유가 있음을 나타냄).

+1

그 훌륭한 답변에 감사드립니다. 그들은 이런 것들을 문서화에 써야합니다. –

+3

'hash-code'와'range'와 같은 다른 연산자의 연속성이'BigInt'에 대한 편향에 충분한 이유라고 생각합니다. '.isProbablePrime'과 같은 것들을위한 브리징 연산의 작은 라이브러리를 만들 수 있습니다. 이 전략은 전체적으로 더 작은 라이브러리를 제공 할 것입니다. 대안으로, 저는 'BigInteger', 예를 들어'big-range','big-le' 등에 전체 수학 라이브러리를 작성하기 시작했습니다. –