/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E S   P R E M I E R S   E L E M E N T S                                                            */
/*        D ' U N E   S U I T E   D E   S Y R A C U S E  :                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/valeurs_Syra$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20110215151148).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   COMPATIBILITE_20150413                                                                                                        \
                    FAUX                                                                                                                \
                                        /* Permet d'assurer la compatibilite anterieure au 20150413093838 si besoin est...           */

#define   U0                                                                                                                            \
                    UN                                                                                                                  \
                                        /* Definition du premier element de la suite.                                                */

#define   DIVISEUR                                                                                                                      \
                    DEUX
#define   ALPHA___                                                                                                                      \
                    TROIS
#define   BETA____                                                                                                                      \
                    UN
                                        /* Definition des parametres.                                                                */

#define   S_ARRETER_SUR_LA_SUITE_4_2_1                                                                                                  \
                    FAUX                                                                                                                \
                                        /* Pour savoir s'il faut s'arreter sur la premiere occurence de {4,2,1} ? Ceci fut introduit */ \
                                        /* le 20130116093539.                                                                        */
#define   VALEUR_D_ARRET                                                                                                                \
                    UN                                                                                                                  \
                                        /* Valeur d'arret, le '1' de {4,2,1} etant le plus logique (introduit le 20130124120331).    */

#define   RANG_INITIAL_D_APPARITION_DE_LA_SUITE_4_2_1                                                                                   \
                    ZERO                                                                                                                \
                                        /* Pour initialiser 'rang_d_apparition_de_la_suite_4_2_1' (introduit le 20110305104043).     */

#define   EDITER_LA_PARITE_DES_ELEMENTS_DE_LA_SUITE                                                                                     \
                    FAUX                                                                                                                \
                                        /* Faut-il editer la valeur des elements U(n) de la suite ('FAUX') ou bien leur parite       */ \
                                        /* ('VRAI') ? Cela fut introduit le 20190418100936...                                        */
#define   EDITER_LES_POURCENTAGES_PAIRS_IMPAIRS                                                                                         \
                    FAUX                                                                                                                \
                                        /* Faut-il editer le pourcentage des elements U(n) pairs et impairs ('VRAI') ou pas          */ \
                                        /* ('FAUX') ? Cela fut introduit le 20200610105720...                                        */

#define   EDITER_DES_INFORMATIONS_SUR_LA_SUITE                                                                                          \
                    FAUX
#define   N_EDITER_QUE_LE_RANG_D_APPARITION_DE_LA_SUITE_4_2_1                                                                           \
                    FAUX
                                        /* Afin de savoir, par exemple, a partir de quand apparait {4,2,1} ? Ceci fut introduit      */
                                        /* le 20110304163403 et complete par 'N_EDITER_QUE_LE_RANG_D_APPARITION_DE_LA_SUITE_4_2_1'   */
                                        /* le 20170913152542...                                                                      */

#include  xci/valeurs.01.I"

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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D E S   P R E M I E R S   E L E M E N T S                                                            */
/*        D ' U N E   S U I T E   D E   S Y R A C U S E  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
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(compatibilite_20150413,COMPATIBILITE_20150413));
                                        /* Permet d'assurer la compatibilite anterieure au 20150413093838 si besoin est...           */

     DEFV(Int,INIT(U_0,U0));
     DEFV(Int,INIT(U_n,UNDEF));
                                        /* Definition de U(n). Le 20170921132941, 'U_0' a ete introduit afin d'avoir la memoire      */
                                        /* du premier element de la suite...                                                         */

     DEFV(Int,INIT(diviseur,DIVISEUR));
     DEFV(Int,INIT(alpha___,ALPHA___));
     DEFV(Int,INIT(beta____,BETA____));
                                        /* Definition des parametres.                                                                */

     DEFV(Logical,INIT(s_arreter_sur_la_suite_4_2_1,S_ARRETER_SUR_LA_SUITE_4_2_1));
                                        /* Pour savoir s'il faut s'arreter sur la premiere occurence de {4,2,1} ? Ceci fut introduit */
                                        /* le 20130116093539.                                                                        */
     DEFV(Int,INIT(valeur_d_arret,VALEUR_D_ARRET));
                                        /* Valeur d'arret, le '1' de {4,2,1} etant le plus logique (introduit le 20130124120331).    */

     DEFV(Int,INIT(rang_initial_d_apparition_de_la_suite_4_2_1,RANG_INITIAL_D_APPARITION_DE_LA_SUITE_4_2_1));
     DEFV(Int,INIT(rang_d_apparition_de_la_suite_4_2_1,UNDEF));
                                        /* Afin de savoir, par exemple, a partir de quand apparait {4,2,1} ? Ceci fut introduit      */
                                        /* le 20110304163403...                                                                      */

     DEFV(Logical,INIT(editer_la_parite_des_elements_de_la_suite,EDITER_LA_PARITE_DES_ELEMENTS_DE_LA_SUITE));
                                        /* Faut-il editer la valeur des elements U(n) de la suite ('FAUX') ou bien leur parite       */
                                        /* ('VRAI') ? Cela fut introduit le 20190418100936...                                        */
     DEFV(Logical,INIT(editer_les_pourcentages_pairs_impairs,EDITER_LES_POURCENTAGES_PAIRS_IMPAIRS));
     DEFV(Positive,INIT(nombre_d_elements_de_la_suite,ZERO));
     DEFV(Positive,INIT(nombre_d_elements___pairs_de_la_suite,ZERO));
     DEFV(Positive,INIT(nombre_d_elements_impairs_de_la_suite,ZERO));
                                        /* Faut-il editer le pourcentage des elements U(n) pairs et impairs ('VRAI') ou pas          */
                                        /* ('FAUX') ? Cela fut introduit le 20200610105720...                                        */

     DEFV(Logical,INIT(editer_des_informations_sur_la_suite,EDITER_DES_INFORMATIONS_SUR_LA_SUITE));
     DEFV(Logical,INIT(n_editer_que_le_rang_d_apparition_de_la_suite_4_2_1,N_EDITER_QUE_LE_RANG_D_APPARITION_DE_LA_SUITE_4_2_1));
                                        /* Afin de savoir, par exemple, a partir de quand apparait {4,2,1} ? Ceci fut introduit      */
                                        /* le 20110304163403 et complete par 'n_editer_que_le_rang_d_apparition_de_la_suite_4_2_1'   */
                                        /* le 20170913152542...                                                                      */

#include  xci/valeurs.03.I"
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("compatibilite_20150413=",compatibilite_20150413);

                         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_I("un=""Un=""u0=""U0=",U_0);

                         GET_ARGUMENT_I("diviseur=""div=",diviseur);
                         GET_ARGUMENT_I("alpha=""a=",alpha___);
                         GET_ARGUMENT_I("beta=""b=",beta____);

                         GET_ARGUMENT_L("stop_421=""stop=",s_arreter_sur_la_suite_4_2_1);
                                        /* Argument introduit le 20130116093539...                                                   */
                         GET_ARGUMENT_I("valeur_arret=""arret=",valeur_d_arret);
                                        /* Argument introduit le 20130124120331...                                                   */

                         GET_ARGUMENT_I("rang_initial_421=""rang_initial=""rang=",rang_initial_d_apparition_de_la_suite_4_2_1);
                                        /* Argument introduit le 20110305104043...                                                   */

                         GET_ARGUMENT_L("editer_parite""parite=""ep=",editer_la_parite_des_elements_de_la_suite);
                                        /* Argument introduit le 20190418100936...                                                   */
                         GET_ARGUMENT_L("pourcentages_pairs_impairs=""ppi=",editer_les_pourcentages_pairs_impairs);
                                        /* Argument introduit le 20200610105720...                                                   */

                         GET_ARGUMENT_L("editer=""informations=""info=",editer_des_informations_sur_la_suite);
                                        /* Argument introduit le 20110304163403...                                                   */
                         GET_ARGUMENT_L("rang_421_seul=""rang_seul=""rs=",n_editer_que_le_rang_d_apparition_de_la_suite_4_2_1);
                                        /* Argument introduit le 20170913152542...                                                   */

                         PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
                         )
                    );

     Test(IFLE(premiere_image,derniere_image))
          Bblock
          DEFV(Logical,INIT(on_a_rencontre_la_suite_4_2_1,FAUX));

          EGAL(rang_d_apparition_de_la_suite_4_2_1,rang_initial_d_apparition_de_la_suite_4_2_1);
          EGAL(U_n,U_0);

          Test(I3OU(IFNE(diviseur,DIVISEUR)
                   ,IFNE(alpha___,ALPHA___)
                   ,IFNE(beta____,BETA____)
                    )
               )
               Bblock
               Test(IL_FAUT(editer_des_informations_sur_la_suite))
                    Bblock
                    PRINT_ERREUR("l'edition des informations n'a de sens que pour la suite de Syracuse");

                    EGAL(editer_des_informations_sur_la_suite,FAUX);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(s_arreter_sur_la_suite_4_2_1))
                                        /* Test introduit le 20130116100616...                                                       */
                    Bblock
                    PRINT_ERREUR("l'arret sur la sous-suite {4,2,1} n'a de sens que pour la suite de Syracuse");

                    EGAL(s_arreter_sur_la_suite_4_2_1,FAUX);
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images)
               Bblock
               Test(IFOU(IL_NE_FAUT_PAS(s_arreter_sur_la_suite_4_2_1)
                        ,IFET(IL_FAUT(s_arreter_sur_la_suite_4_2_1)
                             ,EST_FAUX(on_a_rencontre_la_suite_4_2_1)
                              )
                         )
                    )
                                        /* Test introduit le 20130116093539...                                                       */
                    Bblock
                    Test(IL_FAUT(editer_les_pourcentages_pairs_impairs))
                                        /* Test introduit le 20200610105720...                                                       */
                         Bblock
                         INCR(nombre_d_elements_de_la_suite,I);
                         INCR(nombre_d_elements___pairs_de_la_suite,COND(EST_PAIR(U_n),I,ZERO));
                         INCR(nombre_d_elements_impairs_de_la_suite,COND(EST_IMPAIR(U_n),I,ZERO));
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    Test(IFET(IL_FAUT(editer_des_informations_sur_la_suite)
                             ,IL_FAUT(n_editer_que_le_rang_d_apparition_de_la_suite_4_2_1)
                              )
                         )
                                        /* Test introduit le 20170913152542...                                                       */
                         Bblock
                         Eblock
                    ATes
                         Bblock
                         Test(IL_FAUT(editer_la_parite_des_elements_de_la_suite))
                                        /* Test introduit le 20190418100936...                                                       */
                              Bblock
                              CAL2(Prin1("%d\n"
                                        ,PARI(U_n)
                                         )
                                   );
                              Eblock
                         ATes
                              Bblock
                              CAL2(Prin1(Cara(chain_Aconcaten4(INTRODUCTION_FORMAT,valeurs_signees,"d","\n"))
                                        ,U_n
                                         )
                                   );
                              Eblock
                         ETes
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(EST_FAUX(on_a_rencontre_la_suite_4_2_1))
                    Bblock
                    Test(IFEQ(U_n,valeur_d_arret))
                                        /* Le 20130116093539 le test qui portait sur 'QUATRE' a ete complete par un test portant     */
                                        /* sur 'UN' afin d'avoir la sous-suite {4,2,1} complete...                                   */
                                        /*                                                                                           */
                                        /* Le 20130124120331, le test :                                                              */
                                        /*                                                                                           */
                                        /*                  Test(IFEQ(U_n,COND(IL_FAUT(s_arreter_sur_la_suite_4_2_1),UN,QUATRE)))    */
                                        /*                                                                                           */
                                        /* a ete simplifier avec l'introduction de 'valeur_d_arret'...                               */
                         Bblock
                         EGAL(on_a_rencontre_la_suite_4_2_1,VRAI);
                         Eblock
                    ATes
                         Bblock
                         INCR(rang_d_apparition_de_la_suite_4_2_1,I);
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(U_n
                   ,COND(IFOU(IFET(IL_FAUT(compatibilite_20150413),EST_PAIR(U_n))
                             ,IFET(IL_NE_FAUT_PAS(compatibilite_20150413),DIVISIBLE(U_n,diviseur))
                              )
                        ,DIVI(U_n,diviseur)
                        ,AXPB(alpha___,U_n,beta____)
                         )
                    );
                                        /* Calcul de la suite de Syracuse "generalisee" :                                            */
                                        /*                                                                                           */
                                        /*                  U  = U    / D       si U    est pair,                                    */
                                        /*                   n    n-1               n-1                                              */
                                        /*                                                                                           */
                                        /*                  U  = A * U    + B   si U    est impair,                                  */
                                        /*                   n        n-1           n-1                                              */
                                        /*                                                                                           */
                                        /* avec :                                                                                    */
                                        /*                                                                                           */
                                        /*                  D = diviseur = 2                                                         */
                                        /*                  A = alpha    = 3                                                         */
                                        /*                  B = beta     = 1                                                         */
                                        /*                                                                                           */
                                        /* et :                                                                                      */
                                        /*                                                                                           */
                                        /*                  U  = 1                                                                   */
                                        /*                   0                                                                       */
                                        /*                                                                                           */
                                        /* par defaut.                                                                               */
                                        /*                                                                                           */
                                        /* La conjecture enonce que, pour {D=2,A=3,B=1}, quel que soit 'U(0)' de depart, a un        */
                                        /* moment apparait de facon periodique la suite {4,2,1} et ce jusqu'a la fin des temps...    */
               Eblock
          EDoI

          Test(IL_FAUT(s_arreter_sur_la_suite_4_2_1))
                                        /* Test introduit le 20130124075440...                                                       */
               Bblock
               Test(EST_FAUX(on_a_rencontre_la_suite_4_2_1))
                                        /* Test essentiel introduit le 20130124075440...                                             */
                    Bblock
                    Test(IFEQ(valeur_d_arret,VALEUR_D_ARRET))
                         Bblock
                         PRINT_ATTENTION("la suite {4,2,1} n'a pas ete atteinte");
                         Eblock
                    ATes
                         Bblock
                         PRINT_ATTENTION("la valeur d'arret n'a pas ete atteinte");
                         Eblock
                    ETes

                    CAL1(Prer2("(U(0)=%d NombreIterations=%d)\n"
                              ,U_0
                              ,NBRE(premiere_image,derniere_image)
                               )
                         );
                                        /* Edition introduite le 20170913152542...                                                   */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          Test(IL_FAUT(editer_des_informations_sur_la_suite))
               Bblock
               Test(EST_VRAI(on_a_rencontre_la_suite_4_2_1))
                    Bblock
                    Test(IL_FAUT(n_editer_que_le_rang_d_apparition_de_la_suite_4_2_1))
                         Bblock
                         CAL2(Prin1("%d\n"
                                   ,rang_d_apparition_de_la_suite_4_2_1
                                    )
                              );
                                        /* Edition introduite le 20170913152542...                                                   */
                         Eblock
                    ATes
                         Bblock
                         CAL2(Prin2("Rang (par rapport a %d) d'apparition de la suite {4,2,1}=%d\n"
                                   ,rang_initial_d_apparition_de_la_suite_4_2_1
                                   ,rang_d_apparition_de_la_suite_4_2_1
                                    )
                              );
                                        /* Evidemment cela n'a de sens que pour la suite de Syracuse...                              */
                                        /*                                                                                           */
                                        /* On notera que le rang est compte a partir de 0 et c'est cette valeur que l'on edite ici   */
                                        /* dans le cas ou :                                                                          */
                                        /*                                                                                           */
                                        /*                  U  = 4                                                                   */
                                        /*                   0                                                                       */
                                        /*                                                                                           */
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(editer_les_pourcentages_pairs_impairs))
                    Bblock
                    CAL2(Prin1("NombreElements=%d\n"
                              ,nombre_d_elements_de_la_suite
                               )
                         );
                    CAL2(Prin2("NombreElementsPairs=%d, soit %.2f%%\n"
                              ,nombre_d_elements___pairs_de_la_suite
                              ,CONVERTIR_EN_UN_POURCENTAGE(nombre_d_elements___pairs_de_la_suite,nombre_d_elements_de_la_suite)
                               )
                         );
                    CAL2(Prin2("NombreElementsImpairs=%d, soit %.2f%%\n"
                              ,nombre_d_elements_impairs_de_la_suite
                              ,CONVERTIR_EN_UN_POURCENTAGE(nombre_d_elements_impairs_de_la_suite,nombre_d_elements_de_la_suite)
                               )
                         );
                                        /* Editions introduites le 20200610105720...                                                 */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               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.