Я бы использовал temp = mpz_sizeinbase (n, 2), чтобы получить количество бит в вашем исходном числе, а затем использовал бы mpz_tdiv_q_2exp (q, n, temp >> 1) и mpz_tdiv_r_2exp (r, n, temp >> 1) чтобы получить верхнюю и нижнюю половину вашего оригинального номера.
В зависимости от того, как вы хотите обработать нечетную битовую длину, вам может потребоваться настроить вычисление temp >> 1.
НТН,
casevh