Miquel_Fuster

Conjetura de Collatz (3n+1). Divertimento.

Jan 30th, 2022 (edited)
1,271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.57 KB | None | 0 0
  1. # El siguiente programa muestra una peculiaridad del la
  2. #   Conjetura de Collatz, o conjetura 3x+1. Dada una secuencia
  3. #   de dónde sólo se toman los números impares de la lista superiores a 1,
  4. #   el impar_i puede predecir si el impar_i+1 va sa ser mayor
  5. #   o menor que él mismo.
  6.  
  7. def collatz(n):
  8.     '''
  9.    Devuelve el próximo número impar en la secuencia.
  10.  
  11.    Args:
  12.        n (int): Entero positivo mayor que 0
  13.  
  14.    Raises:
  15.        TypeError: n no es del tipo entero
  16.        ValueError: n es menor a 1
  17.  
  18.    Returns:
  19.        número: Próximo entero impar de la secuencia
  20.    
  21.    '''
  22.  
  23.     if type(n) is not int:
  24.         raise TypeError("El argumento pasado debe ser un entero.")
  25.  
  26.     if n<1:
  27.         raise ValueError("El argumento pasado debe ser mayor a 0.")
  28.  
  29.     if n&1:            # solo en caso de impares
  30.         n = (n+1) + (n<<1)  # 3n+1
  31.     while(not n&1):     # en culquier caso, mientras sea par
  32.         n >>= 1             # n//2
  33.     return n
  34.  
  35. def predecir_siguiente(n):
  36.     '''
  37.    Predice si el próximo entero impar en la secuencia de collatz será mayor o menor.
  38.    Este resultado se obtiene dividiendo el número actual n entre 2 mediante una división entera. Si el
  39.        cuociente obtenido es impar el siguiente número impar de la secuencia de collatz será mayor, en cambio
  40.        si el cuociente obtenido es par el siguiente número impar de la secuencia de collatz será menor.
  41.    Args:
  42.        n (int): Entero positivo mayor que 1
  43.  
  44.    Raises:
  45.        TypeError: n no es del tipo entero
  46.        ValueError: n no es un valor impar mayor que 1
  47.  
  48.    Returns:
  49.        boolean: True si el próximo impar será mayor, False si será menor
  50.    
  51.    '''
  52.  
  53.     if (not type(n) is int):
  54.         raise TypeError("El argumento pasado debe ser un entero.")
  55.  
  56.     if n<2 or not n&1:
  57.         raise ValueError("El argumento pasado debe ser un impar positivo mayor que 1.")
  58.  
  59.     # n&2 engloba las operaciones dividir por dos y comprobar si el número es impar:
  60.     #    n = n>>1  o  n = n/2
  61.     #    return n&1   o lo que es lo mismo: devuelve true si n&1 es 1 (n es impar) o false si n&1 es 0 (n es impar)
  62.     return bool(n&2)      # True si n//2 es impar, False si es par
  63.  
  64.  
  65. # Programa de demostración de uso
  66. if __name__ == '__main__':
  67.    
  68.     for x in range(1, 101):
  69.         print(f'collatz de {x}:')
  70.         k = collatz(x)
  71.         while(k != 1):
  72.             print('{:>16}'.format(k), end=' ')
  73.             print('sig. mayor' if predecir_siguiente(k) else 'sig. menor')
  74.             k = collatz(k)
  75.         print("{:>16} =\n".format(1))
Add Comment
Please, Sign In to add comment