Anche se andiamo OT cerco di darti una mano, questo forum nasce per questo no?
immagina una funzione che faccia questo: input --> sequenza numeri prosodia con lunghezza modulo, output --> prosodia normalizzata
diciamo che per salvare gli elementi potresti usare un dizionario con le associazioni numeri in input --> interi non negativi in range(0, lunghezza_modulo). Quindi primo passo il tuo dizionario conterrà l'associazione primo_numero:0 e la prosedia di output il valore 0.
Cicli sugli altri numeri della sotto prosodia (passami il termine) in input e se quel numero è presente come chiave nel dizionario vai ad appendere alla prosedia il valore corrispondente, altrimenti aggiungi al dizionario l'elemento con chiave il tuo numero e valore il massimo dei valori del dizionario + 1 (se è un valore nuovo devi assegnargli l'intero successivo all'ultimo utilizzato) e appendi alla prosedia di output questo valore appena calcolato. Dunque la funzione ti restituisce la prosedia normalizzata.
A questo punto da qualche parte ciclerai sulle sotto prosedie della tua prosedia originaria di lunghezza il modulo che stai analizzando passandole in input alla funzione descritta. Se il risultato per anche solo una di queste sotto prosedie è diversa da quella base, allora quello che stai analizzando non è il modulo, altrimenti potrebbe esserlo.
Per efficientare potresti pensare di cercare il modulo solo sui divisori della lunghezza della prosodia ovviamente, e se li ordini ed escludi i valori 1 e 2, allora il primo modulo che trovi è automaticamente quello corretto (N.B. se x è modulo anche i multipli di x lo sono, ma il minimo è proprio x).
A questo punto non ti rimane che fare le cose in maniera intelligente, non ho scritto pseudocodice, che sarebbe ammesso, ma ho cercato di descriverti il funzionamento e penso che potresti estrarre pseudocodice molto facilmente.
Spero di essere stato chiaro e di aiuto.