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