En teoría de números, un invariante perfecto dígito a dígito (PDDI por las siglas del término inglés "perfect digit-to-digit invariant"; también conocido como número de Munchausen[1]) es un número natural en una base dada que es igual a la suma de sus dígitos, cada uno elevado a una potencia igual a sí mismo.
Un ejemplo en base 10 es 3435, porque: .
El término "número de Munchausen" fue acuñado por el matemático e ingeniero de software holandés Daan van Berkel en 2009,[2] ya que evoca la historia del Barón de Münchhausen que se levantaba del suelo tirando de su propia coleta, lo que sirve de referencia a que cada dígito se debe elevar a una potencia igual a sí mismo.[3][4]
Sea un número natural que se puede escribir en base como el número de k dígitos donde cada dígito está entre y inclusive, y . Se define la función como .
Como 00 no siempre está definido, se usan dos convenciones, una en la que se considera que es igual a uno y otra en la que se considera que es igual a cero.[5][6]
Un número natural se define como un invariante perfecto dígito a dígito en base b si . Por ejemplo, el número 3435 es un invariante perfecto de dígito a dígito en base 10 porque
para todo , y por lo tanto 1 es un invariante perfecto dígito a dígito "trivial" en todas las bases, y todos los demás invariantes dígito a dígito perfectos son "no triviales". Para la segunda convención donde , tanto como son invariantes perfectos de dígito a dígito triviales.
Un número natural es un invariante dígito a dígito sociable si es un punto periódico para , donde para un entero positivo , y forma un ciclo de período . Un invariante perfecto dígito a dígito es un invariante sociable dígito a dígito con . Un invariante dígito a dígito amistoso es un invariante dígito a dígito sociable con .
Todos los números naturales son puntos preperiódicos para , independientemente de la base. Esto se debe a que todos los números naturales de base con dígitos satisfacen que . Sin embargo, cuando , , por lo que cualquier satisfará a hasta .
Hay un número finito de números naturales menor que , por lo que se garantiza que el número alcanzará un punto periódico o un punto fijo menor que , convirtiéndolo en un punto preperiódico. Esto también significa que hay un número finito de invariantes dígito a dígito perfectos y ciclos para cualquier base dada .
El número de iteraciones necesarias para que alcance un punto fijo es la función de persistencia -factorión de , e indefinido si nunca llega a un punto fijo.
Todos los números están representados en la base .
Base | Invariantes dígito a dígito perfectos no triviales () | Ciclos |
---|---|---|
2 | 10 | |
3 | 12, 22 | 2 → 11 → 2 |
4 | 131, 313 | 2 → 10 → 2 |
5 |
2 → 4 → 2011 → 12 → 10 → 2 104 → 2013 → 113 → 104 | |
6 | 22352, 23452 |
4 → 1104 → 1111 → 4 23445 → 24552 → 50054 → 50044 → 24503 → 23445 |
7 | 13454 | 12066 → 536031 → 265204 → 265623 → 551155 → 51310 → 12125 → 12066 |
8 | 405 → 6466 → 421700 → 3110776 → 6354114 → 142222 → 421 → 405 | |
9 | 31, 156262, 1656547 | |
10 | 3435 | |
11 | ||
12 | 3A67A54832 |
Base | Invariantes dígito a dígito perfectos no triviales (, )[1] | Ciclos |
---|---|---|
2 | ||
3 | 12, 22 | 2 → 11 → 2 |
4 | 130, 131, 313 | |
5 | 103, 2024 |
2 → 4 → 2011 → 11 → 2 9 → 2012 → 9 |
6 | 22352, 23452 |
5 → 22245 → 23413 → 1243 → 1200 → 5 53 → 22332 → 150 → 22250 → 22305 → 22344 → 2311 → 53 |
7 | 13454 | |
8 | 400, 401 | |
9 | 30, 31, 156262, 1647063, 1656547, 34664084 | |
10 | 3435, 438579088 | |
11 | ||
12 | 3A67A54832 |
El siguiente programa en Python determina si un número entero es un Número de Munchausen (o invariante perfecto dígito a dígito) o no, siguiendo la convención .
num = int(input("Enter number:"))
temp = num
s = 0.0
while num > 0:
digit = num % 10
num //= 10
s+= pow(digit,digit)
if s == temp:
print("Munchausen Number")
else:
print("Not Munchausen Number")
Los ejemplos siguientes desarrollan la función invariante de dígito a dígito perfecta descrita en la definición anterior en Python para las dos convenciones.
def pddif(x: int, b: int) -> int:
total = 0
while x > 0:
total = total + pow(x % b, x % b)
x = x // b
return total
def pddif_cycle(x: int, b: int) -> List[int]:
seen = []
while x not in seen:
seen.append(x)
x = pddif(x, b)
cycle = []
while x not in cycle:
cycle.append(x)
x = pddif(x, b)
return cycle
def pddif(x: int, b: int) -> int:
total = 0
while x > 0:
if x % b > 0:
total = total + pow(x % b, x % b)
x = x // b
return total
def pddif_cycle(x: int, b: int) -> List[int]:
seen = []
while x not in seen:
seen.append(x)
x = pddif(x, b)
cycle = []
while x not in cycle:
cycle.append(x)
x = pddif(x, b)
return cycle
El siguiente programa en Java determina si un número entero es un Número de Munchausen o no, siguiendo la convención .
import java.util.Scanner;
public class Munchausen
{
public static void main ()
{
Scanner in = new Scanner (System.in);
System.out.println("Enter number:");
int num = in.nextInt(), temp = num, digit; double sum = 0;
while (num>0)
{ digit = num % 10;
num /= 10;
sum += Math.pow(digit, digit);
}
if (sum == temp)
System.out.print("Munchausen Number");
else
System.out.print("Not Munchausen Number");
}
}