0

次のコードを検討してください。

mpz_t x, n, out;

mpz_init_set_ui(x, 2UL);
mpz_init_set_ui(n, 7UL);
mpz_init(out);

mpz_invert(out, x, n);
gmp_printf ("%Zd\n", out);//prints 4. 2 * 4 (mod 7) = 1. OK

mpz_powm_ui(out, x, -1, n);//prints 1. 2 * 1 (mod 7) = 2. How come?
gmp_printf ("%Zd\n", out);

mpz_clear(x);
mpz_clear(n);
mpz_clear(out);

ドキュメントによると、負の指数をサポートするはずですが、mpz_powm 関数が負の指数をどのように処理するのか理解できません。n を法として数値を -1 に上げるのは、n を法としてそれを反転することと同じだと思います。ここで何が欠けていますか?

4

2 に答える 2

1

-1 を符号付きの数値にしようとします。つまり、unsigned インターフェイスを使用しないで、値が -1 の実際の bignum を作成します。

ウィット:

#include <gmpxx.h>
#include <iostream>

int main()
{
    mpz_class n(7), k(2), res;
    mpz_powm(res.get_mpz_t(), k.get_mpz_t(), mpz_class(-1).get_mpz_t(), n.get_mpz_t());
    std::cout << res << std::endl;
}

版画:

4
于 2012-06-24T21:13:06.660 に答える
0

この問題は、mpz_powm_ui 関数の宣言方法が原因で発生します。

void mpz_powm_ui (mpz t rop, mpz t base, unsigned long int exp, mpz t mod)

exp は常に正であるため、おそらくこれはドキュメントのバグです。

于 2012-06-24T21:25:04.607 に答える