Quanto tempo dura a recursão da Collatz?


19

Eu tenho o seguinte código Python.

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

Qual é o tempo de execução desse algoritmo?

Experimentar:

Se denota o tempo de execução da função . Então eu acho que tenho { T ( n ) = 1  para  n 1 T ( n ) = T ( n / 2 )  para  n  par T ( n ) = T ( 3 n + 1 )  para  n  ímparT(n)collatz(n)

{T(n)=1 para n1T(n)=T(n/2) para n atéT(n)=T(3n+1) para n ímpar

Eu acho que será lg n se n for par, mas como calcular a recorrência em geral?T(n)lgnn


4
Isso deve ser e assim por diante. O +1 é importante, caso contrário, você temT(n)=1, para todos osnpara os quais a sequência termina. T(n)=T(n2)+1T(n)=1n
user253751

2
54 é par, T (54) = 112! =
Lg

Supõe-se que o usuário insira apenas número inteiro?
Dean MacGregor

@DeanMacGregor Sim. De fato, um número inteiro positivo é assumido.
duskwuff

mais detalhes em bkg seriam úteis. onde você conseguiu o código, como foi apresentado a ele? esse é um problema aberto semifame na teoria dos números, não resolvido por mais de um século, no qual um livro inteiro de Lagarias foi escrito. do CS pov provando que está em qualquer classe de complexidade de tempo ou espaço é equivalente a uma prova. muito mais referências aqui . também é um ótimo tópico para o Computer Science Chat para qualquer pessoa interessada. há também uma collatztag no MathOverflow, etc. As pesquisas mais recentes mostram que o problema tem qualidades fractais intrínsecas que dificultam.
vzn

Respostas:


29



Obrigado. Mas minha recursão é verdadeira, certo? Se sim, ainda não conseguimos encontrar a solução para essa recursão?
9bi7 10/03/16

T(n)

T(n)=2T(n/2)+O(n)

7
"como isso não foi resolvido, não há limite superior" - temos que ter cuidado com o idioma aqui. Não sabemos a solução dessa recorrência, fim da história.
Raphael

7


13

A função de complexidade do tempo é

{T(n)=O(1) para n1T(n)=T(n/2)+O(1) para n atéT(n)=T(3n+1)+O(1) para n ímpar

que pode ser reescrito da seguinte forma, se você estiver interessado em complexidade de tempo assintótica.

{T(n)=1 para n1T(n)=T(n/2)+1 para n atéT(n)=T(3n+1)+1 para n ímpar

M,1nHumaeutnn

A conjectura de Collatz é uma conjectura muito famosa que Collatz propôs em 1937. Muitos matemáticos eminentes passaram (desperdiçados) incontáveis ​​horas tentando resolver essa conjectura, mas com pouco proveito. Até Paul Erdős disse sobre a conjectura de Collatz: "A matemática ainda não está pronta para esses problemas".


1
"desperdiçado" é um julgamento subjetivo. veja a análise de especialistas por Lagarias para saber por que os resultados do trabalho / parciais na conjectura podem ser considerados "desperdiçados". também a citação de Erdos provavelmente tem algumas décadas e a matemática progrediu substancialmente desde então, e continua a ... e provavelmente nem todas as novas técnicas matemáticas foram tentadas contra o problema.
vzn

Isso foi comentário de língua na bochecha. (Para ser justo, eu coloco entre parênteses, não é?). Até que o problema seja resolvido, todos os esforços parecem um desperdício, mas, uma vez resolvido, você vê como até as falhas levaram à solução. E não concordo com você que a matemática tenha progredido substancialmente; a tecnologia progrediu substancialmente, mas a física, a matemática e até a ciência da computação estão progredindo lentamente, e é assim que deve ser (posso dizer isso porque, eu que aprendi minhas cordas há 30 anos, ainda não me sinto desatualizado).
Shreesh

3x+1

Lagarias escreveu / compilou / editou um livro inteiro sobre o assunto e parece "desculpar-se" por estudar o problema? ri muito! muito pelo contrário . no entanto, concordou / admite que ele tem uma posição defensiva porque muitos outros matemáticos não consideram o problema significativo ou merecem um ataque / esforço importante (e note que gauss parecia exatamente o mesmo em Fermats Last Thm!). mas há outros casos maciços de matemáticos de ponta que levam isso a sério, por exemplo, Tao por um.
achou

2

noddn3n+1

T(n)=2T(n/2)+nT(0 0)T(1)

3n+1


0

Você tem T (n) = T (n / 2) + 1 se n for par. Mas então é provável que n / 2 nem seja, então você está preso lá.

O que acontece é que as boas e pequenas regras que você aprendeu são confrontadas com um problema real e não funcionam. Eles atingem uma parede de tijolos, de frente, e dói. Faça um favor a si mesmo e siga a recursão para T (7) manualmente, e então você diz se ainda acredita que isso esteja relacionado lg n.

Se você acha que isso não está relacionado à pergunta original, porque 7 não é par: sempre que n é ímpar, T (n) = T (3n + 1) e 3n + 1 é par; portanto, se T (n) fosse log n se n for par, seria log (3n + 1) + 1 sempre que n> 1 for ímpar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.