4

恥ずかしいことに、負の指数を に与えるとmpz_pow_uiうまくいかないことがわかりました。(「マニュアルには unsigned long と書かれていますね。」) 他のmpz_pow機能については、マニュアルは私が理解できない概念を使用しています。たとえば、次の「base ^ exp mod mod」:

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;
}
4

5 に答える 5

9

コードをカットすることはしませんが、次の点に注意してください。

2-n = 1/2n

したがって、正の指数を渡してから 1 をその数値で除算することができます (そして、整数以外の型を選択します。型は整数であるためmpf_t、 のmpz_tような実数を表すことはできません)。2-18

于 2009-01-07T03:22:12.683 に答える
7

データ型はmpz_t整数のみを格納でき、2 -18は整数ではありません。それを計算するには、浮動小数点型mpf_tまたは有理数型を使用する必要がありますmpq_t

于 2009-01-07T03:28:55.667 に答える
2

GMPについてはよくわかりませんが、

2 ^ -18

次と同等です。

1 / (2 ^ 18)

では、このように負の指数を処理する関数を作成してみませんか?

于 2009-01-07T03:23:37.657 に答える
1

逆基数 1 の mod mod が存在する場合、負の exp がサポートされます (セクション 5.9 [Number Theoretic Functions], page 35 の mpz_invert を参照)。逆数が存在しない場合、ゼロ除算が発生します。

あなたがそれについて話しているなら、それは数論に関係しています。除算、またはより正確には乗算の逆数は、特定の条件でのみ存在します。ルールはよく覚えていませんが、基本的には基数 1 のmod modが存在しないと除算演算が機能しないということです。

于 2009-01-08T01:45:56.903 に答える
0

何をする必要があるかは、操作で失われるビットで何をしたいかによって異なります。整数を扱っているため、負の累乗は除算を意味します (まあ、逆数です) が、GMP は除算のいくつかの形式を提供します。

于 2009-01-07T03:24:01.340 に答える