문제

가 발견되어 내는 당황,그것을 먹이는 부정 지수를 mpz_pow_ui 이 작동하지 않습니다.("설명서는 말 unsigned long,당신은 알아요.") 에 대한 다른 mpz_pow 기능,설명서 사용하는 개념에 내가 이해하지 못합니다.예를 들어"base^exp"에서 다음과 같다:

void mpz_powm (mpz_t rop, mpz_t base, mpz_t exp, mpz_t mod) 
void mpz_powm_ui (mpz_t rop, mpz_t base, unsigned long int exp, mpz_t mod)
Set _rop_ to _base_^_exp_ mod _mod_.
Negative exp is supported if an inverse base-1 mod mod exists (see mpz_invert in Section 5.9 [Number Theoretic Functions], page 35). If an inverse doesn’t exist then a divide by zero is raised.

다음 코드에서 어떻게해야하는,그래서 이것을 처리할 수 있는 부정적인 지?

#define Z(x) mpz_t x; mpz_init( x );

BSTR __stdcall IBIGPOWER(BSTR p1, long p2 ) {
    USES_CONVERSION;

    Z(n1);
    Z(res);

    LPSTR sNum1 = W2A( p1 );

    mpz_set_str( n1, sNum1, 10 );

    mpz_pow_ui( res, n1, p2 );

    char * buff =  (char *) _alloca( mpz_sizeinbase( res, 10 ) + 2 );

    mpz_get_str(buff, 10, res);

    BSTR bResult = _com_util::ConvertStringToBSTR( buff );
    return bResult;
}
도움이 되었습니까?

해결책

mpz_t 데이터 형식을 저장할 수 있습니다 정수,그리고 2-18 하지 않은 정수입니다.을 계산하는,당신은 당신을 사용해야 부동 소수점 유형 mpf_t 또는 합리적인번호 입력 mpq_t.

다른 팁

나는 자르지 않을 것 코드에 당신을 위해 하지만 나는 당신이 알고 있:

2-n = 1/2n

그래서 그냥 통과하는 긍정적인 지수 그럼 나누어 1 에 해당 번호(선택 아닌 정수 타입 mpf_t -이 mpz_t 형식은 필수할 수 있도록 실제와 같은 숫자 2-18).

나는에 대해 많이 알지 못 GMP 만:

2 ^ -18

에 해당합니다:

1 / (2 ^ 18)

왜 그렇게 쓰지 않는 기능을 처리적인 부분에서는 이 방법이 있을까?

부정적인 특급이 지원되는 경우 역 base-1mod 모드 존재하십시오( mpz_invert 섹션에서 5.9[Number 이론적 함수],35 페이지).는 경우 반대 존재하지 않음 나누기 제가 발생합니다.

만약 당신이 그것에 대해 이야기하고,그 포함수론.부서,또는 더 정확하게 반대의 multplication,만 존재하는 특정 조건에.누구에게도 뒤지지 않는 규칙을 기억하지만,기본적으로 말하는 작업 부문 작동하지 않을 경우 base-1 이 존재하지 않습니다.

당신은 무엇을 할 필요에 따라 당신이 원하는 무슨 일이 일어날는 비트와 잃은 것에서 작업입니다.때문에 당신과 함께 다루고 있는 정수를 올리는 부정적인 힘을 의미한 부문에(물론,보복)하지만 GMP 제공하는 여러 가지 형태의 부문.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top