diff --git a/TD01/code/04-bases.py b/TD01/code/04-bases.py
deleted file mode 100644
index 12652e49dabfc5af5f65e54fd55b77215c052114..0000000000000000000000000000000000000000
--- a/TD01/code/04-bases.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Exemple 1 : moyenne
-# Calcul de la moyenne de deux entiers  
-
-a=input('Donner la valeur de a : ')
-b=input('Donner la valeur de b : ')
-print('la moyenne = ', (int(a) + int(b))/2)  # int(a) : conversion de 'a' en entier
-
-# Une seconde méthode : on convertit en lisant les valeurs en int
-a=int(input('Donner la valeur de a : '))
-b=int(input('Donner la valeur de b : '))
-print('la moyenne = ', (a+b)/2) 
-
-# Exemple 2 : racines carrées
-import math;
-
-a=int(input('Donner le coefficient a : '))
-b=int(input('Donner le coefficient b : '))
-c=int(input('Donner le coefficient c : ')) 
-
-if (a == 0):
-  if ( b != 0) :
-    print("Pas quadratique : racine simple x = ",-c/b)
-  else:
-    print("une blague ! ")
-else :
-  delta=b*b-4*a*c   #ou b**2
-  if(delta < 0) :
-    print("pas de racines reelles")
-  else :
-    assert(a != 0)     # Déjà vérifié mais pour  montrer  l'intérêt de "assert".
-    if(delta>0) :
-      x1 = (-b+math.sqrt(delta))/(2*a)
-      x2 = (-b-math.sqrt(delta))/(2*a)
-      print("x1 = ",x1)
-      print("x2 = ",x2)
-    else :
-        x1 = x2 = -b/(2*a)
-        print("racine double x1 = x2 = ",x1) 
\ No newline at end of file
diff --git a/TD01/code/05-fonctions.py b/TD01/code/05-fonctions.py
deleted file mode 100644
index 76267678416ac268d6a55863a93bf3698c63db87..0000000000000000000000000000000000000000
--- a/TD01/code/05-fonctions.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# 5 Introduction aux fonctions
-
-## Exemple : moyenne de deux entiers
-# Calcul de la moyenne de deux entiers par une fonction (de signature entier x entier -> reel)
-def moyenne(a,b):
-  return (a+b)/2             
-
-# --- Partie Principale ----
-a=input('Donner la valeur de a : ')
-b=input('Donner la valeur de b : ')
-print('la moyenne = ', moyenne(int(a),int(b))) 
\ No newline at end of file
diff --git a/TD01/code/05-fonctions_exercices.py b/TD01/code/05-fonctions_exercices.py
deleted file mode 100644
index 0be4025eee77488ccc7c28d2bd07072fb4cf1eef..0000000000000000000000000000000000000000
--- a/TD01/code/05-fonctions_exercices.py
+++ /dev/null
@@ -1,68 +0,0 @@
-## 5.2 Exercice : Racines d'une quadratique avec une fonction
-# Reprendre l'exemple du calcul des racines d'une équation de seconde degré
-# et placer les calculs dans la fonction {\tt quadratique(a, b, c)} qui
-# reçoit en paramètre les coefficients  {\it a,b} et {\it c} et renvoie les
-# racines de cette équation.
-
-from math import sqrt
-
-def quadratique(a, b, c):
-  if (a == 0):
-    if ( b != 0) :
-      return ("Pas quadratique : racine simple x "+str(-c/b))
-    else:
-      return ("une blague ! ")
-  else :
-    delta=b*b-4*a*c     #b*b OU b**2
-    if(delta < 0) :
-      return ("pas de racines réelles")
-    else :
-      if(delta>0) :             # Le test initial sur la valeur de "a"  montre son intérêt  ici.  
-          assert(a != 0)     # Pas utile mais on montre aux élèves l'intérêt de "assert".
-          x1=(-b+math.sqrt(delta))/(2*a)
-          x2=(-b-math.sqrt(delta))/(2*a)
-          return ("x1 = "+str(x1)+ " x2 = "+ str(x2))
-      else :   
-          x1 = x2 = -b/(2*a)
-          return ("racine double x1 = x2 = "+str(x1))  
-
-# La partie principale
-a=int(input('Donner le coefficient a : '))
-b=int(input('Donner le coefficient b : '))
-c=int(input('Donner le coefficient c : ')) 
-print(quadratique(a,b,c))      
-
-## 5.3 Exercice : Moyenne et écart type
-# Créer une liste de 100 nombres de la distribution N(16,2). 
-import random
-echantillon=[random.gauss(16,2) for n in range(100)]
-
-def moyenne_liste(liste):
-    return sum(liste)/len(liste)
-
-def variance(liste):
-    moy=moyenne_liste(liste)
-    return moyenne_liste([(x-moy)**2 for x in liste])
-
-# ---------- Partie Principale ----------
-# Pour tester nos calculs sans lire des entiers, on fait un tirage Normale
-echantillon=[random.gauss(16,2) for n in range(100)]
- 
-print("Moyenne = " , moyenne_liste(echantillon))
-print("Ecart type = " , variance(echantillon)**0.5)           # %*  {\color{magenta} $\sqrt{Var}$}  *)
-
-
-""" TRACE : 
-Moyenne =  15.92301989946788
-Ecart type =  1.9934234202474366
-"""
-
-# 5.4 Variante : Exercice (suite écart type)
-
-echantillon=[random.gauss(16,2) for n in range(100)]
-varia = moyenne([x**2 for x in echantillon])-moyenne(echantillon)**2
-print("De la seconde façon : ", varia**0.5)
-
-""" Trace :
-De la seconde façon :  1.8839867058987951 
-"""
diff --git a/TD01/code/06-script.py b/TD01/code/06-script.py
deleted file mode 100644
index 8af4da9adb789110606cc99ccd1cf58820da1274..0000000000000000000000000000000000000000
--- a/TD01/code/06-script.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# 6 Créer un script Python indépendant
-
-from racines import trinome;
-print(trinome(2.0, -4.0, 2.0))
-
-
-# --- Partie Principale ---------
-print(trinome(1.0, -3.0, 2.0))
-print(trinome(1.0, -2.0, 1.0))
-print(trinome(1.0, 1.0, 1.0)) 
-
-""" On obtient 
-(2, 1.0, 2.0)
-(1, 1.0)
-(0,)   """
-
diff --git a/TD01/code/09-modules.py b/TD01/code/09-modules.py
deleted file mode 100644
index c692833f46826a0cf7bca5972c554f84f68ce828..0000000000000000000000000000000000000000
--- a/TD01/code/09-modules.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Modules Python
-
-# import tel_module as mod1
-# import un_module as mod2
-# mod1.fonc(..)     #appel de la fonction fonc du tel_module
-# mod2.fonc(..)     #appel de la fonction homonyme du un_module
-
-# import tel_module
-# 
-# def ma_fonction():
-#       localname = tel_module.fonc
-#       foo = localname(bar)
-
-import scipy.stats as st
-st.nanmean()
-
-# Si vous obtenez le message
-# ModuleNotFoundError: No module named 'scipy'
-# ..vous devez installer le module avec la commande
-#
-# pip3 install scipy
-#
\ No newline at end of file
diff --git a/TD01/code/10-range.py b/TD01/code/10-range.py
deleted file mode 100644
index c692833f46826a0cf7bca5972c554f84f68ce828..0000000000000000000000000000000000000000
--- a/TD01/code/10-range.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Modules Python
-
-# import tel_module as mod1
-# import un_module as mod2
-# mod1.fonc(..)     #appel de la fonction fonc du tel_module
-# mod2.fonc(..)     #appel de la fonction homonyme du un_module
-
-# import tel_module
-# 
-# def ma_fonction():
-#       localname = tel_module.fonc
-#       foo = localname(bar)
-
-import scipy.stats as st
-st.nanmean()
-
-# Si vous obtenez le message
-# ModuleNotFoundError: No module named 'scipy'
-# ..vous devez installer le module avec la commande
-#
-# pip3 install scipy
-#
\ No newline at end of file
diff --git a/TD01/code/addition.py b/TD01/code/addition.py
index b2fcfda079ea637f4cbbb5b5bcfde6ae22ec657c..7bcc0fdaa90ddefdf70be2e2c7fce31175b7e9f8 100644
--- a/TD01/code/addition.py
+++ b/TD01/code/addition.py
@@ -1,2 +1,17 @@
 def addition(a, b):
-    return a + b
\ No newline at end of file
+    return a + b
+
+def addition_inf(*argv):
+    res = 0
+    for arg in argv:  
+        res += arg
+    return res
+
+if __name__=="__main__": 
+    assert addition(1, 2) == 3
+    assert not addition(1, 2) == 2
+
+    assert addition_inf(1, 1, 1) == 3
+    assert not addition_inf(1, 1, 1) == 2
+
+    assert addition_inf(1, 1, 1) == addition(1, 2)
\ No newline at end of file
diff --git a/TD01/code/chaines-valide.py b/TD01/code/chaines-valide.py
new file mode 100644
index 0000000000000000000000000000000000000000..0147ad7df28f5bccadf107f26f18380cadb77e99
--- /dev/null
+++ b/TD01/code/chaines-valide.py
@@ -0,0 +1,10 @@
+def valide(seq):
+    """Retourne True si séquence ADN."""
+    ret = len(seq) != 0
+    for c in seq:
+        ret = (ret and True) if (c in "atgc") else False
+    return ret
+
+if __name__=="__main__": 
+    assert valide("atgc")
+    assert not valide("atgcz")
diff --git a/TD01/code/file.py b/TD01/code/file.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b4906c58d0508de693f111c88c557ef604112a5
--- /dev/null
+++ b/TD01/code/file.py
@@ -0,0 +1,31 @@
+class File():
+    def __init__(self, values = []):
+        self.__values = []
+        for v in values:
+            self.ajoute(v)
+
+    def ajoute(self, v):
+        self.__values.append(v)
+        return v
+
+    def supprime(self):
+        v = self.__values.pop(0)
+        return v
+
+    def renvoie(self, critere = lambda x : True):
+        for v in self.__values:
+            if critere(v):
+                return v
+        return False
+
+    def affiche(self):
+        for v in self.__values:
+            print(v)
+
+    def taille(self): 
+        return len(self.__values)
+
+if __name__ == "__main__":
+    f = File()
+    for d in [1, 2, 3]:
+        f.ajoute(d)
diff --git a/TD01/code/graphe_sim.py b/TD01/code/graphe-sim.py
similarity index 50%
rename from TD01/code/graphe_sim.py
rename to TD01/code/graphe-sim.py
index 43ee0648d1385eb03331001bb005e9e3ad7b3fb4..384c5b4fbbd928751058ec0557ab12382c55dbcd 100644
--- a/TD01/code/graphe_sim.py
+++ b/TD01/code/graphe-sim.py
@@ -18,6 +18,39 @@ graph = {'A': ['B', 'C'],
   'F': ['C']
 }
 
+class Graphe(dict):
+    def __init__(self, liens, noeuds):
+        for v in liens:
+            self[v] = set()
+        for e in noeuds:
+            self.ajout_noeud(e)
+
+    def ajout_lien(self, lien):
+        self[lien[0]].add(lien[1])
+        self[lien[1]].add(lien[0])
+
+    def ajout_noeud(self, noeud):
+        self[noeud] = set()
+
+def simGraphe(mots):
+    d = {}
+    g = Graphe(mots, [])
+
+    for mot in mots:
+        for i in range(len(mot)):
+            groupe = mot[:i] + '_' + mot[i+1:]
+            if groupe in d:
+                d[groupe].append(mot)
+            else:
+                d[groupe] = [mot]
+
+    for groupe in d.keys():
+        for mot1 in d[groupe]:
+            for mot2 in d[groupe]:
+                if mot1 != mot2:
+                    g.ajout_lien([mot1, mot2])
+    return g
+
 def chemin(graphe, source, destination, visite=None):
 
     if source == destination:
diff --git a/TD01/code/lire_entier.py b/TD01/code/lire_entier.py
deleted file mode 100644
index 8c8a08e8ff4ce503402c15e11154cbecccb8de22..0000000000000000000000000000000000000000
--- a/TD01/code/lire_entier.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Exercice  : pair/impair
-# Lire un entier au clavier et décider (et afficher) s'il est pair ou impair.
-a=int(input('Donner un entier  positif : '))
-if (a%2 ==1):
-    print(a, " est impair")
-else :
-    print(a, " est pair")
diff --git a/TD01/code/liste_liee.py b/TD01/code/liste-liee.py
similarity index 100%
rename from TD01/code/liste_liee.py
rename to TD01/code/liste-liee.py
diff --git a/TD01/code/listes_lieee_test_boucle.py b/TD01/code/listes-liee-boucle.py
similarity index 100%
rename from TD01/code/listes_lieee_test_boucle.py
rename to TD01/code/listes-liee-boucle.py
diff --git a/TD01/code/moyenne.py b/TD01/code/moyenne.py
new file mode 100644
index 0000000000000000000000000000000000000000..cef6d9dc188cd88be2c2c6c38baeaa0601db0344
--- /dev/null
+++ b/TD01/code/moyenne.py
@@ -0,0 +1,10 @@
+# Calcul de la moyenne de deux entiers  
+
+a=input('Donner la valeur de a : ')
+b=input('Donner la valeur de b : ')
+print('la moyenne = ', (int(a) + int(b))/2)  # int(a) : conversion de 'a' en entier
+
+# Une seconde méthode : on convertit en lisant les valeurs en int
+a=int(input('Donner la valeur de a : '))
+b=int(input('Donner la valeur de b : '))
+print('la moyenne = ', (a+b)/2) 
diff --git a/TD01/code/parite.py b/TD01/code/parite.py
new file mode 100644
index 0000000000000000000000000000000000000000..e9296579e7157dacaa3036a6cabbc0c2b043278c
--- /dev/null
+++ b/TD01/code/parite.py
@@ -0,0 +1,18 @@
+def parite(a):
+    """ Lire un entier au clavier et décider (et afficher) s'il est pair ou impair. """
+    if (a%2 == 1):
+        print(a, " est impair")
+    else :
+        print(a, " est pair")
+
+if __name__=="__main__": 
+
+    while True:
+        try:
+            a = int(input('Donner un entier  positif : '))
+            parite(a)
+            break
+        except ValueError:
+            print("Ce n'est pas un nombre valide.. ré-essayer !")
+   
+    
\ No newline at end of file
diff --git a/TD01/code/pile.py b/TD01/code/pile.py
new file mode 100644
index 0000000000000000000000000000000000000000..f8d2c74c6816c2ee6e1a5af262baac8136ac1dd5
--- /dev/null
+++ b/TD01/code/pile.py
@@ -0,0 +1,25 @@
+class Pile():
+    def __init__(self, values = []):
+        self.__values = []
+        for v in values:
+            self.ajoute(v)
+
+    def ajoute(self, v):
+        self.__values.append(v)
+        return v
+
+    def supprime(self):
+        v = self.__values.pop()
+        return v
+
+    def affiche(self):
+        for v in self.__values:
+            print(v)
+
+    def taille(self): 
+        return len(self.__values)
+
+if __name__ == "__main__":
+    p = Pile()
+    for d in [1, 2, 3]:
+        p.ajoute(d)
diff --git a/TD01/code/racines.py b/TD01/code/racines.py
index fb23af6c0d9ee9a8b621cc84afa76c24d55d3089..ef69e2072efa87d7c3a17b5d59b9af87b3e508d5 100644
--- a/TD01/code/racines.py
+++ b/TD01/code/racines.py
@@ -1,8 +1,7 @@
-# Résolution équation quadratique 
-
 from math import sqrt;
 
 def trinome(a, b, c):
+    """ Résolution équation quadratique """
     delta = b**2 - 4*a*c
     if delta > 0.0:
         assert(a != 0)      
diff --git a/TD01/code/recherche-dico.py b/TD01/code/recherche-dico.py
new file mode 100644
index 0000000000000000000000000000000000000000..427a4bb84aa0a176de669abc9c0278e75481bfe9
--- /dev/null
+++ b/TD01/code/recherche-dico.py
@@ -0,0 +1,16 @@
+def recherche(element, liste):
+    a = 0
+    b = len(liste)-1
+
+    while a < b :
+        m = (a+b) //2
+        if liste[m] == element :
+            return m
+        elif liste[m] > element :
+            b = m-1
+        else :
+            a = m+1
+
+    return a
+
+print (recherche(3, [3, 1, 4, 2, 3]))
diff --git a/TD01/code/tas.py b/TD01/code/tas.py
new file mode 100644
index 0000000000000000000000000000000000000000..31f40d3a619983954961f490c5e3fce191b531c8
--- /dev/null
+++ b/TD01/code/tas.py
@@ -0,0 +1,62 @@
+class Tas():
+    def __init__(self):
+        self.__values = []
+
+    def push(self, value):
+        self.__values.append(value)
+
+    def peek(self, i): # pop sans suppression
+        return self.__values[i], i
+        
+    def fg(self, i):
+        left_i = 2 * i + 1
+        if left_i > len(self.__values):
+            return None, left_i
+        else:
+            return self.__values[left_i], left_i
+
+    def fd(self, i):
+        droite_i = 2 * i + 2
+        if droite_i > len(self.__values):
+            return None, droite_i
+        else:
+            return self.__values[droite_i], droite_i
+
+    def parent(self, i):
+        return self.__values[(i - 1) // 2]
+
+    def afficher(self):
+        return ' '.join(str(v) for v in self.__values)
+
+    def inserer(self, value):
+        self.push(value)
+        i = len(self.__values) - 1
+        while (i + 1) // 2 > 0:
+            if self.__values[i] < self.parent(i):
+                tmp = self.__values[i // 2]
+                self.__values[i // 2] = self.__values[i]
+                self.__values[i] = tmp
+            i = i // 2
+        
+    def supprimer(self, i):
+
+        v = self.__values.pop(i)
+        max_i = i
+        n = len(self.__values) - 1
+
+        while self.__values[i] > self.fg(i)[0] or self.__values[i] > self.fd(i)[0]:
+
+            max = self.__values[i]
+            
+            if i < n and max > self.fg(i)[0]:
+                max_i = 2 * i + 1
+
+            if i < n and max > self.fd(i)[0]:
+                max_i = 2 * i + 2
+
+            if max_i != i: 
+                self.__values[i], self.__values[max_i] = self.__values[max_i], self.__values[i]
+
+            i = max_i
+
+        return v
\ No newline at end of file
diff --git a/TD01/code/tirage-des.py b/TD01/code/tirage-des.py
new file mode 100644
index 0000000000000000000000000000000000000000..baaa98a3dde6ec130fc96b6c9be39cdc6aa134dd
--- /dev/null
+++ b/TD01/code/tirage-des.py
@@ -0,0 +1,26 @@
+from random import *
+
+effectifs=[0,0,0,0,0,0]
+# OU 
+# effectif=[0]*6
+for n in range(10000):
+    dice=randint(1,6)
+    effectifs[dice-1]+=1
+
+print(effectifs)
+
+#--> [1642, 1710, 1683, 1661, 1678, 1626]
+# Donner l'intervalle de confiance associé à ce résultat à 95%
+
+#Même chose avec 2 dés
+from random import *
+
+effectifs=[0]*11
+for n in range(10000):
+    de1=randint(1,6)
+    de2=randint(1,6)
+    twodice=de1+de2
+    effectifs[twodice-2]+=1
+
+print(effectifs)
+# --> [299, 540, 832, 1159, 1401, 1665, 1401, 1103, 787, 541, 272]
\ No newline at end of file
diff --git a/TD01/code/tirage-gaussienne.py b/TD01/code/tirage-gaussienne.py
new file mode 100644
index 0000000000000000000000000000000000000000..d456a089596fd937593038ece3d7b147925421c1
--- /dev/null
+++ b/TD01/code/tirage-gaussienne.py
@@ -0,0 +1,24 @@
+from math import *
+from random import *
+
+def tirage_gauss_centre_reduit():
+    x=uniform(0,1)
+    y=sqrt(-2*log(uniform(0,1)))
+    y = y*cos(x*2*pi)
+    return y 
+ 
+try :
+  n=int(input("combien de valeurs : "))
+  for i in range(n) :
+    print("Le tirage : ", tirage_gauss_centre_reduit())
+except ValueError as err :
+  print("Error: {0}".format(err))    
+
+""" TRACE :
+combien de valeurs : 5
+Le tirage :  0.1675459650607427
+Le tirage :  -0.8810297798592189
+Le tirage :  0.4764601603767129
+Le tirage :  -1.8446292482050937
+Le tirage :  -0.35483078367598453
+"""
\ No newline at end of file
diff --git a/TD01/code/tirage-random.py b/TD01/code/tirage-random.py
new file mode 100644
index 0000000000000000000000000000000000000000..a9fe23f763c2dbcfd2440f3ae5a22454fa3b7d01
--- /dev/null
+++ b/TD01/code/tirage-random.py
@@ -0,0 +1,19 @@
+# imports
+from random import seed, random
+
+# fonctions
+def listAleatoireFloat(n):
+    """Retourne une liste de <n> flottants aleatoires."""
+    return [random() for i in range(n)]
+
+# programme principal  
+n = int(input("Entrez un entier [2 .. 100] : "))
+while not (2 <= n <= 100): # saisie filtree
+    n = int(input("Entrez un entier [2 .. 100], s.v.p. : "))
+
+seed() # initialise le generateur de nombres aleatoires
+t = listAleatoireFloat(n) # construction de la liste
+
+print("Liste :", t)
+print("Amplitude : {:.2f}".format(max(t) - min(t)))
+print("Moyenne : {:.2f}".format(sum(t)/n))
\ No newline at end of file
diff --git a/TD01/code/tirage-remise.py b/TD01/code/tirage-remise.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f0163d8ad7459558f4aa9a4caa282d49347f13c
--- /dev/null
+++ b/TD01/code/tirage-remise.py
@@ -0,0 +1,26 @@
+from math import *
+from random import *
+
+# Simulation d'un tirage avec remise de k objets parmi n
+
+def tirage_uniforme_k_of_n_avec_remise(n,k):
+    if k > n :
+        raise ValueError("k (%d) doit être =< que n (%d) " % (k,n))
+    T=[x for x in range(1,n+1,1)]   # On constitue une urne avec p objets
+
+    for i in range(k) : # Tirage de k numéros
+            d=randint(1,n)
+            # On permute le d-ème élément de l'urne et la derniere
+            temp=T[d-1]
+            T[d-1]=T[n-1]
+            T[n-1]=temp
+            n=n-1
+    return T[n:n+k+1]
+    
+
+n=int(input("La valeur de n ? "))
+k=int(input("La valeur de k (parmi n) ? "))
+try :
+    print("Le tirage : ", tirage_uniforme_k_of_n_avec_remise(n,k))
+except ValueError as err :
+    print("Error: {0}".format(err))
\ No newline at end of file
diff --git a/TD01/code/tri-bulle.py b/TD01/code/tri-bulle.py
new file mode 100644
index 0000000000000000000000000000000000000000..2ca66e1e7313bf8f6829f56eb5fb7fc7c66b66e6
--- /dev/null
+++ b/TD01/code/tri-bulle.py
@@ -0,0 +1,12 @@
+def tri_bulle_iteratif(lst):
+    """ Tri par bulle """
+    taille = len(lst)
+    for i in range(taille-1) :
+        for j in range(i+1,  taille) :
+            if lst[i] > lst[j] :
+                lst[i] , lst[j] = lst[j] , lst[i]   # permutaion
+    return lst
+    
+liste=[1,3,13,4,7,2,9,2,18] 
+print(tri_bulle_iteratif(liste))
+# [1, 2, 2, 3, 4, 7, 9, 13, 18]
\ No newline at end of file
diff --git a/TD01/code/tri-fusion.py b/TD01/code/tri-fusion.py
new file mode 100644
index 0000000000000000000000000000000000000000..16664517dc4a66b01397415b7c95c53a7ac83320
--- /dev/null
+++ b/TD01/code/tri-fusion.py
@@ -0,0 +1,62 @@
+from random import seed, randint, shuffle
+
+def tri_split_merge(L) :
+    """ TRI SPLIT-MERGE avec 2 fonctions imbriquées """
+    def my_split(L) :
+        choix=True              # on met dans L1, sinon dans L2 
+        L1=[]; L2=[] ; N =len(L)
+        i=0
+        while i < N :
+            crt=L[i]
+            if choix : L1.append(crt)
+            else : L2.append(crt)
+            i +=1
+            # voyons si on a une séquence Descendante
+            while i < N and L[i] >= crt :
+                crt=L[i]
+                if choix : L1.append(crt)
+                else : L2.append(crt)
+                i +=1
+                
+            choix = not choix
+            
+        return(L1,L2)
+    
+    #---------------------  
+    def my_merge(L1,L2) :
+        N1=len(L1)
+        N2=len(L2)
+        L=[]; i,j=0,0
+        while(i < N1 and j < N2) :
+            if L1[i] <= L2[j] : 
+                L.append(L1[i]) 
+                i+=1
+            else :
+                L.append(L2[j]) 
+                j+=1
+        L.extend(L1[i:])    # Ajouter le reste de L1 (s'il y en a) à L
+        L.extend(L2[j:])    # Ajouter le reste de L2 (s'il y en a) à L
+        return L
+        
+    # Fonction tri_split_merge
+    while True :
+        (L1,L2) = my_split(L)
+        if (L2==[]) : break # Fini
+        L=my_merge(L1,L2)  
+    return L
+        
+# programme principal -----------------------------------------------
+seed() # initialise le generateur de nombres aleatoires
+N=10
+L = [randint(2, N*4) for i in range(N)] # construction de la liste
+print("Avant le tri, liste = {}".format(L))
+L=tri_split_merge(L)
+print("Après le tri, liste = {}".format(L))
+
+""" Deux Traces
+Avant le tri, liste = [9, 17, 12, 24, 36, 26, 35, 25, 5, 31]
+Après le tri, liste = [5, 9, 12, 17, 24, 25, 26, 31, 35, 36]
+
+Avant le tri, liste = [30, 14, 2, 11, 5, 15, 5, 21, 29, 31]
+Après le tri, liste = [2, 5, 5, 11, 14, 15, 21, 29, 30, 31]
+"""
\ No newline at end of file
diff --git a/TD01/code/tri-insertion.py b/TD01/code/tri-insertion.py
new file mode 100644
index 0000000000000000000000000000000000000000..0f8c880440bfc5750ddb2a36d8b1895d49a0fc4d
--- /dev/null
+++ b/TD01/code/tri-insertion.py
@@ -0,0 +1,34 @@
+from random import seed, randint
+
+        
+def tri_insertion_iter(T) :
+    def inserer_a_sa_place_iter(ind) : # insere le Ieme dans T[0:i]
+        save = T[ind]
+        i=ind
+        while (i>0 and T[i-1] > save) : 
+            T[i]=T[i-1]
+            i -= 1
+        T[i]=save
+        
+    if len(T) < 2 : return
+    for i in range(1,len(T)) :
+        inserer_a_sa_place_iter(i)  # insere le Ieme dans T[0:i]
+        
+# ------- Prog Princ
+seed()                                      # initialise le generateur de nombres aleatoires
+N=10
+T = [randint(2, 3*N) for i in range(N)]     # construction de la liste
+print("Avant le tri, liste = {}".format(T))
+TT=[]                                       # Avant d'utiliser TT, il faut la faire exister !
+TT[:]=T[:]
+tri_insertion_iter(T)
+TT.sort()
+if (T == TT) :
+    print("Après le tri, liste = {}".format(T))
+else :
+    print("ERREUR !!, T={}, TT={}".format(T,TT)) 
+
+""" TRACE :
+Avant le tri, liste = [14, 11, 24, 24, 27, 14, 30, 22, 22, 17]
+Après le tri, liste = [11, 14, 14, 17, 22, 22, 24, 24, 27, 30]
+"""
\ No newline at end of file
diff --git a/TD01/code/tri_rapide.py b/TD01/code/tri-rapide.py
similarity index 72%
rename from TD01/code/tri_rapide.py
rename to TD01/code/tri-rapide.py
index 48ed21ca20232b6c8366ee3fef704543db26b863..c3e7230dcc9f5da46ea466c941a810a2d2307c9b 100644
--- a/TD01/code/tri_rapide.py
+++ b/TD01/code/tri-rapide.py
@@ -6,10 +6,12 @@ def quicksort(t):
     t1 = []
     t2 = []
     for x in t[1:]:
-        if x<pivot:
+        print(x, pivot)
+        if x < pivot:
             t1.append(x)
         else:
             t2.append(x)
         return quicksort(t1) + [pivot] + quicksort(t2)
 
-quicksort([1,4, 5])
\ No newline at end of file
+if __name__=="__main__": 
+    quicksort([1 ,4, 5])
\ No newline at end of file
diff --git a/TD01/code/tri_fusion.py b/TD01/code/tri_fusion.py
deleted file mode 100644
index e4bdb86721ad39651ee67f4c0aadafaa1c55e788..0000000000000000000000000000000000000000
--- a/TD01/code/tri_fusion.py
+++ /dev/null
@@ -1,31 +0,0 @@
-def mergeSort(arr): 
-    if len(arr) >1: 
-        mid = len(arr)//2 #Finding the mid of the array 
-        L = arr[:mid] # Dividing the array elements  
-        R = arr[mid:] # into 2 halves 
-  
-        mergeSort(L) # Sorting the first half 
-        mergeSort(R) # Sorting the second half 
-  
-        i = j = k = 0
-          
-        # Copy data to temp arrays L[] and R[] 
-        while i < len(L) and j < len(R): 
-            if L[i] < R[j]: 
-                arr[k] = L[i] 
-                i+=1
-            else: 
-                arr[k] = R[j] 
-                j+=1
-            k+=1
-          
-        # Checking if any element was left 
-        while i < len(L): 
-            arr[k] = L[i] 
-            i+=1
-            k+=1
-          
-        while j < len(R): 
-            arr[k] = R[j] 
-            j+=1
-            k+=1
\ No newline at end of file
diff --git a/TD01/code/util-commentaires.py b/TD01/code/util-commentaires.py
new file mode 100644
index 0000000000000000000000000000000000000000..0c574e7bea0939dbf4c532a1059a0ee4538fe53a
--- /dev/null
+++ b/TD01/code/util-commentaires.py
@@ -0,0 +1,15 @@
+# Un commentaire court commence par un # et se limite à la fin de la ligne
+
+"""
+On peut aussi créer un commentaire long = une zone de 
+commentaires  sur plusieurs lignes placées
+entre une paire de triple-guillements dont le second suit :
+"""
+
+# Remarques : 
+# Un ';' à la fin d'une ligne rend la ligne muette (pas d'affichage des résultats). 
+# Il permet également de placer plusieurs expressions sur la même ligne.
+
+# Si vous placez un commentaire immédiatement après la signature d'une fonction} 
+# (ou une méthode, une classe, etc.) entre un couple de  """, 
+# votre commentaire (appelé docstring) devient accessible avec help
\ No newline at end of file
diff --git a/TD01/code/08-conversion.py b/TD01/code/util-types-conversion.py
similarity index 100%
rename from TD01/code/08-conversion.py
rename to TD01/code/util-types-conversion.py
diff --git a/TD01/code/07-types.py b/TD01/code/util-types.py
similarity index 100%
rename from TD01/code/07-types.py
rename to TD01/code/util-types.py
diff --git a/TD01/code/test_version_python.py b/TD01/code/util-version-python.py
similarity index 100%
rename from TD01/code/test_version_python.py
rename to TD01/code/util-version-python.py
diff --git a/TD01/code/zip-codes-romain.py b/TD01/code/zip-codes-romain.py
new file mode 100644
index 0000000000000000000000000000000000000000..24f75cf9779dad80c57c874493215a941049dc02
--- /dev/null
+++ b/TD01/code/zip-codes-romain.py
@@ -0,0 +1,14 @@
+code = zip([1000,900 ,500,400 ,100,90 ,50 ,40 ,10 ,9 ,5 ,4 ,1], ["M" ,"CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"])
+
+# fonctions
+def zipConversionRomain(num):
+    res = []
+    for d, r in code:
+        while num >= d:
+            res.append(r)
+            num -= d
+    return ''.join(res)
+
+# programme principal -----------------------------------------------
+for i in range(1, 15):
+    print(i, zipConversionRomain(i))
\ No newline at end of file