RETROGICIEL
LE TRIANGLE DE NICOMAQUE
RETROGICIEL
LE TRIANGLE DE NICOMAQUE
⇩. Présentation
Voici un défi, qui à première vue semble aussi ardu que complexe, mais qui, après une courte réflexion logique, se résous en 2 lignes de programmation Python, plus quelques-unes pour la présentation des résultats.
Nicomaque de Gérase, vers l'an 100, fit l'observation suivante :
1³ = 1 ; 2³ = 8 = 3 + 5 ; 3³ = 27 = 7 + 9 + 11 ; 4³ = 64 = 13 + 15 + 17 + 19 ; et ainsi de suite sur plusieurs nombres entiers au cube associés aux suites de nombres impairs correspondantes. Pour vérifier son intuition, il plaça, donc les nombres impairs les uns à la suite des autres dans un triangle, où chaque ligne de rang n recevait les n nombres impairs suivant, comme ci-dessous.
Ligne 1 : 1
Ligne 2 : 3 - 5
Ligne 3 : 7 - 9 - 11
Ligne 4 : 13 - 15 - 17 - 19
Ligne 5 : 21 - 23 - 25 - 27 - 29
etc ...
Ce triangle se révéla des plus instructifs, en lui confirmant de manière visuelle et arithmétique la relation entre la suite des nombres impairs et la construction des nombres cubiques, mais aussi en montrant d'autres propriétés étonnantes.
Après une courte recherche sur ces propriétés, serez-vous capable de rédiger un court programme permettant de trouver tous les nombres d'une ligne quelconque du triangle de Nicomaque, et de vérifier si leur somme est égale au cube du rang de cette ligne ?
⇩. Consignes
Le programme doit :
demander à l'utilisateur quelle ligne du triangle il veut analyser ;
élaborer et retourner la suite des nombres impairs correspodant ;
calculer la somme des nombres impairs de cette liste ;
calculer le cube du rang de la ligne demander ;
faire une autre analyse, si l'utilisateur le souhaite.
D'abord, faite-le fonctionner. Ensuite, faite-le beau. Enfin, faite-le performant.
Amusez-vous bien !
Télécharger RETROGICIEL - Le triangle de Nicomaque.
Cette présentation nécessite que Python 3 soit installé sur votre machine.
Après avoir téléchargé le fichier Le triangle de Nicomaque.7z, décompressez-le dans le répertoire de votre choix.
Ouvrez le répertoire qui vient d'être créé.
Lancez le fichier Retrogiciel.py.
Cliquez sur l'onglet RUN et testez le programme.
Créez votre propre script dans un des langages proposés ou un autre de votre choix.
Le répertoire contient aussi :
- Python.py, l'exemple en PYTHON sans tkinter ;
- Tkinter.py, l'exemple en PYTHON avec tkinter ;
- Qb84.bas, l'exemple en QBASIC avec qb64 ;
- Bbc.bas, l'exemple en BBC BASIC avec bbc sdl.
# --- Origine Nerd ---
# --- RETROGICIEL - PYTHON ---
# --- Le triangle de Nicomaque ---
# -*- coding: utf-8 -*-
# --- PRESENTATION ---
print ("LE TRIANGLE DE NICOMAQUE\n" )
# --- BOUCLE PRINCIPALE ---
while True :
# --- Saisie de la ligne à consulter ---
kimpairs = [ ]
print ( "Pour quelle ligne du triangle de Nicomaque de Gerasa" )
kligne = abs ( int ( input ( "souhaitez-vous trouver les nombres impairs ? " ) ) )
if kligne > 50000 : print ( "Pour une telle valeur, le traitement peut durée quelques instants ..." )
# --- Calcul du premier nombre impair de la ligne ---
kdebut = ( kligne**2 ) - ( kligne - 1 )
# --- Ajout des nombres impairs suivant de la ligne ---
for kvaleur in range ( kligne ) : kimpairs.append ( kdebut + ( kvaleur * 2 ) )
# --- Affichage des nombres impairs de la ligne ---
print ( f"La suite des nombres impairs de la ligne { kligne } est ...\n" )
print ( kimpairs )
print ( f"\nLa somme de ces nombres est : { sum ( kimpairs ) }." )
print ( f"Et le cube de { kligne } est : { kligne ** 3 }.\n" )
# --- Choix du bouclage du programme ---
kchoix = input ( "Voulez-vous recommencer (O ou N) ? " )
if kchoix.upper ( ) == "N" : break
print ( )
# --- FIN DU PROGRAMME ---
print ( "Au revoir" )
# --- Programme : JFB ---
# --- Octobre 2025 ---
# --- Fin ---
Pour mieux comprendre l'exemple en PYTHON sans tkinter.
# --- Origine Nerd ---
# --- RETROGICIEL - TKINTER ---
# --- Le triangle de Nicomaque ---
# -*- coding: utf-8 -*-
# --- IMPORTATION DES MODULES ---
# --- Modules de la bibliothèque standard ---
import tkinter , tkinter.simpledialog
# --- DÉFINITION DES FONCTIONS PERSONNALISEES ---
# --- Saisie de la ligne à rechercher ---
def FNC_Rechercher ( Q ) :
# --- Initialisation de la recherche ---
LAB_Ligne [ "text" ] = f"Ligne : { Q }."
LAB_Somme [ "text" ] = "Traitement en cours ..."
LAB_Cube [ "text" ] = "Veuillez patienter..."
BOX_Impairs.delete ( 0 , "end" )
TKI_Principal.update ( )
kimpairs = [ ]
# --- Calcul du premier nombre impair de la ligne ---
kdebut = ( Q**2 ) - ( Q - 1 )
# --- Ajout des nombres impairs suivant de la ligne ---
for kvaleur in range ( Q ) : kimpairs.append ( kdebut + ( kvaleur * 2 ) )
# --- Affichage des nombres impairs de la ligne ---
BOX_Impairs.insert ( 0 , *kimpairs )
BOX_Impairs.update ( )
LAB_Somme [ "text" ] = f"Somme : { sum ( kimpairs )}."
LAB_Cube [ "text" ] = f"Cube : { Q ** 3 }."
# --- Saisie de la ligne à rechercher ---
def FNC_Saisir ( ) :
ktitre = "Saisie de la ligne."
kmessage = "Pour quelle ligne du triangle\nde Nicomaque de Gerasa"
kmessage += "\nsouhaitez-vous trouver les\nnombres impairs (ligne > 1) ? "
kligne = tkinter.simpledialog.askinteger ( title = ktitre , prompt = kmessage , minvalue = 2 )
if kligne != None : FNC_Rechercher ( kligne )
# --- CREATION DE L'INTERFACE GRAPHIQUE ---
# --- Création de la fenêtre principale ---
TKI_Principal = tkinter.Tk ( )
TKI_Principal.title ( "RETROGICIEL - Le triangle de nicomaque" )
# --- Création des controles nommées ---
BAR_Vertical = tkinter.Scrollbar ( TKI_Principal )
BOX_Impairs = tkinter.Listbox ( TKI_Principal )
BUT_Nouveau = tkinter.Button ( TKI_Principal , text = "Nouveau" , command = FNC_Saisir )
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
LAB_Ligne = tkinter.Label ( TKI_Principal , text = "Ligne : " )
LAB_Somme = tkinter.Label ( TKI_Principal , text = "Somme : " , justify = "left" )
LAB_Cube = tkinter.Label ( TKI_Principal , text = "Cube : " , justify = "left" )
# --- Mise en place des controles (anonymes et nommés) dans la fenêtre principale ---
LAB_Ligne.grid ( row = 0 , column = 0 , columnspan = 2 , sticky = "nesw" )
BOX_Impairs.grid ( row = 1 , column = 0 , sticky = "nesw" )
BAR_Vertical.grid ( row = 1 , column = 1 , sticky = "nesw" )
LAB_Somme.grid ( row = 2 , column = 0 , columnspan = 2 , sticky = "nsw" )
LAB_Cube.grid ( row = 3 , column = 0 , columnspan = 2 , sticky = "nsw" )
BUT_Nouveau.grid ( row = 4 , column = 0 , columnspan = 2 , sticky = "nesw" )
BUT_Quitter.grid ( row = 5 , column = 0 , columnspan = 2 , sticky = "nesw" )
# --- Mise à jour de controle ---
BOX_Impairs [ "yscrollcommand" ] = BAR_Vertical.set
BAR_Vertical [ "command" ] = BOX_Impairs.yview
# --- DEBUT DU PROGRAMME ---
TKI_Principal.mainloop ( )
# --- Programme : JFB ---
# ---Octobre 2025 ---
# --- Fin ---
Pour mieux comprendre l'exemple en PYTHON avec tkinter.
' --- Origine Nerd propose pour ---
' --- RETROGICIEL - QB64 ---
' --- Le triangle de Nicomaque ---
' --- DEBUT DU PROGRAMME ---
PRINT "LE TRIANGLE DE NICOMAQUE."
' --- BOUCLE PRINCIPALE ---
DO
' --- Entete du programme ---
CLS
PRINT "LE TRIANGLE DE NICOMAQUE."
' --- Saisie de la ligne a consulter ---
PRINT "Pour quelle ligne du triangle de Nicomaque de Gerasa"
INPUT "souhaitez-vous trouver les nombres impairs "; kligne~&
PRINT "La suite des nombres impairs de la ligne"; kligne~&; "est ..."
' --- Calcul du premier nombre impair de la ligne ---
kdebut~&& = (kligne~& ^ 2) - (kligne~& - 1)
ksomme~&& = 0
' --- Affichage des element et calcul de la leur sommes ---
FOR kvaleur~& = 0 TO (kligne~& - 1)
kimpair~&& = kdebut~&& + (kvaleur~& * 2)
ksomme~&& = ksomme~&& + kimpair~&&
PRINT kimpair~&&;
NEXT kvaleur~&
PRINT: PRINT
' --- Affichage de la sommes des impairs et du cube (controle) ---
PRINT "Ligne choisie du triangle :"; kligne~&; "."
PRINT "Le premier nombre impair est :"; kdebut~&&; "."
PRINT "Le dernier nombre impair est :"; kimpair~&&; "."
PRINT "La sommes de ces nombres est :"; ksomme~&&; "."
PRINT "Et le cube de"; kligne~&; "est"; kligne~& ^ 3; "."
' --- Bouclage du programme ---
INPUT "Voulez-vous recommencer [ O ou N ] "; kchoix$
LOOP UNTIL UCASE$(kchoix$) = "N"
' --- FIN DU PROGRAMME ---
PRINT "Au revoir."
END
' --- Programme : JFB ---
' --- Octobre 2025 ---
' --- Fin ---
Pour mieux comprendre l'exemple en QB64.
REM --- Origine Nerd propose pour ---
REM --- RETROGICIEL - BBC BASIC ---
REM --- Le triangle de Nicomaque ---
REM --- DEBUT DU PROGRAMME ---
PRINT "LE TRIANGLE DE NICOMAQUE."
REM --- BOUCLE PRINCIPALE ---
REPEAT
REM --- Entete du programme ---
CLS
PRINT "LE TRIANGLE DE NICOMAQUE."
REM --- Saisie de la ligne a consulter ---
PRINT "Pour quelle ligne du triangle de Nicomaque de Gerasa"
INPUT "souhaitez-vous trouver les nombres impairs "; kligne%%
IF kligne%% < 0 THEN kligne%% = ABS( kligne%% )
IF kligne%% > 2000 THEN
PRINT "Pour une telle valeur, le traitement peut duree quelques instants."
PRINT "Appuyez sur une touche pour continuer ..."
kpause = GET
ENDIF
PRINT "La suite des nombres impairs de la ligne "; kligne%% ; " est ..."
REM --- Calcul du premier nombre impair de la ligne ---
kdebut%% = (kligne%% ^ 2) - (kligne%% - 1)
ksomme%% = 0
REM --- Affichage des element et calcul de la leur sommes ---
FOR kvaleur%% = 0 TO (kligne%% - 1)
kimpair%% = kdebut%% + (kvaleur%% * 2)
ksomme%% = ksomme%% + kimpair%%
PRINT STR$ ( kimpair%% ); " " ;
NEXT kvaleur%%
PRINT: PRINT
REM --- Affichage de la sommes des impairs et du cube (controle) ---
PRINT "Ligne choisie du triangle : "; kligne%%; "."
PRINT "Le premier nombre impair est : "; kdebut%%; "."
PRINT "Le dernier nombre impair est : "; kimpair%%; "."
PRINT "La sommes de ces nombres est : "; ksomme%%; "."
PRINT "Et le cube de "; kligne%%; " est "; kligne%% ^ 3; "."
REM --- Bouclage du programme ---
INPUT "Voulez-vous recommencer [ O ou N ] "; kchoix$
UNTIL kchoix$ = "N" OR kchoix$ = "n"
REM --- FIN DU PROGRAMME ---
PRINT "Au revoir."
END
REM --- Programme : JFB ---
REM --- Octobre 2025 ---
REM --- Fin ---
Pour mieux comprendre l'exemple en BBC BASIC.