
Dans ce programme il y a deux fonctions:

\begin{python*}
def is_prime(n , L):
	# n est un nombre, L est une liste
    for p in L:
        if n % p == 0:
            return False

    return True
\end{python*}

On définit ici une fonction prenant deux arguments : un nombre \texttt{n} et une liste \texttt{L}.

Dans la boucle itérative \og \texttt{for p in L:} \fg, qui parcourt toute la liste \texttt{L} élément par élément, on teste si \og \texttt{n \% p == 0} \fg{} c'est-à-dire si le reste de la division euclidienne de \texttt{n} par \texttt{p} est nul, donc si \texttt{n} est divisible par \texttt{p}. Cela sous-entend donc que \texttt{L} est une liste de nombres.

Si tel est le cas, c'est-à-dire si \texttt{n} est divisible par \texttt{p}, la fonction retourne \og \texttt{False} \fg.

Une fois la liste \texttt{L} parcourue, si on sort du test \og \texttt{if n \% p == 0} \fg, c'est que \texttt{n} n'est divisible par aucun nombre de la liste \texttt{L}, et la fonction renvoie \og \texttt{True} \fg.

\begin{python*}
def liste(n):
    L = [] # liste vide
    for k in range(2,n+1):
        if is_prime(k , L) == True:
            L.append(k)

    return L
\end{python*}


\medskip

On initialise une liste vide \texttt{L}.

\medskip

Ensuite, il y a une boucle itérative \texttt{for k in range(2,n+1):} qui signifie que l'on parcourt tous les nombres entiers de 2 à \texttt{n}. Pour chacun d'eux, on fait appel à la fonction \texttt{is}\_\texttt{prime} et on teste si elle renvoie \og \texttt{True} \fg; si tel est le cas, on ajoute à la liste \texttt{L} le nombre \texttt{k} courant à l'aide de l'instruction \texttt{L.append(k)}.

\medskip

On construit ainsi une liste de nombres qui ne sont pas divisibles par les éléments de cette même liste : ce sont les nombres premiers inférieurs ou égaux à \texttt{n}.
