
\begin{enumerate}
\item On saisit le nombre 18.

Au premier passage dans la boucle itérative, $k=2$. On teste alors si le reste de la division euclidienne de 18 par 8 est nul, ce qui est le cas car  18 est divisible par 2, et si la variable \texttt{p} vaut \texttt{True} (ce qui est le cas aussi). Le programme affiche alors \og Non. \fg{} et la variable \texttt{p} prend la valeur \og \texttt{False} \fg.

Comme \texttt{p} vaut désormais \texttt{False}, à chaque passage dans la boucle, le test \og \texttt{if ... and p == True} \fg{} sera un échec donc aucune autre instruction ne sera exécutée.

Finalement, le programme affiche \og Non. \fg{}

\item On saisit le nombre 15.

Au premier passage dans la boucle itérative, $k=2$. On teste alors si le reste de la division euclidienne de 18 par 8 est nul, ce qui n'est pas le cas car 15 n'est pas divisible par 2, et si la variable \texttt{p} vaut \texttt{True} (ce qui est le cas aussi). On n'exécute donc pas l'instruction \texttt{print('Non.')}.

À l'itération suivante, $k=3$. Comme 15 est divisible par 3, et que \texttt{p} vaut toujours \texttt{True}, l'instruction \texttt{print('Non.')} est exécutée, et la variable \texttt{p} vaut désormais \texttt{False}.

Comme \texttt{p} vaut désormais \texttt{False}, à chaque passage dans la boucle, le test \og \texttt{if ... and p == True} \fg{} sera un échec donc aucune autre instruction ne sera exécutée.

Finalement, le programme affiche \og Non. \fg{}

\item On saisit le nombre 7.

On effectue alors le test \og  est-ce que 7 est divisible par $k$ \fg, pour $k=2$, $k=3$, $k=4$, $k=5$ et $k=6$, ce qui n'est jamais le cas, donc \texttt{p} ne change pas de valeur (reste à \texttt{True}) et aucun message n'est affiché.

On sort alors de la boucle itérative et on effectue le test \og \texttt{p == True} \fg, avec succès, donc l'instruction \texttt{print('Oui.')} est exécutée.

\medskip

Finalement, le programme affiche \og Oui. \fg{}

\item On s'aperçoit alors que le programme affiche \og Non. \fg{} s'il existe un diviseur du nombre choisi (\texttt{a}) compris entre 2 et $a-1$, et affiche \og Oui. \fg{} dans le cas contraire.

Or, si un entier $a$ n'admet aucun diviseur entre 2 et $a-1$, cela signifie que c'est un nombre premier.

\medskip

Finalement, le programme affiche \og Oui. \fg{} si le nombre saisi est premier, et \og Non \fg{}  dans le cas contraire.

\item Voici le programme complété :

\begin{python}
a = int( input('Entrez un nombre entier: ') )
p = True
k = 2
while p == True and k < a:
    if a % k == 0:
        print('Non.')
        p = False
    k = k + 1

print('Oui')
\end{python}

L'idée ici est de partir de $k=2$ et de tester l'égalité \og \texttt{a \% k == 0} \fg{} \textit{tant que} \texttt{p} vaut \texttt{True} ET $k<a$, la valeur de $k$ augmentant de 1 en 1 à chaque passage dans la boucle.
\end{enumerate}
