A la quête des nombres triangulaires
Présentation des nombres triangulaires
Vous connaissez les nombres triangulaires ? Et bien pas moi, mais sur internet je vois ceci :
et je lis cela :
Le nombre triangulaire de rang n est la somme des nombres entiers de 1 à n.
Source: https://fr.wikipedia.org/.
Analyse
Donc je comprends que si T représente un nombre Triangulaire et si l’indice 2 représente le second nombre triangulaire alors T₂ = 3 car le second nombre triangulaire contient 3 billes.
La logique est donc celle-ci:
- T₁ = 1
- T₂ = 1+2 = 3
- T₃ = 1+2+3 = 6
- ...
Et si je dispose de 15 billes, alors je peux créer les 3 premiers nombres triangulaires:
T₁ = 1
T₂ = 3
T₃ = 6
soit 1+3+6=10 billes et il m’en restera 5 dans mon sac car je n’en aurai pas assez pour construire le nombre triangulaire suivant, à savoir T₄ qui lui a besoin de 10 billes
Sujet de recherche
Créer un programme en python affichant tous les nombres triangulaires que je pourrai construire avec un sac de 1000 billes. En bonus, me dire combien il me restera de billes dans mon sac à la fin. En effet il est fortement probable qu'après avoir construit l'avant dernier nombre triangulaire il ne me reste pas assez de billes pour le triangulaire suivant!
J'ai l'idée d'utiliser un "Tant que ..."
La suite de l'article présente la résolution du problème par essai-erreur. Cette méthode existe ! Wikipedia - Méthode essai-erreur.
Conseil:
Pour vous étonner vous-même, je vous conseille de lire cet article étape par étape, de visualiser, de tester le script puis d'essayer de l'améliorer en tenant compte des conseils. Ne passez pas trop vite à l'étape suivante pour voir la solution.
Etape 1 – script sans boucle calculant T₁ etT₂
Visualisation mentale
Pour les 2 premiers nombres triangulaires j’ai besoin d’au moins 4 billes dans mon sac.
- Imaginons un sac de 6 billes
- J’en prends p = 1 bille
- Je construis T₁ = p = 1 bille
- Je compte le contenu de mon sac, il en reste 6-1=5 billes
- J'ai assez de billes pour faire T₂ car il m’en faut 1+2=3 et il m’en reste 5
T₂ = T₁ + p+1 - Je prends p = 2 + 1 billes
- Je construis T₂ = T₁ + p+1
- Je compte le contenu de mon sac, il en reste 5-3=2 billes
- Je n’ai plus assez de billes pour faire T₃ car il m’en faudrait 1+2+3=6 et il ne m’en reste que 2
Visualisation du script
C’est le début qui est dur. Après quelques essais je vous propose ceci:
Script
# initialisation variables
sac=6
b=0
t=0
p=0
# je cree T1
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
# je cree T2
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
Console
>>> %Run Triangulaire.py
1 1 5
2 3 2
Compréhension du script
Je passe sur l’initialisation des variables
-
p=p+1 me permet d’ajouter 1 bille au nombre de bille prise avant. Cela correspond aux billes roses, puis aux billes jaunes, puis au billes vertes.
-
t=t+p me permet de calculer les billes nécessaires au nombre triangulaire suivant connaissant le nombre de bille du nombre triangulaire précédent
-
sac=sac-t me permet de soustraire les billes utilisées pour un nombre triangulaire au contenu du sac.
Compréhension du shell
-
1 1 5 => Bille prise 1 – Nbre triangulaire construit T₁ avec 1 bille - Reste dans le sac 5 billes
-
2 3 2 => Bille nécessaire et prise une de plus donc 2 – Nbre triangulaire construit T₂ qui utilise au total 1+2 soit 3 billes - Reste dans le sac 2 billes car j’ai retiré T₁ et T₂
Amélioration - Poursuite du questionnement
=> Compléter ce script pour confirmer sa logique en calculant le nombre de billes nécessaires pour le 3ème nombre triangulaire.
Etape 2 – Test du script avec T₃
Evidemment cela ne marche pas ! Enfin si mais j’ai un problème de sac ! Pour preuve le script du dessous fonctionne mais les résultats du shell pour la dernière ligne posent problème.
Script
# initialisation variables
sac=6
b=0
t=0
p=0
# je cree T1
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
# je cree T2
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
# je cree T3
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
Console
>>> %Run Triangulaire.py
1 1 5
2 3 2
3 6 -4
Compréhension du script
-
Mon sac contient toujours 6 billes
-
Si je construis 3 nombres triangulaires il m’en manquera 4 d’où le -4 pour la valeur du sac à la fin
Amélioration du script
-
Comme je répète du code (voir en dessous), je pense boucle
# je cree T1
p=p+1
t=t+p
sac=sac-t
print(p,t,sac) -
Sans réfléchir je me dis que tant que mon sac contient des billes je continue (ce qui est une erreur que nous allons devoir corriger!)
=> Créer une boucle Tant que j'ai des billes et réduisez le nombre de lignes de votre script!
Etape 3 – Création de la boucle bornée
Voici ma proposition, le tant que teste le contenu de mon sac. Il s'insère au dessus du code répétitif et le contenu devant être dans la boucle est indenté. Tant que = while correspond à une boucle non-bornée.
Script
# initialisation variables
sac=6
b=0
t=0
p=0
# je cree la boucle
while sac >=0:
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
Console
>>> %Run Triangulaire.py
1 1 5
2 3 2
3 6 -4
Compréhension du script
- Le while fonctionne
- Mais avec 6 billes il ne devrait pas se lancer une troisième fois dans la boucle puisque je n’en ai pas assez.
Amélioration du script
- Je dois donc calculer le nombre de billes qu’il me faudra pour la boucle suivante et faire le test sac>=bille à utiliser au prochain coup
- Ce calcul est à faire après le print
=> Calculer en fin de boucle le nombre de billes pour le prochain triangulaire et servez-vous en comme limite dans la boucle.
Etape 4 – Vers la solution
Le script du dessous est presque logique! Sauf que Python est un langage interprété ligne par ligne (Pour plus d'info voir ici) donc il va mettre 6 dans sac - 0 dans b puis t puis p - prendre la valeur de sac (donc 6) et se demander si cette valeur est supérieure ou égale à bpc et bpc est une variable qu'il ne connaît pas puisqu'elle n'est calculée que tout en bas!!!
Script
# initialisation variables
sac=6
b=0
t=0
p=0
# je cree la boucle
while sac >=bpc:
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
bpc=t+p+1
Console
>>> %Run Triangulaire.py
Traceback (most recent call last):
File "C:\Users\Pierre\Downloads\Triangulaire.py", line 7, in <module>
while sac >=bpc:
NameError: name 'bpc' is not defined
Compréhension du script et du problème
- La dernière ligne:
bpc (pour billes prochain coup) = t (donc billes utilisées pour le dernier nbre triangulaire) + p+1 (car au nombre triangulaire suivant j’ai besoin de p+1 billes en plus
Le tant que testera le contenu du sac restant avec le nombre de billes nécessaires - Le problème de définition de bpc vient du fait que si vous regardez le while, à cette ligne nous devons connaître la valeur de sac (ce qui est le cas) MAIS AUSSI le valeur de bpc. Or bpc n'est pas connu car il n’est calculée qu’en bas.
La solution consiste à définir bpc avant. Comme je ne connais pas sa valeur je vais mettre 0, mais 1 marcherai aussi (par contre 100 ça coince, vous comprenez pourquoi?)
Script corrigé et déclaration d'un sac de 21 billes
# initialisation variables
sac=21
b=0
t=0
p=0
bpc=0
# je cree la boucle
while sac >=bpc:
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
bpc=t+p+1
Console
>>> %Run Triangulaire.py
1 1 20
2 3 17
3 6 11
4 10 1
Amélioration du script
- L'affichage n'est pas clair, alors améliorez le.
- Comme nous connaissons input, utilisons le.
=> Modifier l'affichage pour qu'il devienne compréhensible en ajouter un peu de texte et en profiter pour permettre à l'utilisateur de saisir la valeur de son sac (car tout le monde ne possède pas 1000 billes ;).
Amélioration de l’affichage
Fin de la recherche. La vie est belle.
Avec 1000 billes, vous pouvez construire 17 nombres triangulaires et dans votre sac il vous restera 31 billes à la fin car vous en aurez utilisé 969 !!!
Vous noterez la présence d'une nouvelle variable: u afin de pouvoir compter les billes consommées ;)
Script
# initialisation variables
sac=int(input("Saisir le nombre de billes dans votre sac? "))
b=0
t=0
p=0
bpc=0
u=0
# je cree la boucle
while sac >=bpc:
p=p+1
t=t+p
u=u+t
sac=sac-t
print("n°=",p,"Nbre triangulaire=",t,"Billes restantes=",sac,"Billes consommées=",u)
bpc=t+p+1
Console, avec un sac de 1000 billes
>>> %Run Triangulaire.py
Saisir le nombre de billes dans votre sac? 1000
n°= 1 Nbre triangulaire= 1 Billes restantes= 999 Billes consommées= 1
n°= 2 Nbre triangulaire= 3 Billes restantes= 996 Billes consommées= 4
n°= 3 Nbre triangulaire= 6 Billes restantes= 990 Billes consommées= 10
n°= 4 Nbre triangulaire= 10 Billes restantes= 980 Billes consommées= 20
n°= 5 Nbre triangulaire= 15 Billes restantes= 965 Billes consommées= 35
n°= 6 Nbre triangulaire= 21 Billes restantes= 944 Billes consommées= 56
n°= 7 Nbre triangulaire= 28 Billes restantes= 916 Billes consommées= 84
n°= 8 Nbre triangulaire= 36 Billes restantes= 880 Billes consommées= 120
n°= 9 Nbre triangulaire= 45 Billes restantes= 835 Billes consommées= 165
n°= 10 Nbre triangulaire= 55 Billes restantes= 780 Billes consommées= 220
n°= 11 Nbre triangulaire= 66 Billes restantes= 714 Billes consommées= 286
n°= 12 Nbre triangulaire= 78 Billes restantes= 636 Billes consommées= 364
n°= 13 Nbre triangulaire= 91 Billes restantes= 545 Billes consommées= 455
n°= 14 Nbre triangulaire= 105 Billes restantes= 440 Billes consommées= 560
n°= 15 Nbre triangulaire= 120 Billes restantes= 320 Billes consommées= 680
n°= 16 Nbre triangulaire= 136 Billes restantes= 184 Billes consommées= 816
n°= 17 Nbre triangulaire= 153 Billes restantes= 31 Billes consommées= 969
Comme je suis curieux et pour aller plus loin:
Vous avez remarquez, les nombres triangulaires semblent être impair-impair puis pair-pair... bizarre, bizarre comme c'est bizarre ;)
Saisir le nombre de billes dans votre sac? 1000
n°= 1 Nbre triangulaire= 1 (impair)
n°= 2 Nbre triangulaire= 3 (impair)
n°= 3 Nbre triangulaire= 6 (pair)
n°= 4 Nbre triangulaire= 10 (pair)
...
Et si votre curiosité est insatiable et/ou si vous aimez regarder le vol des oiseaux alors faites un saut ici: http://www.recreomath.qc.ca/dict_triangulaire_nombre.htm