next up previous contents
suivant: Algorithme d'Euclide étendu avec monter: Corrigés des programmes précédent: Vigenere   Table des matières

Algorithme d'Euclide étendu sous forme de tableau

tableauEuclide.c


#include<stdio.h>
#include<stdlib.h>

typedef struct ligne
{
  long a;
  long b;
  long quotient;
  long reste;
  long u;
  long v;
  struct ligne* suivante;
}ligne;

/********************************************************/

/*
  Cree une ligne, initialise ses champs.
*/

ligne* creerLigne(long a, long b, 
		  long quotient, long reste, 
		  long u, long v,
		  ligne* suivante)
{
  ligne* l = (ligne*)malloc(sizeof(ligne));
  if (l == NULL)
    {
      printf("No memory left\n");
      exit(0);
    }
  l->a = a;
  l->b = b;
  l->quotient = quotient;
  l->reste = reste;
  l->u = u;
  l->v = v;
  l->suivante = suivante;
  return l;
}

/********************************************************/

/*
  Met a jour les valeurs de u et de v dans le maillon l.
*/

void calculeUV(ligne* l)
{
  l->u = l->suivante->v;
  l->v = l->suivante->u - l->suivante->v * l->quotient;
}

/********************************************************/

/*
  Execute l'algorithme d'Euclide etendu, retourne 
  la liste des lignes du tableau.
*/

ligne* euclideEtendu(long a, long b, long lastV)
{
  if (b == 0)
    return creerLigne(a, b, 0, 0, 1, lastV, NULL);
  long quotient = a/b, reste = a - quotient*b;
  ligne* l = creerLigne(a, b, quotient, reste, 0, 0,
			euclideEtendu(b, reste, lastV));
  calculeUV(l);
  return l;
}

/********************************************************/

/*
  Libere la memoire occupee par tous les maillons.
*/

void detruitLignes(ligne* l)
{
  if (l != NULL)
    {
      detruitLignes(l->suivante);
      free(l);
    }
}

/********************************************************/

/*
  Affiche les lignes du tableau.
*/

void afficheLignes(ligne * l)
{
  if (l != NULL)
    {
      if (l->suivante != NULL)
	printf("| %10ld| %10ld| %10ld| %10ld| %10ld| %10ld|\n", 
	       l->a, l->b, l->quotient, l->reste, l->u, l->v);
      else
	printf("| %10ld| %10ld|           |           | %10ld| %10ld|\n", 
	       l->a, l->b, l->u, l->v);
      afficheLignes(l->suivante);
    }
}

/********************************************************/

/*
  Affiche le tableau.
*/

void afficheTableau(ligne* l)
{
  printf("------------------------------------------------"\
	 "-------------------------\n");
  printf("|          a|          b|          q|          r"\
	 "|          u|          v|\n");
  printf("|-----------|-----------|-----------|-----------"\
	 "|-----------|-----------|\n");
  afficheLignes(l);
  printf("------------------------------------------------"\
	 "-------------------------\n");
}

/********************************************************/

/*
  Prend en parametre a, b et fv, retourne une solution particuliere de 
  	au + bv = pgcd(a, b)
  fv est la valeur donnee a v dans la derniere etape.
*/

int main(int argv, char** argc)
{
  ligne* l = euclideEtendu(strtol(*(argc + 1), NULL, 10), 
			   strtol(*(argc + 2), NULL, 10), 
			   strtol(*(argc + 3), NULL, 10));
  afficheTableau(l);
  detruitLignes(l);
  return 0;
}


next up previous contents
suivant: Algorithme d'Euclide étendu avec monter: Corrigés des programmes précédent: Vigenere   Table des matières
klaus 2010-08-05