Congettura di Collatz

Vedi la discussione

Quanti passi sono necessari per arrivare a 1?

1

n = int(input("n = "))
 
lunghezza = 1
while(n != 1):
    lunghezza += 1   # conta un nuovo passo

    if(n%2 == 0):    # se n è pari si divide per 2
        n = n // 2
    else:            # se n è dispari...
        n = 3*n + 1

print(lunghezza)

2

Facoltativo: visualizza la sequenza da n a 1, compresi

n = int(input("n = "))

print(n, end=' ')       # Visualizza il numero di partenza
lunghezza = 1
while(n != 1):
    lunghezza += 1

    if(n%2 == 0):
        n = n // 2
    else:
        n = 3*n + 1

    print(n, end=' ')  # visualizza il risultato dell'algoritmo

print()
print(lunghezza)

Versione OII

f = open("input.txt", "r")
n = int(f.read())
f.close()

lunghezza = 1;
while(n != 1):
    lunghezza += 1

    if(n%2 == 0):
        n = n // 2
    else:
        n = 3*n + 1
 
f = open("output.txt", "w")
f.write(str(lunghezza))
f.close()

Problema: da 10 a 20

NUM è il numero da 10 a 20 con lunghezza minima LUN

def lunghezza(n):
    conto = 1
    while(n != 1):
        conto += 1
        if(n%2 == 0):
            n = n // 2
        else: 
            n = 3*n + 1
    return conto

PRIMO  = 10
ULTIMO = 20
NUM    = 0
LUN    = 1000  # esagerato...
 
for num in range(PRIMO, ULTIMO+1):
    lun = lunghezza(num)
    if(lun < LUN):
        NUM = num
        LUN = lun
    print(num,lun)  # facoltativo
 
print(NUM, ':', LUN)

matplotlib

La sequenza per n=167

import matplotlib.pyplot as plt
  
n = 167
N = []
N.append(n)
while(n != 1):
    if(n%2 == 0):
        n = n // 2
    else: 
        n = 3*n + 1
    N.append(n)
 
plt.grid(which="major")
plt.plot(N)
plt.title("Congettura di Collatz, n=" + str(n))
plt.show()

Lunghezze per n da 10 a 20

Problema: da 48 a 52

import matplotlib.pyplot as plt
import math
  
def lunghezza(n): 
    conto = 1
    while(n != 1): 
        if(n%2 == 0): 
            n = n // 2
        else: 
            n = 3*n + 1
        conto += 1
    return conto 
 
PRIMO  = 10  # 48
ULTIMO = 20  # 52
 
x = range(PRIMO,ULTIMO+1)
y = []
 
NUM = 0
LUN = math.inf
for num in x:
    lun = lunghezza(num)
    print(num, lun)
    y.append(lun)
    if(lun < LUN):
        NUM = num
        LUN = lun        
 
print("-->", NUM, LUN)
     
plt.bar(x, y)
plt.title("Congettura di Collatz, n=10..20")
plt.show()

Problema: da 1 a 100 (1000)

import matplotlib.pyplot as plt
  
def lunghezza(n):
    conto = 1
    while(n != 1):
        if(n%2 == 0):
            n = n // 2
        else: 
            n = 3*n + 1
        conto += 1
    return conto
 
PRIMO  = 1
ULTIMO = 100                # 1000 
x = range(PRIMO, ULTIMO+1)
y = []
for n in x:
    lun = lunghezza(n)
    print(n, lun)           # facoltativo
    y.append(lun)
     
plt.bar(x, y)
plt.title("Congettura di Collatz, n=" + str(PRIMO) + ".." + str(ULTIMO))
plt.show()

Ripeti tutti gli esercizi ma analizza l’altezza massima delle sequenze