Quanto dura la ricorsione di Collatz?


19

Ho il seguente codice Python.

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

Qual è il tempo di esecuzione di questo algoritmo?

Provare:

Se T(n) indica il tempo di esecuzione della funzione collatz(n). Quindi penso di avere

{T(n)=1 for n1T(n)=T(n/2) for n evenT(n)=T(3n+1) for n odd

Penso che sarà lg n seT(n)lgn è pari ma come calcolare la ricorrenza in generale?n


4
Dovrebbe essere e così via. Il +1 è importante, altrimenti haiT(n)=1, per tuttinper i quali termina la sequenza. T(n)=T(n2)+1T(n)=1n
user253751

2
54 è pari, T (54) = 112! = Lg (54)
Taemyr

Si presume che l'utente inserirà solo numeri interi?
Decano MacGregor,

@DeanMacGregor Sì. In effetti, si assume un numero intero positivo .
duskwuff,

maggiori dettagli bkg sarebbero utili. dove hai preso il codice, come ti è stato presentato? questo è un problema aperto semifama nella teoria dei numeri irrisolto per circa ¾ secolo su cui è stato scritto un intero libro di Lagarias. da CS pov dimostrando che è in qualsiasi classe di complessità spazio o tempo equivale a una prova. molti altri riferimenti qui . anche un ottimo argomento per la chat di informatica per chiunque sia interessato. c'è anche un collatztag su MathOverflow, ecc. le ultime ricerche mostrano che il problema ha intrinseche qualità frattali che lo rendono difficile.
vzn,

Risposte:


29

Questa è congettura di Collatz - problema ancora aperto.
La congettura riguarda la prova che questa sequenza si interrompe per qualsiasi input, poiché non è stata risolta, non sappiamo come risolvere questa relazione di ricorrenza del runtime, inoltre potrebbe non arrestarsi affatto - quindi fino a prova, il tempo di esecuzione è sconosciuto e potrebbe essere .


Grazie. Ma la mia ricorsione è vera, vero? Se è così, allora non riusciamo ancora a trovare la soluzione per quella ricorsione?
9bi7

Cosa intendi con "ricorsione è vera"? Non è possibile trovare il tempo di esecuzione, ma per molti numeri questo farà un certo numero di salti e arriva a 1. non indica il runtime ma la funzione stessa. T(n)
Evil

Per esatto intendevo, ad esempio, come in merge sort possiamo ottenere . Dato che il codice è ricorsivo, possiamo scrivere la ricorrenza per questo, giusto? T(n)=2T(n/2)+O(n)
9bi7

7
"poiché questo è irrisolto, non esiste un limite superiore" - dobbiamo stare attenti con la lingua qui. Non conosciamo la soluzione di questa ricorrenza, fine della storia.
Raffaello

7
Sì. Ma "non sappiamo" non è lo stesso di "non c'è limite superiore". Fondamentalmente, sto dividendo i peli sul matematico "c'è" ( ) e le persone normali "c'è" ("Ne ho uno"). Penso che questa sia una distinzione importante da fare in TCS , però.
Raffaello

15

Hai tradotto correttamente il codice . Esistono molti metodi per risolvere le ricorrenze .

Tuttavia, al momento non è noto se si collatzferma per tutti n; l'affermazione che lo fa è nota come congettura di Collatz . Pertanto, nessun metodo noto funzionerà su questa ricorrenza.

Penso che sarà lg n se n è pariT(n)lgnn

Come mai? Immagino che stai pensando a , per cui la tua affermazione è corretta. Questo dimostra che questa ricorrenza non è una di quelle che possiamo risolvere fino a Θ indagando in modo esponenziale su alcuni punti (vedi anche qui ).n=2kΘ


13

La funzione di complessità temporale è

{T(n)=O(1) for n1T(n)=T(n/2)+O(1) for n evenT(n)=T(3n+1)+O(1) for n odd

che può essere riscritto come segue se si è interessati alla complessità temporale asintotica.

{T(n)=1 for n1T(n)=T(n/2)+1 for n evenT(n)=T(3n+1)+1 for n odd

M,1nHaltnn

La congettura di Collatz è una congettura molto famosa proposta da Collatz nel 1937. Molti eminenti matematici hanno speso (letto sprecato) innumerevoli ore nel tentativo di risolvere questa congettura, ma con scarso profitto. Perfino Paul Erdős ha detto della congettura di Collatz: "La matematica non è ancora pronta per tali problemi".


1
"sprecato" è un giudizio soggettivo. vedere l'analisi degli esperti di Lagarias per i motivi per cui i risultati di lavoro / parziali sulla congettura possono essere considerati non "sprecati". anche la citazione di Erdos ha probabilmente qualche decennio e la matematica è progredita sostanzialmente da allora, e continua a ... e probabilmente non tutte le nuove tecniche matematiche sono state tentate contro il problema.
vzn,

Quello era un commento ironico. (Per essere onesti lo metto tra parentesi, non è vero). Finché il problema non viene risolto, tutti gli sforzi sembrano essere dispendiosi, ma una volta risolto, vedi come anche i guasti hanno portato alla soluzione. E non sono d'accordo con te sul fatto che la matematica abbia compiuto progressi sostanziali; la tecnologia ha registrato progressi sostanziali, ma la fisica, la matematica e persino l'informatica stanno progredendo lentamente, ed è così che dovrebbe essere (posso dire questo perché, io che ho imparato le mie corde 30 anni fa, non mi sento ancora obsoleto).
Shreesh,

@vzn, sono andato a rileggere l'introduzione di Lagarias in "The Ultimate Challenge: The 3X+1Problema ". Nella sezione 10, mi ha colpito il fatto che Lagarias sembra essere più come cercare di giustificare la sua posizione, piuttosto che avere la vera convinzione che si sia trattato di uno sforzo ben speso. Mi sembra una posizione di scusa. Ancora una volta direi che questo era il mio sentimento soggettivo, perché ovviamente non si possono fare affermazioni del genere senza conoscere la persona.
Shreesh

Lagarias ha scritto / compilato / curato un intero libro sull'argomento e sembra "scusarsi" riguardo allo studio del problema? lol! al contrario . tuttavia concorda / ammette di avere una posizione difensiva perché molti altri matematici non considerano il problema significativo o meritano un attacco / sforzo notevole (e notate che Gauss si sentì esattamente lo stesso per Fermats Last Thm!). ma ci sono altri enormi casi di massimi matematici che lo prendono totalmente sul serio, ad esempio Tao per uno.
vzn,

2

Aggiungerei alle altre risposte il fatto che il terzo ramo della funzione è il caso di n è odd suggerisce che in tal caso la funzione verrà calcolata su un'istanza più grande (n è inferiore a 3n+1). Quindi c'è più lavoro da fare su quel ramo di calcolo.

Altre relazioni di ricorrenza che incontriamo (ad esempio nel caso di tipo di unione T(n)=2T(n/2)+n) aderire alla divisione di un problema in sottoproblemi per istanze con dimensioni inferiori. Tali recidive degenerano naturalmente in casi di base, vale a direT(0) o T(1)che sono noti. Pertanto, è possibile utilizzare strumenti matematici standard per l'analisi della ricorrenza, come il teorema principale .

In the case of collatz function we are not able to infer directly from the reccurence that the case of 3n+1 will eventually deteriorate using standard mathematical tools of reccurences. This is a topic to be resolved by looking at the problem itself, not the reccurence that describes it.


0

You have T (n) = T (n/2) + 1 if n is even. But then n/2 is quite likely not even, so you are stuck there.

What happens is that the nice little rules that you learned are confronted with a real problem, and they don't work. They hit a brick wall, face first, and it hurts. Do yourself a favour, and follow the recursion for T (7) manually, and then you tells if you still believe this is related lg n.

If you think this isn't related to the original question because 7 is not even: Whenever n is odd, T (n) = T (3n + 1), and 3n + 1 is even, so if T (n) were log n if n is even, it would be log (3n + 1) + 1 whenever n > 1 is odd.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.