"""
Thème 11 : diagonalisation des matrices carrées

16/12/25

"""

## Importations
import numpy as np
import numpy.linalg as la


## Q1

# on utilise CH10-Prop1.2.

def dimKer(M):
    n,p = M.shape
    r = la.matrix_rank(M)
    return n-r

# Essais :
# une matrice de rang(1)
A = np.ones([3,3])
print(dimKer(A))
# une matrice inversible
I = np.eye(3)
print(dimKer(I))


## Q2

def dimE(A,mu):
    # utilsie le fait que E_mu = Ker(A-muI)
    # et la fonction dimKer de Q1
    n,p = A.shape
    Amu = A-mu*np.eye(n)
    return dimKer(Amu)

## Q3

# on utilise Thm3.3

def est_diago(A,L):
    # on utilise thm3 3. de CH10 :
    # - on calcule la somme  S des dimensions des sev propres (boucle)
    # - on compare la valeur de S à n = nb de lignes de A
    n,p=A.shape
    S = 0        # initialisation de S
    for vp in L:
        S+=dimE(A,vp)
    return S >=n

## Q4

# Plusieurs abus :
# 1. si M n'est pas diagonalisable,
# la juxtaposition de bases des sev propres ne donne pas une matrice P
# inversible, donc on ne peut  qualifier P de matrice de  passage.
#
# 2. Et quand bien même P serait inversible,elle n'est pas unique car
# les bases de vecteurs propres de chaque  sev propres ne sont pas
# uniques.

## Q5

def spectre(M):
    Lvp, P = la.eig(M)
    L =[]
    for elem in Lvp:
        if not elem in L:
            L.append(elem)
    return L

## Q6

# J est triangulaire, donc ses vp sont ses coeffs
# diagonaux. D'où Sp(J)={0}
# Si J était diago, la somme des dimensions des sev
# propres de J vaudrait 3. Or, il y un seul sev
# propre, qui est Ker J. Mais clairement dim Ker J=1
# (puisque rg J = 2 visiblement)
# J IS NOT DIAGONALIZABLE



