실행 시간 : 자바의 BigInteger 대 부스트 멀티 정밀도

User_67128 :

나는 뤼카 - 레머 소수 판별법을 구현하기 위해 노력하고있어.

나는이 다음과이며, 두 가지 구현, 자바에서 C에서 하나 ++ 및 기타했습니다 :

C ++ :

int p = 86243;
cpp_int M;

bit_set(M, p);
M = M-1; // M = 2^p - 1;

cpp_int S;
S = 4;

while(p>2) {
         S = pow(S, 2);
         S -= 2;

         S %= M;
         p--;         
}

자바:

int p = 86243;

BigInteger M = BigInteger.ZERO;
BigInteger Two = BigInteger.valueOf(2L);

M = M.setBit(p);
M = M.subtract(BigInteger.ONE); // M = 2^p - 1;

BigInteger S = BigInteger.valueOf(4L);

while(p>2) {
         S = S.pow(2).subtract(Two).mod(M);
         p--;        
}

자바 코드는 내가 자바 CodeBlocks 및 Eclipse를 사용하고 C ++를 들어, 훨씬 빠른 C ++ 코드보다 실행됩니다.

그것에 대한 이유라도? 나는 특히 C ++ 코드에서 아무것도 실종? 모든 제안을 이해할 수있을 것이다.

그레고르 버드 와이저 :

나는 당신이 두 프로그램 (Java 및 C ++ 버전) 동등 기대하지한다고 생각합니다. 성능은 대부분 언어보다는 사용되는 알고리즘에 따라 달라집니다. 프로파일 러 쇼에서 C ++ 버전을 실행 분할 (예 : 모드)가 병목입니다. 그런 다음 나누기 (/boost/multiprecision/cpp_int/divide.hpp)의 소스를 보면 당신이 댓글을 볼 수 있습니다 :

아주 간단하고 상당히 긴 부문 뇌사. [...] 특정 참조 크 누스 권 2.이 가능한 것보다 더 효율적 알고리즘, 거기하는 것으로 그러나 사지의 작은 숫자이 일반적으로 대안을 능가하는 성능 및 추가 스토리지를 필요로 정상화 단계를 피할 수 있습니다.

자바의 BigInteger를 구현하지만 크 누스 및 / 또는 BurnikelZiegler라는 알고리즘을 사용합니다. 이들은 더 큰 숫자에 적합 것 같다. 성능이 정말로 중요한 경우에 당신은 GNU 다중 정밀도 라이브러리 (GMP)을 사용하려고 할 수 있습니다. 내 컴퓨터에 GMP 버전은 대략 빠른 자바 / BigInteger를보다 3 배입니다 :

#include <iostream>
#include <gmp.h>
using namespace std;

int main()
{
    int p = 86243;
    mpz_t M;
    mpz_init(M);
    mpz_set_ui(M, 0);
    mpz_setbit(M, p);
    mpz_sub_ui(M, M, 1); // M = 2^p - 1;

    mpz_t S;
    mpz_init(S);
    mpz_set_ui(S, 4);

    while(p > 2) {
        mpz_pow_ui(S, S, 2);
        mpz_sub_ui(S, S, 2);

        mpz_mod(S, S, M);

        p--;
    }
    int r = mpz_get_ui(S);
    cout << "Is mersenne prime: " << (r == 0 ? "yes" : "no") << endl;
    return 0;
}

-lgmp와 링크

추천

출처http://43.154.161.224:23101/article/api/json?id=335617&siteId=1