Representando números: bases negativas
Artigo anterior aqui, sobre diferentes formas de representar números.
Continuando a explorar diferentes métodos para representar números, vamos tratar de bases negativas. Nesse artigo, em especial, vamos analisar a base , também chamada de negadecimal.
Como primeiro exemplo, vamos converter o número na base negadecimal (lembrando que o número entre parênteses após o número representa qual a base de representação). A decomposição pode ser feita como abaixo:
Nesse cenário, ao invés das potências de 10 que usamos na base decimal para compor o número, temos potências de 10 com sinais alternados. Nessa linha, para representar o número em base negadecimal precisamos encontrar os dígitos entre 0 e 9 que, multiplicados pelas potências 1, , 100, , etc. somam . Notando que podemos escrever temos:
Isso mostra que em base negadecimal temos números negativos representados sem necessidade de um sinal negativo. Na verdade, temos mais que isso: na base negadecimal podemos representar qualquer número negativo sem a necessidade do sinal negativo.
Isso pode ser derivado diretamente do algoritmo da divisão: para um número inteiro fazemos
Onde:
- é o quociente da divisão;
- é o resto da divisão, .
Como para , o algoritmo termina.
Aplicando o primeiro passo do algoritmo para o número temos:
Aqui temos e . Como o resto é negativo, precisamos aplicar dois ajustes: somamos 1 no quociente e somamos o valor absoluto da base no resto:
Então temos, no exemplo, e , assim:
E podemos continuar o algoritmo:
E aí compomos o número normalmente, concatenando os restos na ordem inversa: . Podemos usar a classe MetaNumber para avaliar a conversão do número. O parâmetro verbose=True na função to_base mostra os passos do algoritmo da divisão — note o ajuste no quociente e base.

O algoritmo dá uma volta maior no último passo, mas o resultado é o mesmo.
Comparação com a base decimal
Podemos usar a classe MetaNumber para gerar uma sequência de números e convertê-los para base negadecimal:
import os
# Diretório com o script MetaNumber.py
diretorio = r'C:\Scripts'
os.chdir(diretorio)
from MetaNumber import MetaNumber
# Listas com os resultados
decimal = []
negadecimal = []
# Varre os números e converte
for i in range(-10, 11):
num = MetaNumber(i, base=10)
decimal.append(i)
negadecimal.append(num.to_base(-10).force_base10())

Sabemos agora que: (1) a representação de um número em base negadecimal não precisa do sinal negativo, e (2) a base negadecimal usa os mesmos dez dígitos da base decimal. Podemos então pensar na base negadecimal como uma aplicação que leva o conjunto dos números inteiros nos números inteiros positivos.
Assim conseguimos plotar gráficos comparando a representação decimal e negadecimal para conseguirmos “ver” a conversão entre bases. Analisando o intervalo de a , podemos notar que:
- O intervalo de a é mapeado no intervalo a , mas não de forma sobrejetora: entre e temos 1800 valores versus 1999 na imagem.
- O mapeamento não é contínuo — mais que isso, não apresenta nenhum ponto de continuidade — nem mesmo considerando números reais.
