Quelle est la meilleure façon de faire de l'arithmétique en base 36 en Perl ?
Pour être plus précis, je dois être capable de faire ce qui suit :
-
Opérer sur des nombres positifs à N chiffres en base 36 (par exemple les chiffres sont 0-9 A-Z)
N est fini, disons 9
-
Fournir les bases de l'arithmétique, au moins les suivantes 3 :
-
Addition (A+B)
-
Soustraction (A-B)
-
Division entière, par exemple étage (A/B).
-
À proprement parler, je n'ai pas vraiment besoin d'une capacité de conversion en base 10 - les nombres seront 100 % du temps en base 36. Je ne vois donc pas d'inconvénient à ce que la solution ne permette PAS la conversion de la base 36 à la base 10 et vice versa.
-
Je ne me soucie guère de savoir si la solution consiste à effectuer une conversion brute en base 10 et inversement, à convertir en binaire ou à adopter une approche plus élégante permettant d'effectuer des opérations en base N de manière "native" (comme indiqué ci-dessus, la conversion en base 10 n'est pas une exigence). Mes trois seules considérations sont les suivantes :
-
Il répond aux spécifications minimales ci-dessus
-
C'est "standard". Actuellement, nous utilisons un vieux module maison basé sur une conversion en base 10 faite à la main, qui est bogué et qui craint.
Je préférerais largement remplacer cela par une solution CPAN couramment utilisée plutôt que de réécrire mon propre vélo à partir de zéro, mais je suis parfaitement capable de le construire si aucune meilleure possibilité standard n'existe.
-
Il doit être rapide (mais pas aussi rapide que l'éclair). Quelque chose qui prend 1 seconde pour additionner 2 nombres à 9 chiffres en base 36 est pire que tout ce que je peux faire moi-même :)
P.S. Juste pour donner un peu de contexte au cas où les gens décideraient de résoudre mon problème XY pour moi en plus de répondre à la question technique ci-dessus :)
Nous avons un arbre assez grand (stocké dans la base de données comme un tas d'arêtes), et nous avons besoin de superposer l'ordre sur un sous-ensemble de cet arbre. Les dimensions de l'arbre sont importantes, tant en profondeur qu'en largeur. L'arbre est très activement mis à jour (insertions, suppressions et déplacements de branches).
Cela se fait actuellement en ayant un deuxième tableau avec 3 colonnes : parent_vertex, child_vertex, local_order
donde local_order
est une chaîne de 9 caractères composée de A-Z0-9 (par exemple, un nombre en base 36).
Considérations supplémentaires :
-
Il est nécessaire que l'ordre local soit unique par enfant (et évidemment unique par parent),
-
Tout réordonnancement complet d'un parent est quelque peu coûteux, et l'implémentation consiste donc à essayer d'assigner - pour un parent avec X enfants - les ordres qui sont distribués de manière assez égale entre 0 et 36**10-1, de sorte que presque aucune insertion d'arbre n'entraîne un réordonnancement complet.