+ enum Solution {\r
+ A, // (1 0)\r
+ B, // (-1/2 sqrt(3)/2)\r
+ C // (-1/2 -sqrt(3)/2)\r
+ };\r
+\r
+ /*\r
+ * Renvoie la valeur (x1, x2) de l'itération suivante (i+1).\r
+ */\r
+ __device__\r
+ static void nextX(float x1, float x2, float& x1_next, float& x2_next)\r
+ {\r
+ float f_x1 = powf(x1, 3.0) - 3.0 * x1 * powf(x2, 2.0) - 1.0;\r
+ float f_x2 = powf(x2, 3.0) - 3.0 * powf(x1, 2.0) * x2;\r
+\r
+ // La matrice est représentée comme cela :\r
+ // a b\r
+ // c d\r
+ float jacobienne_f_x_a = 3.0 * powf(x1, 2.0) - 3.0 * powf(x2, 2.0);\r
+ float jacobienne_f_x_b = -6.0 * x1 * x2;\r
+ float jacobienne_f_x_c = -6.0 * x1 * x2;\r
+ float jacobienne_f_x_d = -3.0 * powf(x1, 2.0) + 3.0 * powf(x2, 2.0);\r
+\r
+ float det_inverse_jacobienne = 1.0 / (jacobienne_f_x_a * jacobienne_f_x_d - jacobienne_f_x_b * jacobienne_f_x_c);\r
+ float jacobienne_f_x_a_inverse = jacobienne_f_x_d * det_inverse_jacobienne;\r
+ float jacobienne_f_x_b_inverse = -jacobienne_f_x_b * det_inverse_jacobienne;\r
+ float jacobienne_f_x_c_inverse = -jacobienne_f_x_c * det_inverse_jacobienne;\r
+ float jacobienne_f_x_d_inverse = jacobienne_f_x_a * det_inverse_jacobienne;\r
+\r
+ x1_next = x1 - (jacobienne_f_x_a_inverse * f_x1 + jacobienne_f_x_b_inverse * f_x2);\r
+ x2_next = x2 - (jacobienne_f_x_c_inverse * f_x1 + jacobienne_f_x_d_inverse * f_x2);\r
+ }\r
+\r
+ /*\r
+ * Renvoie la distance entre deux vecteurs a et b.\r
+ */\r
+ __device__\r
+ static float distance_carre(float a1, float a2, float b1, float b2)\r
+ {\r
+ return powf(a1 - b1, 2.0) + powf(a2 - b2, 2.0);\r
+ }\r
+\r
+ __device__\r
+ static float distance(float a1, float a2, float b1, float b2)\r
+ {\r
+ return (powf(a1 - b1, 2.0) + powf(a2 - b2, 2.0)) / (powf(b1, 2.0) + powf(b2, 2.0));\r
+ }\r
+\r