/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N H Y P E R C U B E : */ /* */ /* */ /* Author of '$xtc/hyper_cube.12$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20230309093902). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" extern double log(); extern double pow(); #define BASE \ 2 #define EXPOSANT \ 3 #define N \ ((int)pow((double)BASE,(double)EXPOSANT)) #define FIN_DE_CHAINE \ (char)0 #define GENERATION_LISTE_DES_ENTIERS \ { \ int n; \ \ printf("\nGeneration de la liste des entiers de %d a %d :\n\n",0,N-1); \ \ for (n=0 ; n<=(N-1) ; n++) \ { \ printf("%s\n",ConversionBase(n,BASE,EXPOSANT)); \ } \ \ printf("\n"); \ } #define GENERATION_DES_ARETES \ { \ int n1,n2; \ \ printf("\nGeneration des aretes :\n\n"); \ \ for (n1=0 ; n1<=(N-1) ; n1++) \ { \ for (n2=0 ; n2<=(n1-1) ; n2++) \ { \ int minimum_n1_n2=MIN2(n1,n2); \ int maximum_n1_n2=MAX2(n1,n2); \ \ double logarithme_base2=log((double)(n1^n2))/log((double)BASE); \ \ printf("EOR(%s",ConversionBase(minimum_n1_n2,BASE,EXPOSANT)); \ printf(",%s)=",ConversionBase(maximum_n1_n2,BASE,EXPOSANT)); \ printf("%s",ConversionBase((n1^n2),BASE,EXPOSANT)); \ \ if ((int)logarithme_base2 == logarithme_base2) \ { \ printf(" log2=%d",(int)logarithme_base2); \ printf(" arete={%s,%s}" \ ,ConversionBase(minimum_n1_n2,BASE,EXPOSANT) \ ,ConversionBase(maximum_n1_n2,BASE,EXPOSANT) \ ); \ /* Edition des couples {n1,n2} de sommets connectes de l'hypercube et qui correspondent */ \ /* aux cas ou 'n1' et 'n2' ne different que d'un seul bit, ce qui se voit en faisant le */ \ /* ou-exclusif entre eux, puis en regardant si ce dernier est une puissance de 2 (son */ \ /* logarithme en base 2 est alors un nombre entier...). */ \ } \ else \ { \ printf(" log2=%f",logarithme_base2); \ } \ \ printf("\n"); \ } \ \ printf("\n"); \ } \ \ printf("\n"); \ } char *ConversionBase(nombre,base,exposant) int nombre; int base; int exposant; { char *chaine=malloc(exposant+1); int diviseur=(int)pow((double)base,(double)(exposant-1)); int NombreCourant=nombre; int quotient,reste; int iteration; for (iteration=1 ; iteration<=exposant ; iteration++) { quotient=NombreCourant/diviseur; reste=NombreCourant%diviseur; if ((quotient<0) || (quotient >= BASE)) { printf("\nquotient errone ; %d\n",quotient); } else { } *(chaine+iteration-1)='0'+quotient; NombreCourant=reste; diviseur=diviseur/BASE; } *(chaine+iteration-1)=FIN_DE_CHAINE; return(chaine); } int main() { int n1,n2; GENERATION_LISTE_DES_ENTIERS; GENERATION_DES_ARETES; return(0); }