質問
恥ずかしいことに、負の指数を 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;
}
解決
mpz_t
データ型は整数のみを格納でき、2 -18 は整数ではありません。それを計算するには、浮動小数点型 mpf_tを使用する必要があります。
または有理数型 mpq_t
。
他のヒント
私はあなたのためにコードをカットしませんが、私はあなたにそれを気付かせます:
2 -n = 1 / 2 n
したがって、正の指数を渡すだけで、その数で1を除算できます( mpf_t
などの非整数型を選択します- mpz_t
型は整数であるため、表現できません) 2 -18
などの実数)。
GMPについてはあまり知りませんが:
2 ^ -18
は次と同等です:
1 / (2 ^ 18)
では、このように負の指数を処理する関数を書いてみませんか?
負のexpは、 逆base-1 mod modが存在します(参照 セクション5.9のmpz_invert [番号 理論関数]、ページ35)。もし 逆が存在しない場合、除算 ゼロが発生します。
あなたがそれについて話しているなら、それは数論に関係しています。分裂、またはより正確には乗算の逆は、特定の条件でのみ存在します。ルールを正確に覚えていませんが、基本的には base-1 mod mod が存在しない場合、除算操作は機能しないと言っています。
何をする必要があるかは、操作で失われるビットをどのように処理するかによって異なります。整数を扱っているため、負のべき乗は除算(まあ、往復)を意味しますが、GMPは部門。