def Ex1Chapitre2_3(A, B, C):
    """Provides the correction to exercise 1 of notebook 2_3

    :param A: original matrix
    :type A: list[list] or numpy.ndarray
    :param B: matrix such that A+B should be diagonal
    :type B: list[list] or numpy.ndarray
    :param C: matrix such that A+C should be symmetric and not diagonal
    :type C: list[list] or numpy.ndarray
    :return:
    :rtype:
    """

    if not type(A) is np.ndarray:
        A = np.array(A)
    if not type(B) is np.ndarray:
        B = np.array(B)
    if not type(C) is np.ndarray:
        C = np.array(C)

    ans1 = isDiag(A + B)
    ans2 = isSym(A + C) and not isDiag(A + C)

    if ans1 and ans2:
        display(Latex('Correcte!'))
    else:
        display(
            Latex(
                'Incorrect! Entrez des nouvelles valeurs pur le matrices B et C!\n'
            ))

    if ans1:
        display(Latex("A+B est bien diagonale!"))
    else:
        display(Latex("A+B est n'est pas diagonale!"))
    texAB = '$' + texMatrix(A + B) + '$'
    display(Latex(r"A+B=" + texAB))

    if ans2:
        display(Latex("A+C est bien symétrique et non diagonale!"))
    elif isSym(A + C) and isDiag(A + C):
        display(
            Latex("A+C est bien symétrique mais elle est aussi diagonale!"))
    else:
        display(Latex("A + C n'est pas symétrique"))
    texAC = '$' + texMatrix(A + C) + '$'
    display(Latex(r"A+C=" + texAC))

    return
 def correction(a, b, c, d):
     if c and not (a) and not (d) and not (b):
         display(
             Latex(
                 "C'est correct! Par exemple, si on applique le produit à la matrice ci-dessous"
             ))
         A = [[1, -1, 0, 0], [0, 0, 0, 1], [1, 2, 1, 2], [1, 0, 0, 1]]
         B = [[1, 0, 0, 0], [0, 1, 0, -6], [0, 0, 1, 0], [0, 0, 0, 1]]
         C = [[0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]]
         BCA = np.linalg.multi_dot([B, C, A])
         texA = '$' + texMatrix(A) + '$'
         texBCA = '$' + texMatrix(BCA) + '$'
         display(Latex('$\qquad A = $' + texA))
         display(Latex("on obtient"))
         display((Latex('$\qquad \hat{A} = $' + texBCA)))
     else:
         display(Latex("C'est faux."))
 def correction(a, b, c, d):
     if c and not a and not b and not d:
         A = [[14], [6]]
         texA = '$' + texMatrix(A) + '$'
         display(
             Latex(r"C'est correct! Le produit $ AB$ vaut: $AB$ = " + texA))
     else:
         display(Latex("C'est faux."))
 def correction(a, b, c, d):
     if d and not a and not c and not b:
         A = np.array(([-1, 0, 0], [3, 1 / 2, 0], [1, 2, 1]))
         res = np.transpose(np.linalg.inv(A))
         texAres = '$' + texMatrix(res) + '$'
         display(
             Latex("C'est correct! $(A^T)^{-1}$ est donnée par: $\quad$" +
                   texAres))
     else:
         display(Latex("C'est faux."))
    def f():
        A = np.array([[-1, 2], [5, -2]])
        B = np.array([[-1, 1], [a.value, b.value]])

        AB = np.dot(A, B)
        texAB = '$' + texMatrix(AB) + '$'
        BA = np.dot(B, A)
        texBA = '$' + texMatrix(BA) + '$'

        if a.value == 5 / 2 and b.value == -3 / 2:
            display(
                Latex(r"Correct! Le produits $AB$ et $BA$ valent chacun: " +
                      texAB))
        else:
            display(
                Latex(r"Incorrect! Le produit $AB$ vaut " + texAB +
                      r"et par contre le produit "
                      r"$BA$ vaut " + texBA +
                      r". Entrez de nouvelles valeurs!"))
 def correction(a, b, c):
     if a and not b and not c:
         A1 = np.array([[2, 0, 1], [0, 6, 4], [2, 2, 1]])
         A1_inv = np.linalg.inv(A1)
         texA1inv = '$' + texMatrix(A1_inv) + '$'
         display(
             Latex(
                 "C'est correct! $A_1$ est la seule matrice inversible et son inverse est: $\quad A_1^{-1} = $"
                 + texA1inv))
     else:
         display(Latex("C'est faux."))
    def f():
        A = np.array([[0.5, a.value, 1], [0, 2, -1], [-2, 1, b.value]])
        B = np.array([[-6, -2, -2], [4, 2, 1], [8, 3, 2]])

        AB = np.dot(A, B)
        texAB = '$' + texMatrix(AB) + '$'
        BA = np.dot(B, A)
        texBA = '$' + texMatrix(BA) + '$'

        if a.value == -1 and b.value == -2:
            display(
                Latex(
                    r"Correct! Le produits $AB$ et $BA$ valent chacun: $I$ = "
                    + texAB))
        else:
            display(
                Latex(r"Incorrect! Le produit $AB$ vaut  " + texAB +
                      r" et le produit "
                      r"$BA$ vaut  " + texBA +
                      r",  donc $A$ ne peut pas être l'inverse de $B$. "
                      r"Entrez de nouvelles valeurs!"))
def Ex2aChapitre2_5(A, B, T, D, L):
    """Provides the correction to exercise 2a of notebook 2_5

    :param A: starting matrix
    :type A: list[list]
    :param B: target matrix
    :type B: list[list]
    :param T: permutation (type I) matrix
    :type T: list[list]
    :param D: scalar multiplication (type II) matrix
    :type D: list[list]
    :param L: linear combination (type III) matrix
    :type L: list[list]
    """

    if ~(B - np.linalg.multi_dot([L, D, T, A])).any():
        display(Latex("C'est correct!"))
    else:
        display(Latex("C'est faux."))
        str = 'Il faut entrer la/les matrice(s) {'
        if (np.asmatrix(T) -
                np.asmatrix([[0, 0, 1], [0, 1, 0], [1, 0, 0]])).any():
            str = str + ' T, '
        if (np.asmatrix(D) -
                np.asmatrix([[1, 0, 0], [0, 1, 0], [0, 0, 5]])).any():
            str = str + ' D, '
        if (np.asmatrix(L) -
                np.asmatrix([[1, 0, 0], [-4, 1, 0], [0, 0, 1]])).any():
            str = str + ' L, '
        str = str + '}. Le produit des matrices entrées vaut:'
        display(Latex(str))
        tmp = np.linalg.multi_dot([L, D, T, A])
        texM = '$' + texMatrix(tmp) + '$'
        display(Latex('$\qquad \hat{B} = $' + texM))

    return