Преобразование целого числа GMP в целое число с основанием N

GMP позволяет печатать mpz_t до основания 62, но я хочу представить число в любом основании N, и для этого мне сначала нужно сгенерировать массив целых чисел (скажем, я ограничусь основанием 2 ^ 64), поэтому массив unsigned long может это сделать.

Например, если я хочу взять любое целое число и преобразовать его в основание 792, я не могу напрямую поместить его в строку, я должен сначала создать массив целых чисел.

Существует ли код для этого в GMP, например, какая-то математика, о которой мне нужно узнать, или я должен начать ее кодировать?

P.S. Я знаю, что совершенно неуместно использовать термин «база», в то время как я мог бы использовать «линейное векторное пространство», поэтому это делает преобразование бессмысленным, но в юникоде много символов (95 221 в юникоде 3.2), так что я все еще мог найти способ представить те с одиночными символами.


person jokoon    schedule 08.10.2011    source источник


Ответы (1)


Внутри функции GMP прямо или косвенно вызывают слой mpn, которые задокументированы здесь:

http://gmplib.org/manual/Low_002dlevel-Functions.html#Low_002dlevel-Functions

mpn_get_str поддерживает только базы до 256. Поэтому я не думаю, что вы можете пойти выше, если вы не напишете собственное преобразование базы (что совсем не тривиально).

person Mysticial    schedule 08.10.2011
comment
Что вы подразумеваете под нетривиальным ? Я не знаю, смогу ли я напрямую преобразовать одну базу в другую, не используя сначала собственные числа. - person jokoon; 09.10.2011
comment
Я имел в виду, что написать базовое преобразование непросто, не говоря уже об эффективном. Также не существует известного алгоритма для эффективного перехода от одной базы к другой без предварительного прохождения нативной (бинарной) базы. Если вам действительно нужны базы выше 256, можно изменить исходный код mpn_get_str для этого. Насколько я понимаю, он ограничен базой 256, так как выводится в массив unsigned char. Внутри алгоритм, вероятно, позволяет использовать базы размером до mp_limb_t. - person Mysticial; 09.10.2011