RETROGICIEL
LA CONJECTURE DE SYRACUSE
RETROGICIEL
LA CONJECTURE DE SYRACUSE
⇩. Présentation
Paul ERDOS déclarait, à propos de la conjecture de Syracuse, que les mathématiques n'étaient pas encore prêtes pour de tels problèmes. En effet, et en dépit de la simplicité de son énoncé, voici une conjecture qui défie les mathématiciens.
Une suite de Syracuse est une suite d'entiers naturels créée de la façon suivante :
- à partir de n'importe quel nombre entier strictement positif ;
- on le divisera par 2, s’il est pair ;
- on le multipliera par 3 puis on ajoutera 1, s’il est impair ;
- on répétera ces règles jusqu'à ce qu'un résultat donne le chiffre 1.
En effet, dès que l'on rencontre le chiffre 1, on obtiendra toujours la suite 1, 4, 2, 1, ... car (1 x 3) + 1 = 4 puis 4 / 2 = 2 et 2 / 2 redonne 1. Par exemple, si on part de 23, on aura la suite de résultats suivants : 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1, ... A ce jour rien ne prouve que tous les entiers naturels supérieurs à zéro finiront par retourner cette suite de 1, 4, 2, mais il n'existe toujours pas d'exemple qui n'y aboutisse pas.
Créons un petit programme qui permettra de tester si un nombre entier strictement positif finit par retourner cette suite de 1, 4, 2 ... et peut-être serez-vous le premier à réfuter cette conjecture.
⇩. Consignes
Le programme doit :
demander à l'utilisateur un nombre de départ ;
s'assurer que ce nombre est bien un entier strictement positif ;
créer et afficher la suite des résultats ;
s'arrêter dès que le résultat est 1 ;
demander si l'utilisateur veut tester un autre nombre.
D'abord, faite-le fonctionner. Ensuite, faite-le beau. Enfin, faite-le performant.
Amusez-vous bien !
Télécharger RETROGICIEL - La conjecture de Syracuse.
Cette présentation nécessite que Python 3 soit installé sur votre machine.
Après avoir téléchargé le fichier La conjecture de Syracuse.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 ---
# --- La conjecture de Syracuse ---
# -*- coding: utf-8 -*-
# --- DÉFINITION DES FONCTIONS PERSONNALISEES ---
# --- Saisie et Controle de la validité du nombre de départ ---
def FNC_Saisie ( ) :
try :
kdebut = int ( input ( "Entrez le nombre entier, supérieur à 0, de départ ... " ) )
if kdebut < 1 : kdebut / 0 # pour provoque une erreur si le nombre est <1
except :
print( "\nERREUR DE SAISIES.\nVous n'avez pas saisi un nombre entier > 0.")
kdebut = False
return kdebut
# --- Analyse générale ---
def FNC_Calcul ( Q ) :
if Q % 2 == 0 :
kcalcul = int ( Q / 2 )
print ( f"{ Q } / 2 = { kcalcul }" )
else :
kcalcul = int ( ( Q * 3 ) + 1 )
print ( f"{ Q } * 3 + 1 = { kcalcul }" )
if kcalcul != 1 : FNC_Calcul ( kcalcul )
# --- PRESENTATION ---
print ( "LA CONJECTURE DE SYRACUSE." )
print ( )
# --- BOUCLE PRINCIPALE ---
while True :
# --- Saisie et Controle de la validité du nombre de départ ---
kdebut = FNC_Saisie ( )
if kdebut != False : FNC_Calcul ( kdebut )
# --- Choix du bouclage du programme ---
kchoix = input ( "Voulez-vous essayer un autre nombre (O ou N) ?" )
if kchoix.upper ( ) == "N" : break
# --- FIN DU PROGRAMME ---
print ( "Au revoir" )
# --- Programme : JFB ---
# --- Octobre 2025 ---
# --- Fin ---
Pour mieux comprendre l'exemple en PYTHON sans tkinter.
# --- Origine Nerd ---
# --- RETROGICIEL - TKINTER ---
# --- La conjecture de Syracuse ---
# -*- coding: utf-8 -*-
# --- IMPORTATION DES MODULES ---
# --- Modules de la bibliothèque standard ---
import tkinter , tkinter.simpledialog
# --- DÉFINITION DES FONCTIONS PERSONNALISEES ---
# --- Analyse générale ---
def FNC_Calcul ( Q ) :
if Q % 2 == 0 :
kcalcul = int ( Q / 2 )
BOX_Nombres.insert ( "end" , f"{ Q } / 2 = { kcalcul }" )
else :
kcalcul = int ( ( Q * 3 ) + 1 )
BOX_Nombres.insert ( "end" , f"{ Q } * 3 + 1 = { kcalcul }" )
if kcalcul != 1 : FNC_Calcul ( kcalcul )
# --- Saisie du nombre de départ ---
def FNC_Saisir ( ) :
ktitre = "Saisie du nombre de départ."
kmessage = "Entrez le nombre\nentier de départ"
kdepart = tkinter.simpledialog.askinteger ( title = ktitre , prompt = kmessage , minvalue = 1 )
BOX_Nombres.delete ( 0 , "end" )
if kdepart != None : FNC_Calcul ( kdepart )
# --- CREATION DE L'INTERFACE GRAPHIQUE ---
# --- Création de la fenêtre principale ---
TKI_Principal = tkinter.Tk ( )
TKI_Principal.title ( "RETROGICIEL - La conjecture de Syracusel" )
# --- Création des controles nommées ---
BAR_Vertical = tkinter.Scrollbar ( TKI_Principal )
BOX_Nombres = 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 )
# --- Mise en place des controles (anonymes et nommés) dans la fenêtre principale ---
BOX_Nombres.grid ( row = 1 , column = 0 , sticky = "nesw" )
BAR_Vertical.grid ( row = 1 , column = 1 , sticky = "nesw" )
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_Nombres [ "yscrollcommand" ] = BAR_Vertical.set
BAR_Vertical [ "command" ] = BOX_Nombres.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 ---
' --- La conjecture de Syracuse ---
' --- DEBUT DU PROGRAMME ---
PRINT "LA CONJECTURE DE SYRACUSE."
' --- BOUCLE PRINCIPALE ---
DO
' --- Saisie du nombre de depart ---
INPUT "Entrez le nombre entier, superieur a 0, de depart ... "; kdebut~&
' --- Controle la validite de la saisie ---
IF kdebut~& > 0 THEN FNC_Calcul (kdebut~&) ELSE PRINT "Erreur de saisie !"
' --- Bouclage du programme ---
INPUT "Voulez-vous recommencer [ O ou N ] "; kchoix$
LOOP UNTIL UCASE$(kchoix$) = "N"
' --- FIN DU PROGRAMME ---
PRINT "Au revoir."
END
' --- DEFINITION DES FONCTIONS PERSONNALISEES ---
' --- Analyse generale ---
SUB FNC_Calcul (Q~&)
kligne = 0
DO
PRINT STR$(Q~&);
IF Q~& MOD 2 = 0 THEN
Q~& = Q~& / 2
PRINT " / 2 =";
ELSE
Q~& = (Q~& * 3) + 1
PRINT " * 3 + 1 =";
END IF
PRINT STR$(Q~&)
kligne = kligne + 1
IF kligne MOD 20 = 19 THEN FNC_Pause
LOOP UNTIL Q~& = 1
END SUB
' --- Pause si l'ecran est plein ---
SUB FNC_Pause
PRINT "Appuyez sur une touche pour continuer ... "
SLEEP: kpause$ = INKEY$
CLS
END SUB
' --- Programme : JFB ---
' --- Octobre 2025 ---
' --- Fin ---
Pour mieux comprendre l'exemple en QB64.
REM --- Origine Nerd propose pour ---
REM --- RETROGICIEL - BBC BASIC ---
REM --- La conjecture de Syracuse ---
REM --- DEBUT DU PROGRAMME ---
PRINT "LA CONJECTURE DE SYRACUSE."
REM --- BOUCLE PRINCIPALE ---
REPEAT
REM --- Saisie du nombre de depart ---
INPUT "Entrez le nombre entier, superieur a 0, de depart ... "; kdebut%%
REM --- Controle la validite de la saisie ---
IF kdebut%% > 0 THEN PROC_Calcul(kdebut%%) ELSE PRINT "Erreur de saisie !"
REM --- Bouclage du programme ---
INPUT "Voulez-vous recommencer [ O ou N ] "; kchoix$
CLS
UNTIL kchoix$ = "N" OR kchoix$ = "n"
REM --- FIN DU PROGRAMME ---
PRINT "Au revoir."
END
REM --- DEFINITION DES FONCTIONS PERSONNALISEES ---
REM --- Calculs récursifs pour la suite demandée ---
DEF PROC_Calcul(Q%%)
VDU 14 : PRINT "Cliqez avec la souris pour faire defiler les lignes suivantes ..."
REPEAT
PRINT STR$(Q%%);
IF Q%% MOD 2 = 0 THEN
Q%% = Q%% / 2
PRINT " / 2 = "; STR$(Q%%)
ELSE
Q%% = (Q%% * 3) + 1
PRINT " * 3 + 1 = "; STR$(Q%%)
ENDIF
UNTIL Q%% = 1
VDU 15
ENDPROC
REM --- Programme : JFB ---
REM --- Octobre 2025 ---
REM --- Fin ---
Pour mieux comprendre l'exemple en BBC BASIC.