Prova a ripetere (operando in R o, in modo simile, in altre
applicazioni - o con questo script, cliccando più volte) la terza riga più volte. Che cosa ottieni?
Prova ad eseguire
Prova ad espriemere in generale la proprietà che puoi congetturare. Si tratta di
una proprietà che non si è ancora riusciti a dimostrare, dopo
quasi un secolo di tentativi.
f <- function(n) ifelse(floor(n/2)==n/2, n/2, n*3+1) n <- 1 f(n); n <- f(n)
f associa ad n n/2 se n è pari,
3n+1 altrimenti.
Da qualunque numero naturale si parta, si ottiene in ogni caso una sequenza di numeri che, prima o poi, arriva ad 1, e, quindi,
prosegue sempre nello stesso modo (4, 2, 1, 4,
).
Possiamo studiare i passi necessari per molti casi col seguente algoritmo:
f <- function(n) ifelse(floor(n/2)==n/2, n/2, n*3+1) for(m in 1:100) {k <- 0; n <- m; while(n != 1) {n <- f(n); k <- k+1}; print(c(m,k))} [1] 1 0 [1] 2 1 [1] 3 7 ... [1] 7 16 ... [1] 27 111 ... [1] 31 106 ... [1] 73 115 ... [1] 97 118Possiamo studiare il fenomeno usando "a scatola nera" in modo analogo il file allegato qui (o lo script citato).
Volendo vedere come varia la quantità dei passi necessari possiamo vedere via via per quale numero essa è massima, fermandoci a 100 mila, posso usare:
U=0; for(m in 1:1e3) {k=0; n=m; while(n!=1) {n=f(n); k=k+1}; if(k>U) {U=k; print(c(m,U))}} [1] 2 1 [1] 3 7 [1] 6 8 [1] 7 16 [1] 9 19 [1] 18 20 [1] 25 23 [1] 27 111 [1] 54 112 [1] 73 115 [1] 97 118 [1] 129 121 [1] 171 124 [1] 231 127 [1] 313 130 [1] 327 143 [1] 649 144 [1] 703 170 [1] 871 178 U=0; for(m in 1:1e4) {k=0; n=m; while(n!=1) {n=f(n); k=k+1}; if(k>U) {U=k; print(c(m,U))}} [1] 1161 181 [1] 2223 182 [1] 2463 208 [1] 2919 216 [1] 3711 237 [1] 6171 261 U=0; for(m in 1:1e5) {k=0; n=m; while(n!=1) {n=f(n); k=k+1}; if(k>U) {U=k; print(c(m,U))}} [1] 10971 267 [1] 13255 275 [1] 17647 278 [1] 23529 281 [1] 26623 307 [1] 34239 310 [1] 35655 323 [1] 52527 339 [1] 77031 350