• Aucun résultat trouvé

Partie IV. Implémentation logicielle

7.1.1 Méthodes de calcul du chirotope, des cocircuits et des circuits

Nous avons vu dans le Chapitre 2 que l’on pouvait caractériser un matroïde orienté par son chirotope, par l’ensemble de ses cocircuits ou par l’ensemble de ses circuits. Les calculs sont réalisés à partir de l’ensemble des vecteurs (notésV ) associés aux points. La première étape du programme est donc d’obtenir la matrice des coordonnées des vecteurs deV en ajoutant une ligne de 1 à cette matrice pour obtenir celle des coordonnées des vecteurs. La matrice des coordonnées des vecteurs deV est donc de dimension (d + 1) × n.

Calcul du chirotope

Algorithme 7.1 : Calcul des chirotopes

Entrée : La matrice des coordonnées des vecteurs deV Sortie : Le chirotopeχ écrit sous forme d’un vecteur Initialiserχ à un vecteur nulle de taille ¡d+1n ¢;

Initialiser k à 0;

pour tous les (d +1)-uplets {vi1, . . . , vid +1} de vecteurs deV faire

Ecrire la matrice M at = (vi1 . . . vid +1) ; Calculer d et (M at );

χk= det (M at );

k = k + 1;

Le chirotope d’un matroïde orienté associé à une configuration de points est un vecteur de signes appartenant à {−,0,+} de taille¡ n

d+1¢. Chaque signe correspond à un (d +1)-uplet de V et est

égal au signe du déterminant d’une matrice (d + 1) × (d + 1) dont les colonnes sont les coordonnés des d + 1 vecteurs.

Pour calculer le chirotope, on utilise l’Algorithme 7.1 en prenant tous les (d+1)-uplets de V dans l’ordre lexicographique.

Calcul des cocircuits

Algorithme 7.2 : Calcul des cocircuits

Entrée : La matrice des coordonnées des vecteurs deV Sortie : La liste l de tous les cocircuits

Initialiser l à la liste vide;

pour tous les d -uplets {vi1, . . . , vid} de vecteurs deV faire

Ecrire la matrice M = (vi1 . . . vid) ;

Calculer r ang (M ); si le rang est égal à d alors

Initialiser C∗à la liste vide;

pour tous les vecteurs vjdeV faire

Ecrire la matrice M at = (vj vi1 . . . vid) ;

Calculer d et (M at );

Ajouter le signe du déterminant à la liste C∗; Ajouter Cà la liste l ;

Le calcul des cocircuits d’un matroïde orienté est un peu plus délicat. Nous allons donc détailler l’Algorithme 7.2. Pour calculer un cocircuit, on doit trouver un hyperplan (c’est-à-dire d vecteurs de V qui sont linéairement indépendants) avant de regarder dans quel demi-espace se trouve chaque vecteur deV . Pour savoir si d vecteurs forment un hyperplan, une méthode est d’écrire la matrice dans laquelle chaque colonne correspond à un des d vecteurs (la matrice est donc constituée de d +

7.1. MATROÏDE ORIENTÉ ASSOCIÉ À UNE CONFIGURATION DE POINTS EN DIMENSION

QUELCONQUE 135

1 lignes et de d colonnes) et de calculer son rang. Si le rang de la matrice est égal à d , les d vecteurs forment bien un hyperplan. On va donc prendre tous les sous-ensembles de V à d éléments et tester si chaque sous-ensemble constitue une matrice de rang égal à d . Ensuite si un sous-ensemble forme un hyperplan H , pour chaque vecteur vjdeV on crée une matrice dont la première colonne

est composée des coordonnées de vjet les d autres colonnes sont composées des coordonnées des

vecteurs formant l’hyperplan H . On calcule alors le signe du déterminant de cette matrice. Comme le signe du déterminant d’une matrice indique l’orientation des vecteurs par rapport à la base sur laquelle est écrite la matrice ; si les déterminants de deux matrices ont le même signe, alors les vecteurs ont la même orientation. Ainsi si le déterminant d’une telle matrice est nul, alors le vecteur composant sa première colonne appartient à l’hyperplan H et si les déterminants de deux matrices ont le même signe, cela nous indique que les vecteurs composant la première colonne de chaque matrice sont dans le même demi-espace délimité par H .

Calcul des circuits

Comme nous l’avons vu dans le Chapitre 2, les circuits d’un matroïde orienté sont les cocir- cuits du matroïde orienté dual. Pour calculer les circuits du matroïde nous allons donc calculer le matroïde orienté dual puis nous allons utiliser l’Algorithme 7.2 à partir de ce matroïde orienté dual.

Algorithme 7.3 : Calcul du matroïde orienté dual

Entrée : La matrice M des coordonnées des vecteurs deV Sortie : La matrice M∗correspondant au matroïde orienté dual Prendre d + 1 premiers vecteurs {vi1, . . . , vid +1} deV ;

tant que det (vi1 . . . vid +1) = 0 faire Prendre un autre (d +1)-uplet de vecteurs;

Ecrire la matrice M en commençant par ces d + 1 vecteurs;

Ecrire M sous forme échelonnée réduite (c’est-à-dire sous la forme (Id +1|A)); Ecrire la matrice M∗= (−tA|In−(d+1));

Pour calculer le matroïde orienté dual, on utilise l’Algorithme 7.3. On note M la matrice des coordonnées des vecteurs deV (c’est-à-dire que M est la matrice de taille (d + 1) × n dont la i-ème colonne est composée des coordonnées du i -ème vecteur deV ). Cet algorithme consiste à écrire M sous la forme (Id +1|A) (où Id +1est la matrice identité de taille (d + 1) × (d + 1) et A est une matrice

de taille (d +1)×(n −(d +1))) puis à écrire la matrice M∗= (−tA|In−(d+1)). Le matroïde orienté dual

se calcule alors à partir de la matrice M∗. L’Algorithme 7.3 se déroule donc en deux étapes.

Pour la première étape, il faut commencer par trouver d + 1 vecteurs parmi les n vecteurs de V de sorte que ces d + 1 vecteurs forment une base de Rd +1. On commence par tester si les vec-

teurs {v1, . . . , vd +1} forment une base de Rd +1 ce qui revient à regarder si det(v1, . . . , vd +1) 6= 0. Si

ce déterminant est nul, les vecteurs {v1, . . . , vd +1} ne forment pas une base deRd +1et il faut donc

changer au moins l’un de ces vecteurs. Une fois que l’on a les d + 1 vecteurs formant une base on réécrit la matrice (v1, . . . , vn) en plaçant en premier ces d + 1 vecteurs. La deuxième étape consiste

alors à écrire la matrice sous la forme échelonnée réduite (c’est-à-dire sous la forme (Id +1|A)). Pour écrire la matrice sous cette forme, nous utilisons la méthode du pivot de Gauss. Il ne nous reste plus qu’a calculertA pour avoir la matrice (−tA|In−(d+1)) à partir de laquelle nous pouvons calculer le

matroïde orienté dual. Il nous suffit alors de calculer les cocircuits à partir de cette matrice pour obtenir les circuits du matroïde orienté associé à l’ensemble de points.

Calcul du déterminant et du rang

Pour réaliser les calculs des bases, cocircuits et circuits du matroïde orienté associé à l’ensemble de pointsE , on utilise des calculs de déterminants et de rangs de matrices. Ces deux calculs peuvent notamment être réalisés grâce à la méthode du pivot de Gauss qui est utilisée dans le calcul du ma- troïde dual. Ainsi nous avons décidé pour des questions de simplicité de programmation de réaliser ces calculs par la méthode du pivot de Gauss, bien qu’il existe des méthodes plus performantes [35]. Il est donc envisageable de changer de méthode pour les calculs du déterminant et du rang. Pour plus de renseignements sur la méthode du pivot de Gauss ou sur les matrices, je recommande le Livre [39].