IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Generation d'une matrice inversible a coefficients binaires


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 12
    Points
    12
    Par défaut Generation d'une matrice inversible a coefficients binaires
    Bonjour,
    Voila je suis confronté a un probleme. Je cherche a générer des matrices inversibles 32x32 (et accessoirement plus) à coefficient dans Z/2Z.

    Pour l'instant j'utilise un algorithme qui genere une matrice de nxn aléatoirement et qui grace a l'algorithme de Gauss-Jordan me détermine l'inversibilité de celle ci. Si tel n'est pas le cas, je recommence avec une nouvelle matrice fraichement générée.

    Si cette technique fonctionne bien pour des petits n (j'entend n < 16), l'algorithme est interminable au dela.

    Existe t'il un algorithme performant pour réaliser cette opération?

    Merci de vos réponses.

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    L'algogithme de Gauss-Jordan te permet d'inverser la matrice. Pour décider si une matrice est inversible, il suffit en principe d'en calculer le déterminant.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    /*
    	Return 1 if the rank is full, 0 else
    */
     
    int gauss_jordan(int** M,int m,int n){
      int i1,i2,j;
      int* tmprow=NULL;
      int maxrow;
      int** matrix;
     
    //Copy M in temporary matrix
      matrix=(int**)malloc(m*sizeof(int*));
      for(i1=0;i1<m;i1++){
    		matrix[i1]=(int*)malloc(n*sizeof(int));
      }
     
      for(i1=0;i1<m;i1++){
    	for(j=0;j<n;j++){
    		matrix[i1][j]=M[i1][j];
      }
    	}
     
      for (i1=0;i1<m;i1++){
    	maxrow=i1;
    	for (i2=i1+1;i2<m;i2++){
          if (matrix[i2][i1] > matrix[maxrow][i1]);
            maxrow = i2;
    	}
     
    	if(maxrow!=i1){
    		//swapping two lines
    	    tmprow=matrix[i1];
    	    matrix[i1]=matrix[maxrow];
        	matrix[maxrow]=tmprow;
    	}
     
    	//Matrice singuliere
       	 if (matrix[i1][i1]==0){
    		for(i2=0;i2<m;i2++){
    			free(matrix[i2]);
    		}
    		free(matrix);
     
    			return 0;
    	}
     
     
    	//replaces all lines if i1 coefficient is not 0
    	for (i2=0;i2<m;i2++){
    		if(i1 != i2 && matrix[i2][i1]==1) 
    			for (j=i1;j<n;j++)
    		   	    matrix[i2][j] ^= matrix[i1][j];
    	}
     
      }
     
    	for(i1=0;i1<m;i1++){
    		free(matrix[i1]);
    	}
    	free(matrix);
    	return 1;
    }
    J'ai modifié l'algorithme de Gauss Jordan pour qu'il renvoie un booleen en cas d'inversibilité et plus generalement pour savoir si la matrice est de rang plein.
    De plus j'ai essayé avec le déterminant calculé de facon reccursive. Cependant mon algorithme reste sans nul doute plus efficace. Non le probleme se situerais je pense plutot dans la facon de générer les lignes, peut être en prenant en compte les lignes précédentes ?

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2017
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Je me permets de reprendre cette ancienne discussion, car j'ai exactement le meme problème.

    Zenaf, pour l'instant, soit j'utilise la meme méthode que toi, soit un algo similaire qui nécessite exactement 2^n operations pour générer une de ces matrices (ce qui me limite aussi à n~30).

    Je pense partir de la matrice identité n x n, puis appliquer aléatoirement des operations sur les lignes (sum modulo 2 de 2 lignes ou permutations).
    Chacune des matrices obtenues sera encore de rang n. Mais rien ne me garanti d'échantillonner "uniformément"....

    As-tu trouvé une solution plus efficace?

Discussions similaires

  1. inverse d'une matrice binaire
    Par medene-agane dans le forum MATLAB
    Réponses: 0
    Dernier message: 11/06/2015, 10h31
  2. [Débutant] generation d'une matrice à 4 colonnes pour une image
    Par yannimatrix dans le forum Images
    Réponses: 6
    Dernier message: 25/03/2009, 18h33
  3. generation d'une matrice
    Par lahrach dans le forum MATLAB
    Réponses: 1
    Dernier message: 23/03/2009, 18h27
  4. charger une matrice inversée
    Par mister3957 dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 17/04/2008, 11h58
  5. Recherche des coefficients d'une matrice 3x3
    Par colorid dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 25/11/2004, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo