diff --git a/Makefile b/Makefile
index 4185748e7d759405db36cc91831996456b58da6c..9e02649a1f4c05fb7f95b0dae1ea4ad637a337fc 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ CC = gcc
 OPTIONS = -Wall -Wextra -O9
 MATH = -lm
 
-EXECUTABLE = TP1 TP2 TP3
+EXECUTABLE = TP1 TP2 TP3 TP4
 
 
 all: $(EXECUTABLE)
@@ -23,6 +23,8 @@ TP2: TP2.o struct_tp2.o
 
 TP3: TP3.o
 
+TP4: TP4.o
+
 
 
 TP1.o: implems.c
diff --git a/TP4.c b/TP4.c
new file mode 100644
index 0000000000000000000000000000000000000000..4be65d6ed3d9b79d16278d9a426748a13520a63b
--- /dev/null
+++ b/TP4.c
@@ -0,0 +1,70 @@
+#include "./implems.c"
+#include <stdio.h>
+#include <stdlib.h>
+
+// génère un entier aléatoire entre min et max inclue
+int randint_from(int min, int max)
+{
+    int range = (max - min);
+    return min + (rand() % (range + 1));
+}
+
+
+void Fisher_Yates(int *tab, int size) {
+	int tmp;
+	int rdm;
+	for (int i = size-1; i > 0; i--)
+	{
+		rdm = randint_from(0, i);
+		tmp = tab[i];
+		tab[i] = tab[rdm];
+		tab[rdm] = tmp;
+	}
+}
+
+
+
+
+
+
+int main(int argc, char **argv) {
+	if (argc < 2) {
+		printf("un argument est attendu\n");
+		return 1;
+	}
+
+
+
+	adjlist *g;
+	time_t t1, t2, t3;
+
+	// PARSING
+	t1=time(NULL);
+
+	printf("Reading edgelist from file %s\n",argv[1]);
+	g=al_readedgelist(argv[1]);
+	t3 = time(NULL);
+	// printf("- edge list time = %ldh%ldm%lds\n",(t3-t1)/3600,((t3-t1)%3600)/60,((t3-t1)%60));
+	printf("- edge list time = %I64dh%I64dm%I64ds\n",(t3-t1)/3600,((t3-t1)%3600)/60,((t3-t1)%60));
+
+	printf("Number of nodes: %lu\n",g->n);
+	printf("Number of edges: %lu\n",g->e);
+
+	printf("Building the adjacency list\n");
+	mkadjlist(g);
+
+	t2=time(NULL);
+
+	// printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
+	printf("- Overall time = %I64dh%I64dm%I64ds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
+
+	unsigned long a = 1;
+
+	printf("%I64i %I64i %I64i %i %li\n", sizeof(int), sizeof(unsigned long), sizeof(unsigned long long), RAND_MAX, a);
+
+
+	free_adjlist(g);
+	return 0;
+}
+
+