/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E T U D E   D E   L A   P E R S I S T A N C E   M U L T I P L I C A T I V E                                                */
/*        E T   A D D I T I V E   D E S   N O M B R E S  :                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande (inspiree de la fonction                                                                        */
/*                  'v $ximf/nombres$FON Ipersistance_multiplicative_des_nombres_entiers'                                            */
/*                  permet d'etudier les persistances multiplicative                                                                 */
/*                  et additive des nombres entiers...                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/valeurs_Persistance$K' :                                                                                   */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20150310133049).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/sequence.01.I"

#define   PERSISTANCE_ADDITIVE                                                                                                          \
                    FAUX                                                                                                                \
                                        /* Faut-il plutot etudier la persistance additive (au lieu de la multiplicative) ?           */
#define   BASE_DE_NUMERATION                                                                                                            \
                    BASE10                                                                                                              \
                                        /* Base de numeration.                                                                       */
#define   MAXIMUM_DE_LA_PERSISTANCE                                                                                                     \
                    INFINI                                                                                                              \
                                        /* Afin de permettre, par exemple, de reperer les nombres qui initialement contiennent       */ \
                                        /* contiennent au moins un zero. Il suffit pour ce faire de prendre un maximum de la         */ \
                                        /* 'Persistance' egal a 0 et de ne pas renvoyer la 'Persistance' (et donc renvoyer le        */ \
                                        /* 'CumulMultiplicatif_ou_Additif')...                                                       */

#define   EDITER_UNIQUEMENT_LE_NOMBRE_ET_SA_PERSISTANCE                                                                                 \
                    FAUX                                                                                                                \
                                        /* Faut-il editer uniquement le nombre et sa persistance ('VRAI') ou pas ('FAUX') ? La       */ \
                                        /* valeur par defaut garantit la compatibilite anterieure (introduit le 20220329174700)...   */
#define   EDITER_DES_EN_TETES                                                                                                           \
                    VRAI                                                                                                                \
                                        /* Faut-il editer des en-tetes ?                                                             */
#define   EDITER_LES_NOMBRES                                                                                                            \
                    VRAI                                                                                                                \
                                        /* Faut-il editer les nombres eux-memes ?                                                    */
#define   EDITER_LA_PERSISTANCE_COURANTE                                                                                                \
                    VRAI                                                                                                                \
                                        /* Faut-il editer la persistance ?                                                           */
#define   EDITER_LA_PERSISTANCE_MAXIMALE                                                                                                \
                    VRAI                                                                                                                \
                                        /* Faut-il editer la persistance maximale ?                                                  */

#include  xci/valeurs.01.I"

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E T U D E   D E   L A   P E R S I S T A N C E   M U L T I P L I C A T I V E                                                */
/*        E T   A D D I T I V E   D E S   N O M B R E S  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE));
                                        /* Numero de la premiere image,                                                              */
     DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE));
                                        /* Numero de la derniere image.                                                              */
     DEFV(Int,INIT(numero_d_image,UNDEF));
                                        /* Numero de l'image courante.                                                               */
     DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES));
                                        /* Pas de passage d'un numero d'image a une autre.                                           */

     DEFV(Logical,INIT(persistance_additive,PERSISTANCE_ADDITIVE));
                                        /* Faut-il plutot etudier la persistance additive (au lieu de la multiplicative) ?           */
     DEFV(Positive,INIT(base_de_numeration,BASE_DE_NUMERATION));
                                        /* Base de numeration.                                                                       */
     DEFV(Positive,INIT(maximum_de_la_Persistance,MAXIMUM_DE_LA_PERSISTANCE));
                                        /* Afin de permettre, par exemple, de reperer les nombres qui initialement contiennent       */
                                        /* contiennent au moins un zero. Il suffit pour ce faire de prendre un maximum de la         */
                                        /* 'Persistance' egal a 0 et de ne pas renvoyer la 'Persistance' (et donc renvoyer le        */
                                        /* 'CumulMultiplicatif_ou_Additif')...                                                       */

     DEFV(Logical,INIT(editer_uniquement_le_nombre_et_sa_persistance,EDITER_UNIQUEMENT_LE_NOMBRE_ET_SA_PERSISTANCE));
                                        /* Faut-il editer uniquement le nombre et sa persistance ('VRAI') ou pas ('FAUX') ? La       */
                                        /* valeur par defaut garantit la compatibilite anterieure (introduit le 20220329174700)...   */
     DEFV(Logical,INIT(editer_des_en_tetes,EDITER_DES_EN_TETES));
                                        /* Faut-il editer des en-tetes (introduit le 20121109171704) ?                               */
     DEFV(Logical,INIT(editer_les_nombres,EDITER_LES_NOMBRES));
                                        /* Faut-il editer les nombres eux-memes (introduit le 20100102101009) ?                      */
     DEFV(Logical,INIT(editer_la_Persistance_courante,EDITER_LA_PERSISTANCE_COURANTE));
                                        /* Faut-il editer la persistance ?                                                           */
     DEFV(Logical,INIT(editer_la_Persistance_maximale,EDITER_LA_PERSISTANCE_MAXIMALE));
                                        /* Faut-il editer la persistance maximale ?                                                  */

     DEFV(Int,INIT(PersistanceMaximale,MOINS_L_INFINI));
                                        /* Calcul de la persistance maximale inutilisee pour le moment...                            */

#include  xci/valeurs.03.I"
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_I("premiere=""p=""D=",premiere_image);
                         GET_ARGUMENT_I("derniere=""d=""A=",derniere_image);
                         GET_ARGUMENT_I("pas=",pas_des_images);

                         GET_ARGUMENT_L("additive=""add=",persistance_additive);
                         GET_ARGUMENT_N("multiplicative=""mul=",persistance_additive);
                         GET_ARGUMENT_I("base=""b=",base_de_numeration);
                         GET_ARGUMENT_I("maximum_persistance=""mp=",maximum_de_la_Persistance);

                         GET_ARGUMENT_L("editer_nombre_persistance=""enp=",editer_uniquement_le_nombre_et_sa_persistance);
                                        /* Argument introduit le 20220329174700...                                                   */
                         GET_ARGUMENT_L("editer_en_tetes=""en_tetes=""et=",editer_des_en_tetes);
                         GET_ARGUMENT_L("editer_nombres=""nombres=""en=",editer_les_nombres);
                         GET_ARGUMENT_L("Persistance=""lister=""pc=",editer_la_Persistance_courante);
                         GET_ARGUMENT_L("PersistanceMaximale=""pm=",editer_la_Persistance_maximale);
                         GET_ARGUMENT_C("signe=",valeurs_signees);
                         )
                    );

     Test(IFLE(premiere_image,derniere_image))
          Bblock
          Test(IL_FAUT(editer_uniquement_le_nombre_et_sa_persistance))
               Bblock
               EGAL(editer_des_en_tetes,FAUX);
               EGAL(editer_les_nombres,FAUX);
               EGAL(editer_la_Persistance_courante,FAUX);
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images)
               Bblock
               DEFV(Int,INIT(nombre_courant,numero_d_image));
                                        /* Nombre entier courant a tester.                                                           */

               DEFV(Int,INIT(CumulMultiplicatif_ou_Additif
                            ,COND(IL_NE_FAUT_PAS(persistance_additive)
                                 ,UN
                                 ,ZERO
                                  )
                             )
                    );

               DEFV(Int,INIT(Reduction,UNDEF));
               DEFV(Int,INIT(Persistance,ZERO));

               Test(IZLT(nombre_courant))
                    Bblock
                    PRINT_ERREUR("la persistance additive/multiplicative n'a de sens que pour les nombres positifs ou nuls");
                    CAL1(Prer1("(le nombre %d est negatif)\n",nombre_courant));

                    EGAL(nombre_courant,ABSO(nombre_courant));
                                        /* On prend donc la valeur absolue des nombres negatifs...                                   */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(Reduction,nombre_courant);

               Test(IL_FAUT(editer_les_nombres))
                    Bblock
                    CAL2(Prin1(Cara(chain_Aconcaten5(COND(IL_FAUT(editer_des_en_tetes),"Nombre=",C_VIDE)
                                                    ,INTRODUCTION_FORMAT
                                                    ,valeurs_signees
                                                    ,"d"
                                                    ," : "
                                                     )
                                    )
                              ,nombre_courant
                               )
                         );
                                        /* Edition des nombres eux-memes.                                                            */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(editer_la_Persistance_courante))
                    Bblock
                    CAL2(Prin1("%d",Reduction));

                    Test(IFLT(Reduction,base_de_numeration))
                         Bblock
                         CAL2(Prin2(" --%d--> %d",Persistance,Reduction));
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Tant(IFET(IFGE(Reduction,base_de_numeration)
                        ,IFLE(Persistance,maximum_de_la_Persistance)
                         )
                    )
                    Bblock
                    DEFV(Int,INIT(Quotient,Reduction));
                    DEFV(Int,INIT(Reste,UNDEF));

                    EGAL(CumulMultiplicatif_ou_Additif
                        ,COND(IL_NE_FAUT_PAS(persistance_additive)
                             ,UN
                             ,ZERO
                              )
                         );
                                        /* La reinitialisation de 'CumulMultiplicatif_ou_Additif' doit avoir lieu evidemment a       */
                                        /* chaque nouvelle iteration du 'Tant(...)'...                                               */

                    Tant(IFNE(Quotient,ZERO))
                         Bblock
                         EGAL(Reste,REST(Quotient,base_de_numeration));
                         EGAL(Quotient,DIVI(Quotient,base_de_numeration));

                         CUMUL_MULTIPLICATIF_OU_ADDITIF;
                                        /* Cette procedure est rendue obligatoire a cause du 'OPC2(...)' qu'elle contient...         */
                         Eblock
                    ETan

                    EGAL(Reduction,CumulMultiplicatif_ou_Additif);
                    INCR(Persistance,I);

                    Test(IL_FAUT(editer_la_Persistance_courante))
                         Bblock
                         CAL2(Prin2(" --%d--> %d",Persistance,Reduction));
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes
                    Eblock
               ETan

               EGAL(PersistanceMaximale,MAX2(PersistanceMaximale,Persistance));

               Test(IL_FAUT(editer_la_Persistance_courante))
                    Bblock
                    CAL2(Prin1("     Persistance=%d",Persistance));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFOU(IL_FAUT(editer_les_nombres),IL_FAUT(editer_la_Persistance_courante)))
                    Bblock
                    CAL2(Prin0("\n"));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(editer_uniquement_le_nombre_et_sa_persistance))
                    Bblock
                    CAL2(Prin2("p(%d)=%d\n",nombre_courant,Persistance));
                                        /* Possibilite introduite le 20220329174700...                                               */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          EDoI

          Test(IL_FAUT(editer_la_Persistance_maximale))
               Bblock
               CAL2(Prin1("\nPersistanceMaximale=%d\n",PersistanceMaximale));
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          PRINT_ERREUR("la relation d'ordre stricte ('premier < dernier') n'est pas respectee");
          Eblock
     ETes

     RETU_Commande;
     Eblock
ECommande



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