Conjectura de Collatz
"começando com um inteiro n qualquer, se iterarmos sucessivamente a função
f(n)=n/2 (se n é par) ou f(n)=3n+1 (se n é ímpar),
chegaremos sempre a 1 ao cabo de um número finito de passos"
Procedimento que define a função de Collatz
| > | Collatz := proc(n::integer) |
| > | if type(n,even) then |
| > | n/2; |
| > | else |
| > | 3*n+1; |
| > | fi; |
| > | end: |
Procedimento de contagem das iterações sucessivas da função de Collatz até chegar a 1
| > | IC := proc(raiz::integer) |
| > | local sentinela, contador; |
| > | contador := 0; |
| > | sentinela := raiz; |
| > | while sentinela <> 1 and contador < 1000^1000 do |
| > | sentinela := Collatz(sentinela); |
| > | contador := contador + 1; |
| > | od; |
| > | RETURN(contador); |
| > | end: |
Verificação da conjectura para os primeiros 200 inteiros
| > | seq(IC(i), i=1..200); |
Procedimento que calcula a sequência n, f(n), f(f(n)), ..., 1
| > | sCollatz := proc(n::integer) |
| > | local x; |
| > | x := n; |
| > | while x<>1 do |
| > | print(x); |
| > | x := Collatz(x); |
| > | od; |
| > | end: |
| > | sCollatz(4); |
| > | sCollatz(27); |
| > | with(plots); |
| > | pCollatz := proc(n::integer) |
| > | local w,x,i,p,j; |
| > | x := n; |
| > | i:=0; |
| > | while x<>1 do |
| > | i:=i+1; |
| > | w[i]:=Collatz(x); |
| > | x:=Collatz(x); |
| > | od; |
| > | pointplot({seq([j,w[j]],j=1..IC(n))},symbol=circle,symbolsize=12,color=red,axes=boxed): |
| > | end: |
Warning, the name changecoords has been redefined
| > | pCollatz(27); |
| > | pCollatz(14); |