# -*- coding: utf-8 -*-
"""
Suite de Fibonacci.

Méthode itérative avec boucle do.
Dépendance du temps de calcul avec le rang n.

"""

# Fonction itérative pour le calcul de F(n).
# Comme on s'intéresse à de grands rangs, les cas n=0 et n=1 ne sont pas pris
# en compte.
def fibo_iter(a,b,n):
    for i in range(n-1):
            c = a + b
            a,b = b,c
    return c

# PROGRAMME PRINCIPAL
# ===================

# Importations des bibliothèques
import time
import matplotlib.pyplot as plt
import numpy as np

# Saisie des paramètres par l'utilisateur :
# n1 : rang initial
# n2 : rang final
# dn : pas
n1 = int(input('Veuillez saisir le rang initial : '))
n2 = int(input('Veuillez saisir le rang final : '))
dn = int(input('Veuillez saisir le pas : '))

# Création des tableaux numpy pour la génération du graphique
x = np.arange(n1,n2 + dn,dn)

T = []

for n in range(n1,n2 + dn,dn):
    t_init = time.perf_counter()
    res = fibo_iter(0,1,n)
    t_final = time.perf_counter()
    T.append(t_final - t_init)

y = np.array(T)

# Génération des points du graphique
plt.plot(x,y,'.',color='orange')

# Génération des principaux éléments du graphique (titre et légendes sur les axes)
titre = 'Temps de calcul du terme de rang n\nde la suite de Fibonacci.'
plt.title(titre)
plt.xlabel('n')
plt.ylabel('Temps de calcul (secondes).')

# Affichage du graphique
plt.show()

# FIN DU PROGRAMME PRINCIPAL
# ==========================