S = [13, 61] # liste des termes de la suite. Définir les deux premiers N = 500 # Nombre max d'itérations def diviseurs(n): D = [] for k in range(1, int(n+1)): if (n%k==0): D.append(k) return D def u(v, w): # v := u_{n-2} et w := u_{n-1} D = diviseurs(v+w) if(len(D)==2): # si (v+w) est premier, il a 2 diviseurs exactement return (v+w) else: return( (v+w) // D[1] ) # D[1] = 2e indice, plus petit diviseur différent de 1 def dans(S): # Fonction qui cherche s'il existe déjà deux termes consécutifs dedans = False # ... ayant la même valeur que les deux derniers termes for i in range(3, len(S)): # on parcourt les indices if(S[-2:]==S[i-3:i-1]): # S[-2:] donne les deux derniers termes dedans = True # S[i-3:i-1] est une paire de termes consécutifs return dedans # Si aucune égalité n'a été trouvée, dedans est resté à False for k in range(2,N): S.append(u(S[k-2], S[k-1])) if(dans(S)): break print(S) for i in range(3, len(S)): # on parcourt les indices if(S[-2:]==S[i-3:i-1]): # S[-2:] donne les deux derniers termes break print("\nLe cycle commence à u_", (i-3)," par ", S[i-3:i+1], " et sa longueur est de ", (len(S)-i+1), sep='')