/*************************************************************************************************************************************/ /* */ /* E T U D E D E L A S U I T E D E S Y R A C U S E : */ /* */ /* */ /* Author of '$xrk/Syracuse.11.2$I' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20130115141203). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define INCREMENTER_LE_NIVEAU_DE_MARQUAGE(niveau_de_marquage_courant) \ Bblock \ INCR(niveau_de_marquage_courant,PAS_COULEURS); \ /* Ainsi, le niveau de marquage evolue pour chaque nouveau couple de nombres premiers... */ \ \ Test(IFEXff(niveau_de_marquage_courant,NOIR_PLANCHER,BLANC)) \ Bblock \ EGAL(niveau_de_marquage_courant,NOIR_PLANCHER); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure introduite le 20130115101940... */ #define CALCUL_D_UNE_SUITE_DE_SYRACUSE(U0) \ Bblock \ DEFV(Int,INIT(U_n,AXPB(homothetie__U0,U0,translation_U0))); \ /* Definition de U(n) (La transformation de 'U(0)' a ete introduite le 20130115180211). */ \ \ DEFV(Logical,INIT(iterer,VRAI)); \ DEFV(Int,INIT(nombre_d_iterations,ZERO)); \ /* Controle des iterations sachant que l'on s'arrete sur le premier 4 rencontre ou bien si */ \ /* le nombre d'iterations maximal est atteint... */ \ DEFV(Int,INIT(rang_d_apparition_de_la_valeur_d_arret \ ,rang_initial_d_apparition_de_la_valeur_d_arret \ ) \ ); \ DEFV(Logical,INIT(on_a_rencontre_la_valeur_d_arret,FAUX)); \ /* Afin de savoir a partir de quand apparait {4,2,1} ? */ \ DEFV(genere_p,INIT(niveau_de_marquage_courant_fonction_du_rang,NOIR_PLANCHER)); \ /* Niveau de marquage courant a l'aide du rang 'n'... */ \ \ Test(IL_FAUT(editer_les_suites)) \ Bblock \ CALS(FPrme0("=")); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Tant(IL_FAUT(iterer)) \ Bblock \ Test(EST_FAUX(on_a_rencontre_la_valeur_d_arret)) \ Bblock \ Test(IL_FAUT(editer_les_suites)) \ Bblock \ Test(IL_FAUT(visualiser_la_parite_des_elements_de_la_suite)) \ Bblock \ CAL3(Prme1(" %d",PARI(U_n))); \ Eblock \ ATes \ Bblock \ CAL3(Prme1(" %d",U_n)); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ store_point_valide(COND(IL_FAUT(visualiser_la_parite_des_elements_de_la_suite) \ ,COND(EST_PAIR(U_n) \ ,niveau_de_la_parite___paire \ ,COND(EST_IMPAIR(U_n) \ ,niveau_de_la_parite_impaire \ ,NIVEAU_UNDEF \ ) \ ) \ /* Il n'est en fait pas tres utile de tester 'EST_IMPAIR(...)' mais je le fait malgre tout, */ \ /* par "symetrie"... */ \ ,COND(IL_FAUT(visualiser_a_l_aide_du_rang_dans_la_suite) \ ,niveau_de_marquage_courant_fonction_du_rang \ ,niveau_de_marquage_courant_fonction_de_U0 \ ) \ ) \ ,ImageR \ ,X,COYA(SOUS(U_n,premier_nombre_entier)) \ ,FVARIABLE \ ); \ /* La visualisation de la parite a ete introduite le 20190418105441... */ \ \ Test(IFEQ(U_n,valeur_d_arret)) \ Bblock \ EGAL(on_a_rencontre_la_valeur_d_arret,VRAI); \ EGAL(iterer,FAUX); \ /* C'est termine... */ \ Eblock \ ATes \ Bblock \ INCR(rang_d_apparition_de_la_valeur_d_arret,I); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(U_n \ ,COND(EST_PAIR(U_n) \ ,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 quel que soit 'U(0)' de depart, a un moment apparait de facon */ \ /* periodique (et alors jusqu'a la fin des temps...) la suite {4,2,1}... */ \ \ INCR(nombre_d_iterations,I); \ \ Test(IFGE(nombre_d_iterations,nombre_maximal_d_iterations)) \ Bblock \ EGAL(iterer,FAUX); \ /* On a fait trop d'iterations : on arrete... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ INCREMENTER_LE_NIVEAU_DE_MARQUAGE(niveau_de_marquage_courant_fonction_du_rang); \ /* Ainsi, le niveau de marquage evolue pour chaque nouveau couple de nombres premiers... */ \ Eblock \ ETan \ \ INCREMENTER_LE_NIVEAU_DE_MARQUAGE(niveau_de_marquage_courant_fonction_de_U0); \ /* Ainsi, le niveau de marquage evolue pour chaque nouvelle suite... */ \ \ Test(IL_FAUT(editer_les_suites)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure calculant 'U(n)' a partir de 'U(0)'... */