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); |