2012-04-26 5 views
10

몇 가지 매우 큰 숫자를 조작해야하는 프로젝트 (스칼라에서 작업)를하고 있습니다. 정수형으로 표현하기에는 너무 커서 Java는 BigInteger 및 BigDecimal 클래스를 제공합니다 (그리고 scala는 멋진 래퍼를 제공합니다). 그러나이 라이브러리는 과거에 사용한 다른 임의 정밀 라이브러리 (즉, http://www.ginac.de/CLN/)보다 느리며 속도 차이가 언어 단독으로 인한 것보다 더 큰 것으로 나타났습니다.JVM 임의 정밀도 라이브러리

내 프로그램의 프로파일 링을 수행했으며 실행 시간의 44 %가 BigInteger 곱하기 메소드에서 사용되었습니다. 내 프로그램을 조금 빠르게하고 싶습니다. 그래서 BigInteger 클래스 (및 스칼라 래퍼)보다 빠르고 효율적인 옵션을 찾고 있습니다. LargeInteger (JScience 출신)와 Aint (Afloat 출신)를 살펴 봤습니다. 그러나 둘 다 표준 BigInteger 클래스보다 느리게 수행되는 것으로 보입니다.

누구든지 고성능 정수 곱셈과 덧셈에 중점을 둔 임의 정밀도 수학 라이브러리를 알고 있습니까?

+0

좋은 경험이있는 것 같습니다. http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library – thoredge

+0

감사합니다. 그러나, 나는이 질문을 보았고, JScience와 AFloat 라이브러리 (BigInteger보다 느리다)를 시도했다. 내 숫자가 크기면에서 황혼 지역에 있기 때문에 (~ 1500 자리) 이것은있을 수 있습니다. 어쨌든, 나는 C++ 코드가 이것을 달성함으로써 작업이 훨씬 빨라질 수 있음을 안다. 언어의 차이와 더불어, 변경 가능 성 (불변의 Java impls에 비해) 또한 작용할 수 있습니다. – nomad

답변

1

불행히도, 나는 당신이 자바 네이티브 라이브러리가 부족하다고 생각합니다. 나는 하나도 찾지 못했다. JNI를 사용하여 우수한 임의 정밀도 성능을 가진 GMP를 래핑하는 것이 좋습니다. JNI 오버 헤드가 있지만 1500 자릿수 범위라면 알고리즘 복잡도의 차이와 비교하여 작아야합니다. Java 용 GMP의 다양한 포장을 찾을 수 있습니다 (가장 인기있는 것은 here입니다).

+0

감사합니다 Rex. 이 대답을 받아 들일 것입니다. b/c 소리가 나는 것처럼 보입니다. 그러나, 그것은 b/c 내가 큰 정수, JNI 오버 헤드 및 JVM/네이티브 개체 할당을 실제로 많은 여기에 나를 죽이는 만들고있어 보인다; Java BigInteger보다 성능이 떨어집니다. – nomad

+0

@nomad - 정수를 다시 사용해야합니다. GMP가이 작업을 수행 할 수 있으며 Scala는 재사용 문제를 다소 도움이 될 수있는 업데이트 및 왼쪽 반환 인수 작업을 제공 할 수 있습니다. 컴퓨터 언어 벤치 마크 게임에서 GMP를 사용하는 "pidigits"스칼라 프로그램에서이를 수행하는 방법에 대한 아이디어를 참조하십시오. (나는 이것이 가장 우아하다고 주장하지는 않지만, 적어도 약간은 실행 가능하다.) –

2

저는 조금 늦었습니다 ... 저는 단지 C++과 Java 모두에서 사용 가능한 apfloat 라이브러리 만 알고 있습니다. Apfloat-Library:

관련 문제