Sprawa jasna. Wiem, co się dzieje, nie wiem dlaczego.
Bezpośrednim winowajcą jest:
mpz_set_ui(mpN,N);
które powinno zamienić 64-bitową liczbę N na GMP, a zamiast tego obcina ją do 32 bitów, czyli w pewnym sensie zachowuje się jak na 32 bitach.
Najprościej zastąpić to wersją uniwersalną, która powinna działać niezależnie od 32/64 bitów:
mpz_set_ui(mpN,N>>32);
mpz_mul_2exp(mpN,mpN,32);
mpz_add_ui(mpN,mpN,N&(INT64_C(4294967295)));
To powinno załatwić sprawę konwersji N do GMP.
Jaką masz wartość GMP_LIMB_BITS ?
Można to druknąć dając gdziekolwiek w programie:
printf("GMP_LIMB_BITS: %d\n",GMP_LIMB_BITS);
Bezpośrednim winowajcą jest:
mpz_set_ui(mpN,N);
które powinno zamienić 64-bitową liczbę N na GMP, a zamiast tego obcina ją do 32 bitów, czyli w pewnym sensie zachowuje się jak na 32 bitach.
Najprościej zastąpić to wersją uniwersalną, która powinna działać niezależnie od 32/64 bitów:
mpz_set_ui(mpN,N>>32);
mpz_mul_2exp(mpN,mpN,32);
mpz_add_ui(mpN,mpN,N&(INT64_C(4294967295)));
To powinno załatwić sprawę konwersji N do GMP.
Jaką masz wartość GMP_LIMB_BITS ?
Można to druknąć dając gdziekolwiek w programie:
printf("GMP_LIMB_BITS: %d\n",GMP_LIMB_BITS);