/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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);
          }



Copyright © Jean-François Colonna, 2023-2023.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2023-2023.