Конвертировать uint64 в номер GMP / MPIR - PullRequest
3 голосов
/ 06 июля 2011

Я использую MPIR 2.4.0 в Windows (MSVC 2010) и пытаюсь добавить 64-разрядное целое число без знака к числу mpz_t. Однако кажется, что MPIR / GMP не поддерживает прямое преобразование между 64-битными целыми числами и mpz_t. Означает ли это, что я должен преобразовать свой uint64 в строку и прочитать это через mpz_init_set_str? Это не очень привлекательно и не выглядит очень быстро - два преобразования даром.

Я что-то упустил или какой трюк / хак использовать здесь?

Приветствия

Philipp

Ответы [ 4 ]

6 голосов
/ 07 июля 2011

Как предложено Бантаром, используйте mpz_import, но я бы предложил следующее, которое не зависит от порядкового номера платформы:

mpz_import(b, 1, 1, sizeof(a), 0, 0, &a);
3 голосов
/ 07 июля 2011

Использование mpz_import :

void mpz_set_ull( mpz_t rop, unsigned long long op )
{
   mpz_import(rop, 1, 1, sizeof(op), 0, 0, &op);
}

РЕДАКТИРОВАТЬ: Код обновлен в соответствии с Комментарий Фрэнка .

1 голос
/ 07 июля 2011

Да, если вы находитесь на платформе (Windows), которая не использует модель LP64, тогда нет функции для назначения 64-разрядного целого числа для mpz_t. Вместо того, чтобы проходить строку, вы можете отдельно назначить верхнюю и нижнюю половину 64-разрядного целого числа, а затем сложить их вместе. Все еще не очень чисто, но почти наверняка быстрее.

Редактировать: см. Ответ Бантара для лучшего решения проблемы.

0 голосов
/ 08 июля 2011

В MPIR 2.4 добавлена ​​поддержка intmax_t и uintmax_t. Пожалуйста, смотрите mpz_set_ux () / sx () и mpz_get_ux () / sx (). Эти функции не существуют в GMP, но описаны в руководстве к MPIR 2.4.0.

...