7
votes

Calculer la longueur nécessaire pour représenter un entier dans une base arbitraire

J'ai la longueur d'une représentation d'un entier dans une base arbitraire. Dites que la longueur est de 15 ans et la base est de 36 ans. J'aimerais alors déterminer combien de temps une représentation dudit entier serait dans une autre base arbitraire. c'est-à-dire que la conversion à la base 2 pourrait entraîner une longueur de 68.

Je sais que c'est le long des lignes du ci-dessous, mais je ne peux pas vraiment me mettre la tête autour de ce dont j'ai besoin de plancher et de plafond, et je reçois Quelques résultats qui sont du trajet: xxx


5 commentaires

Fondamentalement, la longueur des chiffres est le journal (Basen) + 1, tronqué à un entier.


@Hotlicks Toute façon de le faire sans calculer le journal du nombre réel? Le nombre est généralement trop important pour le faire de manière triviale (pense des centaines de chiffres dans la base 10). Ce que j'essaie de faire est de calculer la taille du tampon dans lequel mettre le numéro lorsque je le convertit ensuite.


@ALEC: Vous pouvez facilement ballpark le journal (base 10) du numéro en ajoutant le journal des premiers chiffres au nombre de chiffres, moins un. Par exemple, le journal (42598) est ~ 4.629. Ou, vous pouvez calculer le journal (4.26) = 0,629, ajoutez 5 pour le nombre de chiffres et soustrayez-en un, vous donne 4,629.


Vous pouvez faire une table, bien sûr. Ou vous pouvez diviser le numéro.


@Bobmurphy - Notez que le calcul du journal du sous-ensemble de chiffres est inadéquat en général pour obtenir la valeur exacte. Ainsi, 2 ^ 100-1 nécessitent 100 chiffres de base 2. Mais 2 ^ 100 nécessite 101 chiffres de 2 chiffres. Représentant 2 ^ 100 dans la base 10, et nous avons 1267650600228229401496703205376, un nombre suffisamment grand pour qu'un journal de double précision ne parvienne pas à voir la différence. La différence entre les deux valeurs de log10 sera de l'ordre de 3.4e-31, il sera donc invisible à l'aide d'une fonction de journalisation standard.


3 Réponses :


8
votes

Après une syntaxe de type mathématica, laissez xxx

représente le logarithme à la base B de n. Laissez journal [n] représente le logarithme naturel de n .

alors le rapport xxx

est constant et égal à xxx

Ce rapport est un multiplicateur pour calculer le nombre de chiffres dans la base b1 du nombre de chiffres de la base b2 (ou vice-versa si vous voyez des choses de cette façon). Pour l'exemple de la question, un numéro de base à 15 chiffres-36 nécessitera xxx

base-2 chiffres. Ceci est bien sûr précisément ce que vous avez dans votre question. Vous n'avez besoin que de ronder la réponse finale jusqu'au entier suivant.

Je ne suis pas sûr, bien sûr, pourquoi vous semblez avoir des résultats qui sont de côté.


1 commentaires

Ceci est une solution proche, mais pas parfaite. Dans le but de cacler une taille suffisante, cela peut être correct (mais pas si vous avez besoin d'une taille exacte).



4
votes

Malheureusement, il n'y a pas de solution exacte sans calcul de haute précision. Par exemple, (je vais utiliser Matlab pour mon travail, y compris des outils pour un travail de haute précision que j'ai écrit moi-même) Qu'est-ce que 2 ^ 200? Dans la base 10, nous obtenons:

log10(hpf(2,100)^200) - log10(hpf(2,100)^200 - 1)
ans =
2.702621195974725251000559400026211938865e-61


0 commentaires

4
votes

Vous pouvez obtenir une réponse exacte sans utiliser de logarithmes. Marcher les radixes de la base arbitraire jusqu'à ce que le nombre s'adapte à l'intérieur.

EXEMPLE PYTHON: P>

def count_digits(number, base):
    radix = 1
    while number >= base ** radix:
        radix += 1
    return radix


0 commentaires