diff --git a/prog b/prog
index feabe8ff3336cc1eeb87e8a89fcb0e99747d551c..9159202eeeb315f955a6a4693c39bc4338a14a99 100755
Binary files a/prog and b/prog differ
diff --git a/src/main.c b/src/main.c
index b351ff45275d27e1599340d13d07fa8971fd727b..c5c205161f7a7f0e28c72d53ce68dfef622ce262 100644
--- a/src/main.c
+++ b/src/main.c
@@ -62,9 +62,22 @@ int main() {
   p = descenteGradient(0.000001,drtTest,vecTest2);
   printf("Sol Numérique Test 2 : a: %f b: %f\n",p.x,p.y);
 
+  printf("Test validation croisée\n");
+  vector ve1 = nuagePoints(drtTest, 100, 0, 100);
+  vector ve2 = nuagePoints(drtTest, 100, 0, 100);
+  vector ve3 = nuagePoints(drtTest, 100, 0, 100);
+  double* lol = validationCroisee(drtTest,ve1,ve2,ve3);
+  for(int i=0;i<3;i++){
+    printf("Erreurs : %f\n",lol[i]);
+  }
+
   vector_free(&v);
   vector_free(&vecTest);
   vector_free(&vecTest2);
+  vector_free(&ve1);
+  vector_free(&ve2);
+  vector_free(&ve3);
+  free(lol);
 
   return EXIT_SUCCESS;
 }
diff --git a/src/main.o b/src/main.o
index 24e9ab30a24c2b2fd28d17d9e6679a842c7a8569..8f898864a0b00b0d9e187f86ae82ef4ad35f40e7 100644
Binary files a/src/main.o and b/src/main.o differ
diff --git a/src/regressionLin.c b/src/regressionLin.c
index c0a6dd18a39abfce064958936508fccdb5207854..60301ef7d7c5bb00f6d40b1a29a4946d9a40f943 100644
--- a/src/regressionLin.c
+++ b/src/regressionLin.c
@@ -74,16 +74,64 @@ vector nuagePoints(point drt, int len, int minP, int maxP){
   point add;
   // Il faut prend drt proche de la solution Analytique
   for(int i = 0; i < len; i++){
-      // Le bruit doit être entre -1 et 1 par ex. => ici il est entre -0.5 et 0.5
-      bruit = ((double) rand()*(1)/(double)RAND_MAX-(0.5));
+    // Le bruit doit être entre -1 et 1 par ex. => ici il est entre -0.5 et 0.5
+    bruit = ((double) rand()*(1)/(double)RAND_MAX-(0.5));
     //  printf("%f\n",bruit);
-      add.x = ((double) rand()*(maxP-minP)/(double)RAND_MAX-minP);
-      add.y = drt.x * add.x + drt.y + bruit;
-      vector_push(&vec,add);
+    add.x = ((double) rand()*(maxP-minP)/(double)RAND_MAX-minP);
+    add.y = drt.x * add.x + drt.y + bruit;
+    vector_push(&vec,add);
   }
   return vec;
 }
 
-void validationCroisee(){
+double* validationCroisee(point drtTest, vector g1, vector g2, vector g3){
 
+  double* erreurs = malloc(sizeof(double)*3);
+
+  vector g1g2;
+  vector_concat(&g1g2,g1,g2);
+  // Calculer la descenteGradient sur g1g2
+  point p1u2 = descenteGradient(0.000001,drtTest,g1g2);
+  // Test sur g3 => point 2.1 de l'Analytique avec a et b les valeurs retournée sur p1u2
+  erreurs[0] = 0;
+  // On trouve le carré de l'erreur pour chaque point
+  for(int i = 0; i< g3.length; i++){
+    erreurs[0] += pow(p1u2.x * g3.content[i].x + p1u2.y - g3.content[i].y,2);
+  }
+  // La valeur pour chaque points
+  erreurs[0] = sqrt(erreurs[0])/g3.length;
+  // free
+  vector_free(&g1g2);
+
+
+  vector g1g3;
+  vector_concat(&g1g3,g1,g3);
+  // Calculer la descenteGradient sur g1g3
+  point p1u3 = descenteGradient(0.000001,drtTest,g1g3);
+  // test sur g2
+  erreurs[1] = 0;
+  for(int i = 0; i< g2.length; i++){
+    erreurs[1] += pow(p1u3.x * g2.content[i].x + p1u3.y - g2.content[i].y,2);
+  }
+  // La valeur pour chaque points
+  erreurs[1] = sqrt(erreurs[1])/g2.length;
+  // free
+  vector_free(&g1g3);
+
+
+  vector g2g3;
+  vector_concat(&g2g3,g2,g3);
+  // Calculer la descenteGradient sur g2g3
+  point p2u3 = descenteGradient(0.000001,drtTest,g2g3);
+  // Test sur g1
+  erreurs[2] = 0;
+  for(int i = 0; i< g1.length; i++){
+    erreurs[2] += pow(p2u3.x * g1.content[i].x + p2u3.y - g1.content[i].y,2);
+  }
+  // La valeur pour chaque points
+  erreurs[2] = sqrt(erreurs[2])/g1.length;
+  // free
+  vector_free(&g2g3);
+
+  return erreurs;
 }
diff --git a/src/regressionLin.h b/src/regressionLin.h
index bf9c0d075083adf032456f61331e316cb65fbce3..bff79dea94d7e7475bbc68200d4ca4e3993137c2 100644
--- a/src/regressionLin.h
+++ b/src/regressionLin.h
@@ -19,6 +19,6 @@ point descenteGradient(double precision, point drt, vector pts);
 // Tests
 vector nuagePoints(point drt, int len, int minP, int maxP);
 
-void validationCroisee();
+double* validationCroisee(point drt, vector g1, vector g2, vector g3);
 
 #endif
diff --git a/src/regressionLin.o b/src/regressionLin.o
index c827e0018c5f7c15d79f3f39add6147ac78718c5..35e112910b6cce4d4dcd45d796793159a0f300a3 100644
Binary files a/src/regressionLin.o and b/src/regressionLin.o differ
diff --git a/src/vector.c b/src/vector.c
index 4f02bab8ef3bbdf5b37a45593f9e58fd387b1bf8..4bc6e0f98a048fae24876667d51f27ed3a1f71a7 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -164,3 +164,17 @@ error_code vector_empty(vector *v){
   }
   return error;
 }
+
+error_code vector_concat(vector* v1,vector v2, vector v3){
+  vector_init(v1);
+  error_code error =uninitialized;
+  for(int i=0;i < (v2.length + v3.length); i++){
+    if(i<v2.length){
+      vector_push(v1,v2.content[i]);
+    }else{
+      vector_push(v1,v3.content[i-v2.length]);
+    }
+  }
+  error = ok;
+  return error;
+}
diff --git a/src/vector.h b/src/vector.h
index 829019f27602da9b93b692c74e2296c0fa61d076..5866d4c036d4f1d19be5f0f1eac72518f42060b8 100644
--- a/src/vector.h
+++ b/src/vector.h
@@ -60,5 +60,6 @@ error_code vector_map(vector *v, type (*f)(type), vector *rhs);
 
 error_code vector_filter(vector *v, bool (*f)(type), vector *rhs);
 
+error_code vector_concat(vector* v1,vector v2, vector v3);
 
 #endif
diff --git a/src/vector.o b/src/vector.o
index 975b949e63c195d145badfa60e030d4dd1ef599c..9dcdb2a81c35d2106b00e1a3a2b8f88edece5d8b 100644
Binary files a/src/vector.o and b/src/vector.o differ