/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R E M I E R E S   G E N E R A T I O N S   D E   N O M B R E S   S U R R E E L S  :                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xtc/NombresSurReels.01$c' :                                                                                    */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 20081106162832).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#include  <stdio.h>

#define   EditerDesFractions                                                                                                            \
                    VRAI

#define   PremierJour                                                                                                                   \
                    0
#define   DernierJour                                                                                                                   \
                    4
                                        /* Definition du temps : evidemment, 'DernierJour' devrait etre infini...                    */

#define   OrigineSpatiale                                                                                                               \
                    0
#define   DenominateurNombreEntier                                                                                                      \
                    1

#define   Successeur                                                                                                                    \
                    1
#define   Pred(x)                                                                                                                       \
                    ((x)-Successeur)
#define   Neut(x)                                                                                                                       \
                    (x)
#define   Succ(x)                                                                                                                       \
                    ((x)+Successeur)
                                        /* Definition des fonctions {Predecesseur,Neutre,Successeur}.                                */

#define   Dyadique                                                                                                                      \
                    2
#define   Dyad(x)                                                                                                                       \
                    (Dyadique*(x))
                                        /* Definition de la fonction {Dyadique}.                                                     */

#define   VRAI                                                                                                                          \
                    1
#define   FAUX                                                                                                                          \
                    0

typedef   struct
          {
          int                 Numerateur;
          unsigned  int       Denominateur;
          }
          Fraction;
                                        /* Definition d'une fraction (nombre rationnel).                                             */
#define   Numer(fraction)                                                                                                               \
                    (fraction.Numerateur)
#define   Denom(fraction)                                                                                                               \
                    (fraction.Denominateur)
#define   EGAL(fraction,numerateur,denominateur)                                                                                        \
                    {                                                                                                                   \
                    Numer(fraction) = numerateur;                                                                                       \
                    Denom(fraction) = denominateur;                                                                                     \
                    }

void      GenerationDesNombresSurReels(JourCourant,NombreSurReelDuJourCourant)
int       JourCourant;
Fraction  NombreSurReelDuJourCourant;
          {
          if        (JourCourant <= DernierJour)
                    {
                    Fraction  NombreSurReelDuJourCourantSimplifie;
                    Fraction  NombreSurReelDuJourSuivantLeft_,NombreSurReelDuJourSuivantRight;

                    EGAL(NombreSurReelDuJourCourantSimplifie,Numer(NombreSurReelDuJourCourant),Denom(NombreSurReelDuJourCourant));

                    if        (    (Numer(NombreSurReelDuJourCourant) != OrigineSpatiale)
                              &&   (Denom(NombreSurReelDuJourCourant) != DenominateurNombreEntier)
                               )
                              {
                              int       iterer=VRAI;

                              while     (iterer == VRAI)
                                        {
                                        if        (    ((Numer(NombreSurReelDuJourCourantSimplifie)%Dyadique) == 0)
                                                  &&   ((Denom(NombreSurReelDuJourCourantSimplifie)%Dyadique) == 0)
                                                   )
                                                  {
                                                  EGAL(NombreSurReelDuJourCourantSimplifie
                                                      ,Numer(NombreSurReelDuJourCourantSimplifie)/Dyadique
                                                      ,Denom(NombreSurReelDuJourCourantSimplifie)/Dyadique
                                                       );
                                        /* Simplification de la fraction 'NombreSurReelDuJourCourant'.                               */
                                                  }
                                        else
                                                  {
                                                  iterer=FAUX;
                                                  }
                                        }
                              }
                    else
                              {
                              }

                    if        (EditerDesFractions == VRAI)
                              {
                              if        (Denom(NombreSurReelDuJourCourantSimplifie) > DenominateurNombreEntier)
                                        {
                                        printf("jour=%d nombre=%+d/%d\n"
                                              ,JourCourant
                                              ,Numer(NombreSurReelDuJourCourantSimplifie)
                                              ,Denom(NombreSurReelDuJourCourantSimplifie)
                                               );
                                        /* Edition de la fraction irreductible 'NombreSurReelDuJourCourant'.                         */
                                        }
                              else
                                        {
                                        printf("jour=%d nombre=%+d\n"
                                              ,JourCourant
                                              ,Numer(NombreSurReelDuJourCourantSimplifie)/Denom(NombreSurReelDuJourCourantSimplifie)
                                               );
                                        /* Edition du nombre entier 'NombreSurReelDuJourCourant'.                                    */
                                        }
                              }
                    else
                              {
                              printf("jour=%d nombre=%+.16f\n"
                                    ,JourCourant
                                    ,(double)Numer(NombreSurReelDuJourCourantSimplifie)
                                     /(double)Denom(NombreSurReelDuJourCourantSimplifie)
                                     );
                                        /* Edition du 'NombreSurReelDuJourCourant' sous forme decimale afin de permettre en sortie   */
                                        /* un tri croissant et numerique...                                                          */
                              }

                    if        (Denom(NombreSurReelDuJourCourant) == DenominateurNombreEntier)
                              {
                                        /* Cas des nombres SurReels extremaux (negatif, positif et evidemment cas particulier de     */
                                        /* l'origine...) :                                                                           */
                              if        (Numer(NombreSurReelDuJourCourant) < 0)
                                        {
                                        EGAL(NombreSurReelDuJourSuivantLeft_
                                            ,Pred(Numer(NombreSurReelDuJourCourant))
                                            ,Neut(Denom(NombreSurReelDuJourCourant))
                                             );
                                        EGAL(NombreSurReelDuJourSuivantRight
                                            ,Succ(Dyad(Numer(NombreSurReelDuJourCourant)))
                                            ,Neut(Dyad(Denom(NombreSurReelDuJourCourant)))
                                             );
                                        /* Fils de gauche ("Left_") et de droite ("Right") du nombre SurReel le plus negatif...      */
                                        }
                              else
                                        {
                                        if        (Numer(NombreSurReelDuJourCourant) == 0)
                                                  {
                                                  EGAL(NombreSurReelDuJourSuivantLeft_
                                                      ,Pred(Numer(NombreSurReelDuJourCourant))
                                                      ,Neut(Denom(NombreSurReelDuJourCourant))
                                                       );
                                                  EGAL(NombreSurReelDuJourSuivantRight
                                                      ,Succ(Numer(NombreSurReelDuJourCourant))
                                                      ,Neut(Denom(NombreSurReelDuJourCourant))
                                                       );
                                        /* Fils de gauche ("Left_") et de droite ("Right") du nombre SurReel 0={O|O}...              */
                                                  }
                                        else
                                                  {
                                                  if        (Numer(NombreSurReelDuJourCourant) > 0)
                                                            {
                                                            EGAL(NombreSurReelDuJourSuivantLeft_
                                                                ,Pred(Dyad(Numer(NombreSurReelDuJourCourant)))
                                                                ,Neut(Dyad(Denom(NombreSurReelDuJourCourant)))
                                                                 );
                                                            EGAL(NombreSurReelDuJourSuivantRight
                                                                ,Succ(Numer(NombreSurReelDuJourCourant))
                                                                ,Neut(Denom(NombreSurReelDuJourCourant))
                                                                 );
                                                            }
                                        /* Fils de gauche ("Left_") et de droite ("Right") du nombre SurReel le plus positif...      */
                                                  else
                                                            {
                                                            printf("ERREUR...\n");
                                                            }
                                                  }
                                        }
                              }
                    else
                              {
                              EGAL(NombreSurReelDuJourSuivantLeft_
                                  ,Pred(Dyad(Numer(NombreSurReelDuJourCourant)))
                                  ,Neut(Dyad(Denom(NombreSurReelDuJourCourant)))
                                   );
                              EGAL(NombreSurReelDuJourSuivantRight
                                  ,Succ(Dyad(Numer(NombreSurReelDuJourCourant)))
                                  ,Neut(Dyad(Denom(NombreSurReelDuJourCourant)))
                                   );
                                        /* Cas des autres nombres SurReels, c'est-a-dire ceux qui ne sont pas extremaux...           */
                              }

                    GenerationDesNombresSurReels(JourCourant+Successeur,NombreSurReelDuJourSuivantLeft_);
                                        /* Calcul des deux "fils" du nombre SurReel 'NombreSurReelDuJourSuivantLeft_'...             */
                    GenerationDesNombresSurReels(JourCourant+Successeur,NombreSurReelDuJourSuivantRight);
                                        /* Calcul des deux "fils" du nombre SurReel 'NombreSurReelDuJourSuivantRight'...             */
                    }
          else
                    {
                                        /* Cas ou l'on a genere suffisamment de generations de nombres SurReels...                   */
                    }
          }

main()
          {
          Fraction  NombreSurReelOrigine;
          EGAL(NombreSurReelOrigine,OrigineSpatiale,DenominateurNombreEntier);

          GenerationDesNombresSurReels(PremierJour,NombreSurReelOrigine);
                                        /* Calcul des deux "fils" du nombre SurReel "origine"...                                     */
          }



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