GMP mpz_t тип возврата для функции - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь использовать рекурсивную функцию, которая в конечном итоге возвращает тип данных mpz_t. Я пытался реализовать это, используя mpz_get_ui(), но это не дает правильного результата с очень большими числами (15 цифр +). Целью программы является криптография.

Я также попытался сделать функцию типа void и добавить параметр mpz_t, который действует как заполнитель ответа, например: void fme(mpz_t y, mpz_t g, mpz_t x, mpz_t p), но это исключает возможность рекурсивного вызова функция, поскольку она больше ничего не возвращает.

Мне было интересно, можно ли что-нибудь сделать с типом данных указателя mpz_t mpz_t*?

Это то, что я до сих пор:

unsigned long int fme(mpz_t g, mpz_t x, mpz_t p) {

  mpz_t result, temp;
  mpz_init(result);
  mpz_init(temp);

  if (mpz_cmp_d(x, 0) == 0) {

    mpz_clear(result);
    mpz_clear(temp);
    return 1;
  } else if (mpz_even_p(x) != 0) {

    mpz_fdiv_q_ui(temp, x, 2);
    mpz_set_ui(result, fme(g, temp, p));
    mpz_mul(result, result, result);
    mpz_mod(result, result, p);

    unsigned long int answer = mpz_get_ui(result);
    mpz_clear(result);
    mpz_clear(temp);
    return answer;
  }

1 Ответ

0 голосов
/ 26 апреля 2020

Я думаю, просто:

// note: places result in the first argument, that has to initialized
void fme(mpz_t result, mpz_t g, mpz_t x, mpz_t p) {
    if (mpz_cmp_d(x, 0) == 0) {
         mpz_set_ui(result, 1);
         return;
    } else if (mpz_even_p(x) != 0) {
         mpz_t temp;
         mpz_init(temp);
         mpz_fdiv_q_ui(temp, x, 2);
         fme(result, g, temp, p);
         mpz_clear(temp);

         mpz_mul(result, result, result);
         mpz_mod(result, result, p);
    }
}

// should work the same as original
unsigned long int fme_old(mpz_t g, mpz_t x, mpz_t p) {
    mpz_t result;
    mpz_init(result);
    fme(result, g, x, p);
    unsigned long int ret = mpz_get_ui(result);
    mpz_clear(result);
    return ret;
}
...