Forum >> Principianti >> Aiuto: Python e Sherlock Holmes (Fibonacci)

Pagina: 1

Salve a tutti, sono un nuovo utente del forum. Sono sotto periodo di Maturità e la mia tesina si concentra su Sherlock Holmes e la criminologia. Vi starete probabilmente domandano: cosa collega il detective a Python? La nemesi di Holmes, il Dr. Moriarty, utilizza un codice per comunicare con i propri sottoposti e/o per appuntarsi i piani dei suoi crimini.



"The message requires a public key, an integer p. From each number p, one can build a sequence of numbers, the Fibonacci-p numbers, denoted Fp. The sequence is defined by Fp(n) = Fp(n – 1) + Fp(n – p –1), with Fp(0) = 1 and Fp(n) = 0, n < 0, and can be created by summing along the pth diagonal of Pascal’s triangle. For p = 0, we recover the powers of 2 (horizontal lines on the Pascal triangle), whereas p = 1 corresponds to the classic Fibonacci sequence (first diagonal in the Pascal triangle)."




Praticamente, data una chiave pubblica "p", è possibile creare una sequenza di numeri simile a quella di Fibonacci, chiamata "Fp". La formula è data da:




Fp(n) = Fp(n – 1) + Fp(n – p –1)




dove n è un numero da 1 in poi.

Ma ci sono certe eccezioni: se il valore dentro Fp o Fp è compreso fra 0 e p (o uguale a uno dei due valori), esso prende il valore di 1, mentre se minore di 0 sarà uguale a 0




Ex.: Fp(3) con p= 3 => Fp(3-1)+Fp(3 - 3 - 1) = Fp(2) + Fp(-1) = 1+0 = 1

Ex.: Fp(4) con p= 3 => Fp(4-1)+Fp(4 - 3 - 1) = Fp(3) + Fp(0) = 1+1 = 2




In caso non ci fosse questa eccezione Fp o Fp prenderebbero i valori rispettivamente della Fp(n) con dove n è il loro argomento: per esempio se Fp(8 ) si va a prendere Fp con n = 8




Proviamo a considerare Fp con p = 3




n:1 Fp(1-1)+Fp(1 - 3 - 1) = Fp(0) + Fp(-3) = 1+0 = 1

n:2 Fp(2-1)+Fp(2 - 3 - 1) = Fp(1) + Fp(-2) = 1+0 = 1

n:3 Fp(3-1)+Fp(3 - 3 - 1) = Fp(2) + Fp(-1) = 1+0 = 1

n:4 Fp(4-1)+Fp(4 - 3 - 1) = Fp(3) + Fp(0) = 1+1 = 2

n:5 Fp(5-1)+Fp(5 - 3 - 1) = Fp(4) + Fp(1) = 2+1 = 3

n:6 Fp(6-1)+Fp(6 - 3 - 1) = Fp(5) + Fp(2) = 3+1 = 4

n:7 Fp(7-1)+Fp(7 - 3 - 1) = Fp(6) + Fp(3) = 4+1 = 5

n:8 Fp(8-1)+Fp(8 - 3 - 1) = Fp(7) + Fp(4) = 5+2 = 7

n:9 Fp(9-1)+Fp(9 - 3 - 1) = Fp(8 )+ Fp(5) = 7+3 = 10







Credo di essere più o meno arrivato fino al punto in cui l'argomento di Fp è uguale al p (in quanto si assiste ad un semplice incremento di Fp), ma poi non saprei come poteri richiamare una Fp dato l'n... un'idea che mi è venuta in mente sarebbe rinominare Fp in Ftot o Fk, per poi richiare Fk di n (Per esempio Fk di 7 con p = 3 è 5), ma non saprei come continuare.

Mi piacerebbe che risultasse un lavoro simile a:




Per public key uguale a ... (il valore assegnato a p):

Turno n : Fp

Turno n+1: Fp

Turno n+2: Fp




Per public key uguale a 3

Turno 1 : 1

Turno 2 : 1

....

Turno 7 : 5




Siccome sono alle prime armi con Python (in classe ne abbiamo solo accennato e non saprei come muovermi) vi dispiace inoltre dare un'occhiata al mio lavoro fin a questo momento? Grazie e spero di essere stato comprensibile (lo so, è abbastanza confuso come ragionamento, ma lo trovo molto affascinante) :)








Allegati
Ciao m_cecchetto e benvenuto tra noi.

Tralasciando un attimo il risultato che vuoi ottenere, il tuo codice contiene un numero imprecisato di errori, prima vediamo di metterlo a posto.

Una cosa che salta subito all'occhio è che devi rivedere il concetto di funzione. Infatti se vuoi dare in pasto alla tua funzione qualcosa lo devi fare in maniera esplicita (almeno in questa tua prima fase di apprendimento). Non pensare che Python capisca da solo, non ha facoltà medianiche.

Facciamo un esempio:
>>> def faccio_cose(n):
        return n + 1
>>> i = int(input("Inserisci un dato: "))
Inserisci un dato: 1
>>> print faccio_cose(i)
2
Uno degli esempi più stupidi mai visti, ma spero ti sia chiaro che a quella povera funzione devi passargli qualcosa. Inizia a mettere a posto questo nel tuo codice e poi continuiamo.

Daniele

P.S. Ti consiglio anche di usare il comodissimo Pastebin per incollare il tuo codice.
Grazie Daniele per il benvenuto. :)

Tornando al definire una funzione, credo di aver capito un po' meglio il concetto che mi volevi spiegare ma, nonostante ci stia provando da un paio di ore, non riesco proprio a capire come dovrei implementarlo nel mio programma. TI dispiacerebbe farmi un esempio partendo dal mio lavoro oppure spiegarmi un attimo cosa dovrei definire (noi abbiamo imparato a commentare programmi Pyhton, non a crearne, quindi mi sto muovendo abbastanza al buio e usando il buon senso e qualche ricordo di C++).
Grazie mille e scusa per le mie lacune, ma è davvero importante per me :embarrassed:
Ciao caro, oggi è una giornata un po' pienotta non riesco a mettere le mani sul tuo codice, ma intanto guardati questo bellissimo video per capire di cosa stiamo parlando.

Il video è un po' datato e riferito a Python 2.6 (mi sembra), ma le informazioni contenute sono sempre valide.

Ciao.
Daniele


Pagina: 1



Esegui il login per scrivere una risposta.