3.3 Nombres naturels

Résultat mathématique. Un nombre naturel est un nombre entier et positif, 0 compris. L’ensemble des nombres naturels est infini.

Pour obtenir le 1er million de ces nombres, nous le codons 0 à: 999999. Pour vérifier son cardinal – nombre d’éléments – nous codons (0 à: 999999) taille et nous affichons le résultat par Print it (Ctrl-p).

3.3.1 Multiples et diviseurs

Résultat mathématique. Lorsque le reste d’une division euclidienne est égale à zéro cela signifie que le dividende est un multiple du diviseur. Cela revient à dire que le diviseur est un diviseur du dividende.

Avec le division euclidienne nous disposons donc d’une méthode pour tester si un nombre est multiple d’une autre nombre ou si un nombre est diviseur d’un autre nombre. Exécuter l’exemple ci-dessous avec la commande Print itCtrl-p – et observer la réponse affichée.

85214 \\ 24 = 0
   siVrai: ['C''est un multiple !']
   siFaux: ['Ce n''est pas un multiple.']

Exemple 3.9: Tester un multiple

Modifier l’Exemple 3.9 avec les valeurs 85200 et 24. Quelle réponse est obtenue ?

Exercice 3.11: Test de multiple

Adapter l’Exemple 3.9 pour tester si 24 est un diviseur de 85200.

Exercice 3.12: Test de diviseur

L’exemple suivant montre comment créer un programme interactif pour tester si un nombre est multiple d’un autre nombre nombre.

| a b |
a := (self request: 'Un premier nombre' initialAnswer: '1') commeNombre.
b := (self request: 'Un deuxième nombre' initialAnswer: '2') commeNombre.
a \\ b = 0
   siVrai: [ self inform:
      a asString, ' est un mulitple de ', b asString ]
   siFaux: [ self inform:
      a asString, ' n''est pas un mulitple de ', b asString ]

Exemple 3.10: Programme interactif avec multiple

Dans cet exemple, a et b sont deux variables pour représenter nos deux nombres. Pour demander à l’utilisateur la valeur de ces nombres, nous utilisons le message request:initialAnswer: envoyé à n’importe quel objet.

Cela affiche une petite fenêtre où saisir le nombre, le mot request: signifie requête/demande. Le message nous retourne alors la réponse de l’utilisateur. Cette réponse est une phrase que nous convertissons en nombre avec le message commeNombre. Pour afficher la réponse, nous utilisons le message inform:. Cette réponse est construite à partir de portions de phrase concaténées – collées – avec le message binaire virgule :“,”.

Modifier l’Exemple 3.10 afin de tester si un nombre est diviseur d’un autre nombre. La réponse est donnée sous la forme d’une phrase affichée dans une fenêtre.

Exercice 3.13: Programme interactive avec diviseur

3.3.2 Diviseurs d’un nombre naturel

Pour construire l’ensemble des diviseurs de 100, nous choisissons chacun des nombres naturels de 1 à 100 qui divise 100. Le code ci-dessous lancé par un Print it (Ctrl-p) affiche une collection des diviseurs de 100.

(1 à: 100) choisir: [ :n |  100 \\ n = 0]

Exemple 3.11: Diviseurs de 100

Le message à mot clé choisir: est envoyé à l’ensemble {1;...;100}. Dans le bloc de code [], l’argument n prend chacune des valeurs des nombres de l’ensemble. Nous testons alors si n divise 100, c’est vrai lorsque le reste de la division est égale à 0, en code cela donne 100 \\ n = 0. Dans ce cas, la méthode choisir: retient la valeur de n.

Adapter l’Exemple 3.11 pour obtenir les diviseurs de 155.

Exercice 3.14: Diviseurs de 155

Une dernière chose à faire est de transformer ce code en un bloc de code. De cette façon nous pouvons demander les diviseurs de plusieurs nombres naturels sans répéter tout le code.

| diviseurs |
diviseurs := [:nombre |
   (1 à: nombre) choisir: [ :n |  nombre \\ n = 0]].
diviseurs valeur: 100.
diviseurs valeur: 155

Exemple 3.12: Diviseurs de 155 et 100

Le bloc de code [] est affecté à la variable diviseurs. Dans ce bloc, :nombre est un paramètre qui prend la valeur de 100 lorsque nous codons diviseurs valeur: 100 ou qui prend la valeur de 155 lorsque nous codons diviseurs valeur: 155.

Attention, dans cet exemple seule la dernière ligne est affichée lors d’une exécution par un P rint it. Pour afficher à la fois les diviseurs de 100 et 155, nous concaténons les réponses en remplaçant les deux dernières lignes de code par (diviseurs valeur: 100), (diviseurs valeur: 155).

3.3.3 Diviseurs communs

Résultat mathématique. Un diviseur est commun à deux nombres naturels lorsqu’il divise ces deux nombres.

Examinons en détail l’Exemple 3.12 avec les diviseurs communs de 100 et 155.

Pour 100, le code nous retourne cette liste de diviseurs :

| diviseurs |
diviseurs := [:nombre |
   (1 à: nombre) choisir: [ :n |  nombre \\ n = 0]].
diviseurs valeur: 100.
⇒  #(1 2 4 5 10 20 25 50 100)

Pour 155, le code nous retourne cette liste de diviseurs :

| diviseurs |
diviseurs := [:nombre |
   (1 à: nombre) choisir: [ :n |  nombre \\ n = 0]].
diviseurs valeur: 155.
⇒  #(1 5 31 155)

Nous observons que 1 et 5 sont les diviseurs communs de 100 et 155 car ils sont présents dans les collections #(1 2 4 5 10 20 25 50 100) et #(1 5 31 155). Nous le traduisons en code en demandant l’intersection de ces deux collections, c’est-à-dire ne retenir que leurs nombres communs, cela se code :

#(1 2 4 5 10 20 25 50 100) & #(1 5 31 155)
⇒ #(5 1)

Modifier l’Exemple 3.12 pour afficher la collection des diviseurs communs de 100 et 155

Exercice 3.15: Diviseurs communs de 100 et 155

Maintenant, écrivons un programme interactif pour demander et calculer les diviseurs communs de deux nombres.

Adapter la solution de l’Exercice 3.15 pour écrire un programme interactif comme l’Exemple 3.10 calculant et affichant les diviseurs de deux nombres.

Exercice 3.16: Programme interactif de diviseurs communs

Nous pouvons aussi définir un nouveau bloc de code pour calculer les diviseurs communs de deux nombres.

| a b diviseurs divCommuns |
diviseurs := [:nombre |
   (1 à: nombre) choisir: [ :n |  nombre \\ n = 0]].
divCommuns := [:x :y | (diviseurs valeur: x) & (diviseurs valeur: y)].
""
divCommuns valeur: 100 valeur: 155

Exemple 3.13: Bloc de code diviseurs communs

3.3.4 Plus grand diviseur commun

Résultat mathématique. Lorsque nous nous intéressons aux diviseurs communs de deux nombres naturels, il y en a un de particulier, c’est le Plus Grand Diviseur Commun. Dans l’ensemble des diviseurs communs c’est le plus grand, le maximum.

Toujours avec l’exemple des diviseurs communs de 100 et 155, nous avions trouvé la collection #(5 1), pour obtenir le PGDC, nous demandons le maximum de cette collection en lui envoyant le message max , cela donne le code :

#(5 1) max
⇒ 5

Le PGDC de 100 et 155 est 5 !

Écrire un bloc de code affecté à une variable pgdc et qui retourne le PGDC de deux nombres naturels. Le bloc de code reprendra la solution de l’Exercice 3.15. Comme l’Exemple 3.13, ce bloc aura deux arguments.

Exercice 3.17: PGDC

Écrire un programme interactif qui demande deux nombres naturels à l’utilisateur et qui répond d’une phrase le PGDC affiché dans une fenêtre. S’inspirer de l’Exemple 3.10 et de la solution de Exercice 3.17

Exercice 3.18: Programme interactif de PGDC

3.3.5 Nombre premier

Résultat mathématique. Un nombre premier est un nombre naturel qui a exactement deux diviseurs : 1 et lui-même. Lorsque nous connaissons la collection des diviseurs d’un nombre, il est premier si elle contient exactement deux nombres : 1 et le nombre lui-même.

Par exemple 155 n’est pas premier car sa collection de diviseurs #(1 5 31 155) contient 4 nombres. Pour le coder il suffit donc de demander la taille de la collection des diviseurs en lui envoyant le message taille :

#(1 5 31 155) taille
⇒ 4
"155 n'est pas premier"

En posant la question 155 est-il premier ?, nous attendons une réponse qui est soit Vrai, soit Faux. En code informatique cela se traduit en true ou false. Pour obtenir cette réponse nous comparons la taille de la collection des diviseurs à 2. Si la taille est égale à 2 nous obtenons la réponse true, sinon false.

| diviseurs |
diviseurs := [:nombre |
   (1 à: nombre) choisir: [ :n |  nombre \\ n = 0]].
""
"Tester chacune des lignes ci-dessous"
(diviseurs valeur: 155) taille = 2.
"⇒ false"
(diviseurs valeur: 29) taille = 2.
"⇒ true"
(diviseurs valeur: 100) taille = 2.
"⇒ false"
(diviseurs valeur: 1) taille = 2.
"⇒ false"
(diviseurs valeur: 2) taille = 2.
"⇒ true"

Exemple 3.14: Nombre premier ?

Écrire un bloc de code affecté à une variable premier qui retourne une réponse true ou false selon que le nombre passé en paramètre est premier ou non.

Exercice 3.19: Nombre premier

Nous disposons maintenant d’un bloc de code pour tester si un nombre est premier ou non. Il serait intéressant de construire la collection des nombres premiers de 1 à 1000. Une ligne de code supplémentaire est nécessaire par rapport à la solution de l’Exercice 3.19.

Compléter la solution de l’Exercice 3.19 avec une ligne de code supplémentaire pour déterminer la collection des nombres premiers entre 1 et 1000. Indice : utiliser les messages à mot clé 1 à: 1000 et choisir:.

Exercice 3.20: Nombres premiers entre 1 et 1000

Résultat mathématique. Deux nombres sont premiers entre eux lorsque leur seul diviseur commun est 1. Cela signifie que leur PGDC est 1.

Par exemple 21 et 25 sont premiers entre eux car 1 est leur seul diviseur commun. Noter que 21 et 25 pris individuellement ne sont pas des nombres premiers.

Écrire un programme interactif qui demande à l’utilisateur deux nombres naturels et qui répond par une phrase si les nombres sont premiers entre eux ou pas. S’inspirer de la solution de l’Exercice 3.18.

Exercice 3.21: Nombres premiers entre eux ?