/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E S   N O M B R E S   R A T I O N N E L S  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/valeurs_ArbreSternBrocot$K' :                                                                              */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20220802132730).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_MINI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   PROFONDEUR_DE_L_ARBRE                                                                                                         \
                    TROIS                                                                                                               \
                                        /* Profondeur de l'arbre a generer.                                                          */

#define   TRIER_LES_NOMBRES_RATIONNELS_PAR_ORDRE_CROISSANT                                                                              \
                    VRAI
#define   UTILISER_LE_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE                                                                     \
                    VRAI
                                        /* Doit-on ('VRAI') ou pas ('FAUX') trier les nombres rationnels par ordre croissant ?       */

#define   EDITER_LES_VALEURS_DECIMALES                                                                                                  \
                    FAUX                                                                                                                \
                                        /* Faut-il editer les valeurs decimales utiliser pour le tri ('VRAI') ou pas ('FAUX') ?      */ \
                                        /* ceci a ete introduit le 20220816135310...                                                 */

#include  xci/valeurs.01.I"

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/valeurs.02.I"

#define   PROFONDEUR_MAXIMALE_DE_L_ARBRE                                                                                                \
                    VINGT_QUATRE                                                                                                        \
                                        /* Profondeur maximale de l'arbre a generer...                                               */

#define   LONGUEUR_DES_LISTES(profondeur)                                                                                               \
                    PRED(INTE(DECG(UN,profondeur)))                                                                                     \
                                        /* Longueur utile des listes qui est donc egale a une puissance de 2 moins 1. On notera      */
                                        /* que l'on ne peut pas utiliser 'PRED(INTE(PUIX(DEUX,profondeur)))' au niveau 'Local'...    */
#define   LONGUEUR_MAXIMALE_DES_LISTES                                                                                                  \
                    LONGUEUR_DES_LISTES(PROFONDEUR_MAXIMALE_DE_L_ARBRE)                                                                 \
                                        /* Profondeur maximale de l'arbre a generer.                                                 */

#define   LONGUEUR_COURANTE_DES_LISTES                                                                                                  \
                    LONGUEUR_DES_LISTES(profondeur_de_l_arbre)
#define   INDEX_DU_PREMIER_NOMBRE_RATIONNEL                                                                                             \
                    INDEX0
#define   INDEX_DU_DERNIER_NOMBRE_RATIONNEL                                                                                             \
                    LSTX(INDEX_DU_PREMIER_NOMBRE_RATIONNEL,LONGUEUR_COURANTE_DES_LISTES)
                                        /* Definition de la zone utile des listes...                                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N   D E   C A L C U L   D ' U N   N O M B R E   R A T I O N N E L  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Local,DEFV(Positive,INIT(profondeur_de_l_arbre,PROFONDEUR_DE_L_ARBRE)));
DEFV(Local,DEFV(Positive,INIT(profondeur_courante_de_l_arbre,ZERO)));
                                        /* Profondeur de l'arbre a generer et profondeur courante au cours de la generation...       */

DEFV(Local,DEFV(Float,DdTb1(POINTERf
                           ,liste_des_nombres_decimaux
                           ,LONGUEUR_MAXIMALE_DES_LISTES
                           ,ADRESSE_NON_ENCORE_DEFINIE
                            )
                )
     );
DEFV(Local,DEFV(fractionI,DdTb1(POINTERs
                               ,liste_des_nombres_rationnels
                               ,LONGUEUR_MAXIMALE_DES_LISTES
                               ,ADRESSE_NON_ENCORE_DEFINIE
                                )
                )
     );
DEFV(Local,DEFV(Int,DdTb1(POINTERi
                         ,liste_des_index_des_nombres_rationnels
                         ,LONGUEUR_MAXIMALE_DES_LISTES
                         ,ADRESSE_NON_ENCORE_DEFINIE
                          )
                )
     );
                                        /* Listes utiles...                                                                          */

DEFV(Local,DEFV(Int,INIT(index_courant_des_nombres_rationnels,INDEX0)));
                                        /* Index de rangement dans les listes utiles...                                              */

BFonctionV

DEFV(Local,DEFV(FonctionV,CalculDuNombreRationnelSuivant(NombreRationnel_Gauche_______,NombreRationnel_Droite_______)))
DEFV(Argument,DEFV(fractionI,NombreRationnel_Gauche_______));
DEFV(Argument,DEFV(fractionI,NombreRationnel_Droite_______));
                                        /* Couple de nombres rationnels Argument donnant naissance a un nombre rationnel Resultat.   */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(fractionI,NombreRationnel_MoyenneMediane);
     /*..............................................................................................................................*/
     INCR(profondeur_courante_de_l_arbre,I);
                                        /* Montee dans l'arbre...                                                                    */

     MOYENNE_MEDIANE_DE_DEUX_FRACTIONS(NombreRationnel_MoyenneMediane,NombreRationnel_Gauche_______,NombreRationnel_Droite_______)
                                        /* Calcul de la moyenne mediane de {Gauche,Droite}...                                        */

     TRANSFERT_FRACTION(IdTb1sd(liste_des_nombres_rationnels,index_courant_des_nombres_rationnels),NombreRationnel_MoyenneMediane);
                                        /* Memorisation de la moyenne mediane qui est donc le nombre rationnel courant...            */

     EGAL(IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant_des_nombres_rationnels),index_courant_des_nombres_rationnels);
                                        /* Memorisation de l'index du nombre rationnel courant, cette liste etant {0,1,2,...}        */
                                        /* avant le tri eventuel...                                                                  */
     EGAL(IdTb1sd(liste_des_nombres_decimaux,index_courant_des_nombres_rationnels)
         ,DIVI(FLOT(NumerateurFraction__(NombreRationnel_MoyenneMediane)),FLOT(DenominateurFraction(NombreRationnel_MoyenneMediane)))
          );
                                        /* Memorisation du nombre rationnel courant en nombre decimal afin de pouvoir faire ensuite  */
                                        /* et si besoin est un tri par valeur croissante...                                          */

     INCR(index_courant_des_nombres_rationnels,I);
                                        /* Progression de l'index de rangement dans les listes utiles...                             */

     Test(IFLT(profondeur_courante_de_l_arbre,profondeur_de_l_arbre))
                                        /* Cas ou l'on n'a pas encore atteint la profondeur de l'arbre...                            */
          Bblock
          CalculDuNombreRationnelSuivant(NombreRationnel_Gauche_______,NombreRationnel_MoyenneMediane);
                                        /* Calcul du prochain nombre rationnel avec {Gauche,MoyenneMediane}...                       */
          CalculDuNombreRationnelSuivant(NombreRationnel_MoyenneMediane,NombreRationnel_Droite_______);
                                        /* Calcul du prochain nombre rationnel avec {MoyenneMediane,Droite}...                       */
          Eblock
     ATes
          Bblock
                                        /* Cas ou l'on a atteint la profondeur de l'arbre...                                         */
          Eblock
     ETes

     DECR(profondeur_courante_de_l_arbre,I);
                                        /* Descente dans l'arbre...                                                                  */

     RETU_VIDE;
     Eblock

EFonctionV

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E S   N O M B R E S   R A T I O N N E L S  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(trier_les_nombres_rationnels_par_ordre_croissant,TRIER_LES_NOMBRES_RATIONNELS_PAR_ORDRE_CROISSANT));
     DEFV(Logical,INIT(utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE
                      ,UTILISER_LE_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE
                       )
          );
                                        /* Doit-on ('VRAI') ou pas ('FAUX') trier les nombres rationnels par ordre croissant ?       */

     DEFV(Logical,INIT(editer_les_valeurs_decimales,EDITER_LES_VALEURS_DECIMALES));
                                        /* Faut-il editer les valeurs decimales utiliser pour le tri ('VRAI') ou pas ('FAUX') ?      */
                                        /* ceci a ete introduit le 20220816135310...                                                 */

#include  xci/valeurs.03.I"
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_I("profondeur=""p=",profondeur_de_l_arbre);

                         GET_ARGUMENT_L("tri=""trier=""ordre_croissant=",trier_les_nombres_rationnels_par_ordre_croissant);
                         GET_ARGUMENT_N("ordre_calcul=",trier_les_nombres_rationnels_par_ordre_croissant);
                         GET_ARGUMENT_L("tri_N2=""N_carre=""N_au_carre=""N_AU_CARRE=""N2="
                                       ,utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE
                                        );
                         GET_ARGUMENT_N("tri_NlogN=""NlN=""N_log_N=""N1=",utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE);

                         GET_ARGUMENT_L("editer=""valeurs_decimales=""evd=",editer_les_valeurs_decimales);
                                        /* Parametre introduit le 20220816135310.                                                    */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                         )
                    );

     Test(IFGT(profondeur_de_l_arbre,PROFONDEUR_MAXIMALE_DE_L_ARBRE))
          Bblock
          PRINT_ERREUR("la profondeur de l'arbre est trop importante");

          EGAL(profondeur_de_l_arbre,PROFONDEUR_MAXIMALE_DE_L_ARBRE);
          CAL1(Prer1("(la valeur %d maximale est forcee)\n",profondeur_de_l_arbre));
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     begin_nouveau_block
          Bblock
          MdTb1(liste_des_nombres_decimaux
               ,LONGUEUR_COURANTE_DES_LISTES
               ,Float
               ,ADRESSE_NON_ENCORE_DEFINIE
                );
          MdTb1(liste_des_nombres_rationnels
               ,LONGUEUR_COURANTE_DES_LISTES
               ,fractionI
               ,ADRESSE_NON_ENCORE_DEFINIE
                );
          MdTb1(liste_des_index_des_nombres_rationnels
               ,LONGUEUR_COURANTE_DES_LISTES
               ,Int
               ,ADRESSE_NON_ENCORE_DEFINIE
                );

          begin_nouveau_block
               Bblock
               DEFV(fractionI,INIS(NombreRationnel_01,IstructL02(ZERO,UN)));
               DEFV(fractionI,INIS(NombreRationnel_10,IstructL02(UN,ZERO)));

               CalculDuNombreRationnelSuivant(NombreRationnel_01,NombreRationnel_10);
                                        /* Lancement du processus a partir des nombres rationnels 0/1 et 1/0 (=infini)...            */
               Eblock
          end_nouveau_block

          DECR(index_courant_des_nombres_rationnels,I);
                                        /* Ne sert a rien, mais par pure hygiene...                                                  */

          Test(IL_FAUT(trier_les_nombres_rationnels_par_ordre_croissant))
               Bblock
               TRI_D_UNE_LISTE_QUELCONQUE(liste_des_nombres_decimaux
                                         ,liste_des_index_des_nombres_rationnels
                                         ,INDEX_DU_PREMIER_NOMBRE_RATIONNEL
                                         ,INDEX_DU_DERNIER_NOMBRE_RATIONNEL
                                         ,FAUX
                                         ,utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE
                                         ,IdTb1sd
                                          );
                                        /* Passage de l'ordre du calcul a l'ordre croissant...                                       */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          begin_nouveau_block
               Bblock
               DEFV(Int,INIT(index_courant,UNDEF));

               DoIn(index_courant,INDEX_DU_PREMIER_NOMBRE_RATIONNEL,INDEX_DU_DERNIER_NOMBRE_RATIONNEL,I)
                    Bblock
                    CAL2(Prin2("%d/%d"
                              ,NumerateurFraction__(IdTb1sd(liste_des_nombres_rationnels
                                                           ,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant)
                                                            )
                                                    )
                              ,DenominateurFraction(IdTb1sd(liste_des_nombres_rationnels
                                                           ,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant)
                                                            )
                                                    )
                               )
                         );
                                        /* Edition des nombres rationnels dans un certain ordre...                                   */

                    Test(IL_FAUT(editer_les_valeurs_decimales))
                                        /* Test introduit le 20220816135310...                                                       */
                         Bblock
                         CAL2(Prin1("=%+.^^^"
                                   ,IdTb1sd(liste_des_nombres_decimaux
                                           ,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant)
                                            )
                                    )
                              );
                                        /* Edition eventuelle des valeurs decimales des nombres rationnels...                        */
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    CAL2(Prin0("\n"));
                    Eblock
               EDoI
               Eblock
          end_nouveau_block

          FdTb1(liste_des_index_des_nombres_rationnels
               ,LONGUEUR_MAXIMALE_DES_LISTES
               ,Int
               ,ADRESSE_NON_ENCORE_DEFINIE
                );
          FdTb1(liste_des_nombres_rationnels
               ,LONGUEUR_MAXIMALE_DES_LISTES
               ,fractionI
               ,ADRESSE_NON_ENCORE_DEFINIE
                );
          FdTb1(liste_des_nombres_decimaux
               ,LONGUEUR_MAXIMALE_DES_LISTES
               ,Float
               ,ADRESSE_NON_ENCORE_DEFINIE
                );
          Eblock
     end_nouveau_block

     RETU_Commande;
     Eblock
ECommande



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