suivant: Algorithme d'Euclide étendu avec
monter: Corrigés des programmes
précédent: Vigenere
Table des matières
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;
}
suivant: Algorithme d'Euclide étendu avec
monter: Corrigés des programmes
précédent: Vigenere
Table des matières
klaus
2010-08-05