/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E S N O M B R E S R A T I O N N E L S : */
/* */
/* */
/* Author of '$xci/valeurs_ArbreSternBrocot$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20220802132730). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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 : */
/* */
/*************************************************************************************************************************************/
#define PROFONDEUR_DE_L_ARBRE \
TROIS \
/* Profondeur de l'arbre a generer. */
#define TRIER_LES_NOMBRES_RATIONNELS_PAR_ORDRE_CROISSANT \
VRAI
#define UTILISER_LE_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE \
VRAI
/* Doit-on ('VRAI') ou pas ('FAUX') trier les nombres rationnels par ordre croissant ? */
#define EDITER_LES_VALEURS_DECIMALES \
FAUX \
/* Faut-il editer les valeurs decimales utiliser pour le tri ('VRAI') ou pas ('FAUX') ? */ \
/* ceci a ete introduit le 20220816135310... */
#include xci/valeurs.01.I"
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#include xci/valeurs.02.I"
#define PROFONDEUR_MAXIMALE_DE_L_ARBRE \
VINGT_QUATRE \
/* Profondeur maximale de l'arbre a generer... */
#define LONGUEUR_DES_LISTES(profondeur) \
PRED(INTE(DECG(UN,profondeur))) \
/* Longueur utile des listes qui est donc egale a une puissance de 2 moins 1. On notera */
/* que l'on ne peut pas utiliser 'PRED(INTE(PUIX(DEUX,profondeur)))' au niveau 'Local'... */
#define LONGUEUR_MAXIMALE_DES_LISTES \
LONGUEUR_DES_LISTES(PROFONDEUR_MAXIMALE_DE_L_ARBRE) \
/* Profondeur maximale de l'arbre a generer. */
#define LONGUEUR_COURANTE_DES_LISTES \
LONGUEUR_DES_LISTES(profondeur_de_l_arbre)
#define INDEX_DU_PREMIER_NOMBRE_RATIONNEL \
INDEX0
#define INDEX_DU_DERNIER_NOMBRE_RATIONNEL \
LSTX(INDEX_DU_PREMIER_NOMBRE_RATIONNEL,LONGUEUR_COURANTE_DES_LISTES)
/* Definition de la zone utile des listes... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F O N C T I O N D E C A L C U L D ' U N N O M B R E R A T I O N N E L : */
/* */
/*************************************************************************************************************************************/
DEFV(Local,DEFV(Positive,INIT(profondeur_de_l_arbre,PROFONDEUR_DE_L_ARBRE)));
DEFV(Local,DEFV(Positive,INIT(profondeur_courante_de_l_arbre,ZERO)));
/* Profondeur de l'arbre a generer et profondeur courante au cours de la generation... */
DEFV(Local,DEFV(Float,DdTb1(POINTERf
,liste_des_nombres_decimaux
,LONGUEUR_MAXIMALE_DES_LISTES
,ADRESSE_NON_ENCORE_DEFINIE
)
)
);
DEFV(Local,DEFV(fractionI,DdTb1(POINTERs
,liste_des_nombres_rationnels
,LONGUEUR_MAXIMALE_DES_LISTES
,ADRESSE_NON_ENCORE_DEFINIE
)
)
);
DEFV(Local,DEFV(Int,DdTb1(POINTERi
,liste_des_index_des_nombres_rationnels
,LONGUEUR_MAXIMALE_DES_LISTES
,ADRESSE_NON_ENCORE_DEFINIE
)
)
);
/* Listes utiles... */
DEFV(Local,DEFV(Int,INIT(index_courant_des_nombres_rationnels,INDEX0)));
/* Index de rangement dans les listes utiles... */
BFonctionV
DEFV(Local,DEFV(FonctionV,CalculDuNombreRationnelSuivant(NombreRationnel_Gauche_______,NombreRationnel_Droite_______)))
DEFV(Argument,DEFV(fractionI,NombreRationnel_Gauche_______));
DEFV(Argument,DEFV(fractionI,NombreRationnel_Droite_______));
/* Couple de nombres rationnels Argument donnant naissance a un nombre rationnel Resultat. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(fractionI,NombreRationnel_MoyenneMediane);
/*..............................................................................................................................*/
INCR(profondeur_courante_de_l_arbre,I);
/* Montee dans l'arbre... */
MOYENNE_MEDIANE_DE_DEUX_FRACTIONS(NombreRationnel_MoyenneMediane,NombreRationnel_Gauche_______,NombreRationnel_Droite_______)
/* Calcul de la moyenne mediane de {Gauche,Droite}... */
TRANSFERT_FRACTION(IdTb1sd(liste_des_nombres_rationnels,index_courant_des_nombres_rationnels),NombreRationnel_MoyenneMediane);
/* Memorisation de la moyenne mediane qui est donc le nombre rationnel courant... */
EGAL(IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant_des_nombres_rationnels),index_courant_des_nombres_rationnels);
/* Memorisation de l'index du nombre rationnel courant, cette liste etant {0,1,2,...} */
/* avant le tri eventuel... */
EGAL(IdTb1sd(liste_des_nombres_decimaux,index_courant_des_nombres_rationnels)
,DIVI(FLOT(NumerateurFraction__(NombreRationnel_MoyenneMediane)),FLOT(DenominateurFraction(NombreRationnel_MoyenneMediane)))
);
/* Memorisation du nombre rationnel courant en nombre decimal afin de pouvoir faire ensuite */
/* et si besoin est un tri par valeur croissante... */
INCR(index_courant_des_nombres_rationnels,I);
/* Progression de l'index de rangement dans les listes utiles... */
Test(IFLT(profondeur_courante_de_l_arbre,profondeur_de_l_arbre))
/* Cas ou l'on n'a pas encore atteint la profondeur de l'arbre... */
Bblock
CalculDuNombreRationnelSuivant(NombreRationnel_Gauche_______,NombreRationnel_MoyenneMediane);
/* Calcul du prochain nombre rationnel avec {Gauche,MoyenneMediane}... */
CalculDuNombreRationnelSuivant(NombreRationnel_MoyenneMediane,NombreRationnel_Droite_______);
/* Calcul du prochain nombre rationnel avec {MoyenneMediane,Droite}... */
Eblock
ATes
Bblock
/* Cas ou l'on a atteint la profondeur de l'arbre... */
Eblock
ETes
DECR(profondeur_courante_de_l_arbre,I);
/* Descente dans l'arbre... */
RETU_VIDE;
Eblock
EFonctionV
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E S N O M B R E S R A T I O N N E L S : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Logical,INIT(trier_les_nombres_rationnels_par_ordre_croissant,TRIER_LES_NOMBRES_RATIONNELS_PAR_ORDRE_CROISSANT));
DEFV(Logical,INIT(utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE
,UTILISER_LE_TRI_D_UNE_LISTE_QUELCONQUE_VERSION_N_AU_CARRE
)
);
/* Doit-on ('VRAI') ou pas ('FAUX') trier les nombres rationnels par ordre croissant ? */
DEFV(Logical,INIT(editer_les_valeurs_decimales,EDITER_LES_VALEURS_DECIMALES));
/* Faut-il editer les valeurs decimales utiliser pour le tri ('VRAI') ou pas ('FAUX') ? */
/* ceci a ete introduit le 20220816135310... */
#include xci/valeurs.03.I"
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_I("profondeur=""p=",profondeur_de_l_arbre);
GET_ARGUMENT_L("tri=""trier=""ordre_croissant=",trier_les_nombres_rationnels_par_ordre_croissant);
GET_ARGUMENT_N("ordre_calcul=",trier_les_nombres_rationnels_par_ordre_croissant);
GET_ARGUMENT_L("tri_N2=""N_carre=""N_au_carre=""N_AU_CARRE=""N2="
,utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE
);
GET_ARGUMENT_N("tri_NlogN=""NlN=""N_log_N=""N1=",utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE);
GET_ARGUMENT_L("editer=""valeurs_decimales=""evd=",editer_les_valeurs_decimales);
/* Parametre introduit le 20220816135310. */
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1;
)
);
Test(IFGT(profondeur_de_l_arbre,PROFONDEUR_MAXIMALE_DE_L_ARBRE))
Bblock
PRINT_ERREUR("la profondeur de l'arbre est trop importante");
EGAL(profondeur_de_l_arbre,PROFONDEUR_MAXIMALE_DE_L_ARBRE);
CAL1(Prer1("(la valeur %d maximale est forcee)\n",profondeur_de_l_arbre));
Eblock
ATes
Bblock
Eblock
ETes
begin_nouveau_block
Bblock
MdTb1(liste_des_nombres_decimaux
,LONGUEUR_COURANTE_DES_LISTES
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
MdTb1(liste_des_nombres_rationnels
,LONGUEUR_COURANTE_DES_LISTES
,fractionI
,ADRESSE_NON_ENCORE_DEFINIE
);
MdTb1(liste_des_index_des_nombres_rationnels
,LONGUEUR_COURANTE_DES_LISTES
,Int
,ADRESSE_NON_ENCORE_DEFINIE
);
begin_nouveau_block
Bblock
DEFV(fractionI,INIS(NombreRationnel_01,IstructL02(ZERO,UN)));
DEFV(fractionI,INIS(NombreRationnel_10,IstructL02(UN,ZERO)));
CalculDuNombreRationnelSuivant(NombreRationnel_01,NombreRationnel_10);
/* Lancement du processus a partir des nombres rationnels 0/1 et 1/0 (=infini)... */
Eblock
end_nouveau_block
DECR(index_courant_des_nombres_rationnels,I);
/* Ne sert a rien, mais par pure hygiene... */
Test(IL_FAUT(trier_les_nombres_rationnels_par_ordre_croissant))
Bblock
TRI_D_UNE_LISTE_QUELCONQUE(liste_des_nombres_decimaux
,liste_des_index_des_nombres_rationnels
,INDEX_DU_PREMIER_NOMBRE_RATIONNEL
,INDEX_DU_DERNIER_NOMBRE_RATIONNEL
,FAUX
,utiliser_le_tri_d_une_liste_quelconque_VERSION_N_AU_CARRE
,IdTb1sd
);
/* Passage de l'ordre du calcul a l'ordre croissant... */
Eblock
ATes
Bblock
Eblock
ETes
begin_nouveau_block
Bblock
DEFV(Int,INIT(index_courant,UNDEF));
DoIn(index_courant,INDEX_DU_PREMIER_NOMBRE_RATIONNEL,INDEX_DU_DERNIER_NOMBRE_RATIONNEL,I)
Bblock
CAL2(Prin2("%d/%d"
,NumerateurFraction__(IdTb1sd(liste_des_nombres_rationnels
,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant)
)
)
,DenominateurFraction(IdTb1sd(liste_des_nombres_rationnels
,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant)
)
)
)
);
/* Edition des nombres rationnels dans un certain ordre... */
Test(IL_FAUT(editer_les_valeurs_decimales))
/* Test introduit le 20220816135310... */
Bblock
CAL2(Prin1("=%+.^^^"
,IdTb1sd(liste_des_nombres_decimaux
,IdTb1sd(liste_des_index_des_nombres_rationnels,index_courant)
)
)
);
/* Edition eventuelle des valeurs decimales des nombres rationnels... */
Eblock
ATes
Bblock
Eblock
ETes
CAL2(Prin0("\n"));
Eblock
EDoI
Eblock
end_nouveau_block
FdTb1(liste_des_index_des_nombres_rationnels
,LONGUEUR_MAXIMALE_DES_LISTES
,Int
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_nombres_rationnels
,LONGUEUR_MAXIMALE_DES_LISTES
,fractionI
,ADRESSE_NON_ENCORE_DEFINIE
);
FdTb1(liste_des_nombres_decimaux
,LONGUEUR_MAXIMALE_DES_LISTES
,Float
,ADRESSE_NON_ENCORE_DEFINIE
);
Eblock
end_nouveau_block
RETU_Commande;
Eblock
ECommande
Copyright © Jean-François COLONNA, 2022-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.