2011-10-08 3 views
2

GMP permet d'imprimer un mpz_t jusqu'à la base 62, mais je veux représenter un nombre dans n'importe quelle base N, et pour cela je dois d'abord générer un tableau d'entiers (laissez-nous disons que je me limiterai à la base 2^64), donc un tableau de unsigned long pourrait le faire. Par exemple, si je veux prendre un nombre entier et le convertir en base 792, je ne peux pas le mettre directement dans une chaîne, je dois d'abord faire un tableau d'entiers.Conversion d'un entier GMP en entier de base N

Existe-t-il un code pour cela dans GMP, comme certaines maths dont j'ai besoin d'apprendre ou devrais-je commencer à le coder?

P.S. Je sais qu'il est totalement inutile d'utiliser le terme 'base' alors que je pourrais utiliser 'espace vectoriel linéaire', donc cela rend la conversion inutile, mais il y a beaucoup de symboles en unicode (95 221 en unicode 3.2) un moyen de représenter ceux avec des symboles uniques.

Répondre

2

En interne, les fonctions de GMP appeler directement ou indirectement la couche mpn - qui sont documentées ici:

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

Le mpn_get_str ne supporte que les bases jusqu'à 256. Je ne pense pas que vous pouvez aller plus haut, à moins vous écrivez votre propre base de conversion (ce qui n'est pas trivial du tout).

+0

Que voulez-vous dire par pas trivial? Je ne sais pas si je peux convertir directement d'une base à une autre sans utiliser d'abord les nombres "natifs". – jokoon

+0

Je voulais dire que ce n'est pas facile d'écrire une conversion de base - encore moins efficace. Il n'y a pas non plus d'algorithme connu pour passer efficacement d'une base à l'autre sans d'abord passer par la base native (binaire). Si vous avez réellement besoin de bases supérieures à 256, il est possible de modifier le code source de 'mpn_get_str' pour ce faire. D'après ce que je comprends, il est limité à la base 256, car il sort en un tableau 'unsigned char'. En interne, l'algorithme autorise probablement des bases jusqu'à la taille de 'mp_limb_t'. – Mysticial