Соглашение для функций, использующих GMP, можно найти в руководстве . По сути, вы должны следовать тем же соглашениям, что и сам GMP - функция должна иметь возвращаемый тип void, и вы должны указать значение, в которое нужно поместить результат в качестве параметра.
Вот пример, приведенный ниже:
void foo (mpz_t result, const mpz_t param, unsigned long n)
{
unsigned long i;
mpz_mul_ui (result, param, n);
for (i = 1; i < n; i++)
mpz_add_ui (result, result, i*7);
}
int main (void)
{
mpz_t r, n;
mpz_init (r);
mpz_init_set_str (n, "123456", 0);
foo (r, n, 20L);
gmp_printf ("%Zd\n", r);
return 0;
}