Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Collatz, pour s'amuser.

Views: 135

Une implémentation de ce que j'ai trouvé sur le site du LaCim

Une rechercher sur Goole pour "collatz conjecture sage" mène directement à un document fort intéressant...

La définition de la fonction

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

Quelques calculs, pas d'itération pour le moment.

[collatz(i) for i in range(1,100)]
[4, 1, 10, 2, 16, 3, 22, 4, 28, 5, 34, 6, 40, 7, 46, 8, 52, 9, 58, 10, 64, 11, 70, 12, 76, 13, 82, 14, 88, 15, 94, 16, 100, 17, 106, 18, 112, 19, 118, 20, 124, 21, 130, 22, 136, 23, 142, 24, 148, 25, 154, 26, 160, 27, 166, 28, 172, 29, 178, 30, 184, 31, 190, 32, 196, 33, 202, 34, 208, 35, 214, 36, 220, 37, 226, 38, 232, 39, 238, 40, 244, 41, 250, 42, 256, 43, 262, 44, 268, 45, 274, 46, 280, 47, 286, 48, 292, 49, 298]

On peut itérer maintenant. Aussitôt qu'on tombe sur 1, c'est fini.

def collatz_sequence(n): L = [n] x = n while x != 1: x = collatz(x) L.append(x) return(L)

Deux petits exemples

collatz_sequence(11)
[11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
max(collatz_sequence(27))
9232

On peut faire un graphique avec

line([(i, x) for (i,x) in enumerate(collatz_sequence(27))])

Et mieux, un truc interactif

@interact def f(n=27): line([(i, x) for (i,x) in enumerate(collatz_sequence(n))]).show()
Interact: please open in CoCalc

Et on peut s'intéresser au nombre de tours que ça prend avant d'arriver à 1.

def stopping_time(n): st = 0 x = n while x != 1: st += 1 x=collatz(x) return st
stopping_time(27)
111
bar_chart([stopping_time(i) for i in range(1,1001)])