Número de Munchausen

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) 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, 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.

Definición
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.

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.

Invariantes y ciclos perfectos dígito a dígito de Fb para b específica
Todos los números están representados en la base .

Convención 00 = 1

Convención 00 = 0

Ejemplos de programación

Python
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.

Convención 00 = 1
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

Convención 00 = 0
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

Java
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");
    }
}

Véase también

Referencias

Enlaces externos
 
 Los números de Munchausen (gaussianos.com)

Munchhausen
Matemática recreativa