/*************************************************************************************************************************************/ /* */ /* 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