Я пытаюсь использовать рекурсивную функцию, которая в конечном итоге возвращает тип данных 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;
}