/*************************************************************************************************************************************/ /* */ /* P R E M I E R E S G E N E R A T I O N S D E N O M B R E S S U R R E E L S : */ /* */ /* */ /* Author of '$xtc/NombresSurReels.01$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20081106162832). */ /* */ /*************************************************************************************************************************************/ #include <stdio.h> #define EditerDesFractions \ VRAI #define PremierJour \ 0 #define DernierJour \ 4 /* Definition du temps : evidemment, 'DernierJour' devrait etre infini... */ #define OrigineSpatiale \ 0 #define DenominateurNombreEntier \ 1 #define Successeur \ 1 #define Pred(x) \ ((x)-Successeur) #define Neut(x) \ (x) #define Succ(x) \ ((x)+Successeur) /* Definition des fonctions {Predecesseur,Neutre,Successeur}. */ #define Dyadique \ 2 #define Dyad(x) \ (Dyadique*(x)) /* Definition de la fonction {Dyadique}. */ #define VRAI \ 1 #define FAUX \ 0 typedef struct { int Numerateur; unsigned int Denominateur; } Fraction; /* Definition d'une fraction (nombre rationnel). */ #define Numer(fraction) \ (fraction.Numerateur) #define Denom(fraction) \ (fraction.Denominateur) #define EGAL(fraction,numerateur,denominateur) \ { \ Numer(fraction) = numerateur; \ Denom(fraction) = denominateur; \ } void GenerationDesNombresSurReels(JourCourant,NombreSurReelDuJourCourant) int JourCourant; Fraction NombreSurReelDuJourCourant; { if (JourCourant <= DernierJour) { Fraction NombreSurReelDuJourCourantSimplifie; Fraction NombreSurReelDuJourSuivantLeft_,NombreSurReelDuJourSuivantRight; EGAL(NombreSurReelDuJourCourantSimplifie,Numer(NombreSurReelDuJourCourant),Denom(NombreSurReelDuJourCourant)); if ( (Numer(NombreSurReelDuJourCourant) != OrigineSpatiale) && (Denom(NombreSurReelDuJourCourant) != DenominateurNombreEntier) ) { int iterer=VRAI; while (iterer == VRAI) { if ( ((Numer(NombreSurReelDuJourCourantSimplifie)%Dyadique) == 0) && ((Denom(NombreSurReelDuJourCourantSimplifie)%Dyadique) == 0) ) { EGAL(NombreSurReelDuJourCourantSimplifie ,Numer(NombreSurReelDuJourCourantSimplifie)/Dyadique ,Denom(NombreSurReelDuJourCourantSimplifie)/Dyadique ); /* Simplification de la fraction 'NombreSurReelDuJourCourant'. */ } else { iterer=FAUX; } } } else { } if (EditerDesFractions == VRAI) { if (Denom(NombreSurReelDuJourCourantSimplifie) > DenominateurNombreEntier) { printf("jour=%d nombre=%+d/%d\n" ,JourCourant ,Numer(NombreSurReelDuJourCourantSimplifie) ,Denom(NombreSurReelDuJourCourantSimplifie) ); /* Edition de la fraction irreductible 'NombreSurReelDuJourCourant'. */ } else { printf("jour=%d nombre=%+d\n" ,JourCourant ,Numer(NombreSurReelDuJourCourantSimplifie)/Denom(NombreSurReelDuJourCourantSimplifie) ); /* Edition du nombre entier 'NombreSurReelDuJourCourant'. */ } } else { printf("jour=%d nombre=%+.16f\n" ,JourCourant ,(double)Numer(NombreSurReelDuJourCourantSimplifie) /(double)Denom(NombreSurReelDuJourCourantSimplifie) ); /* Edition du 'NombreSurReelDuJourCourant' sous forme decimale afin de permettre en sortie */ /* un tri croissant et numerique... */ } if (Denom(NombreSurReelDuJourCourant) == DenominateurNombreEntier) { /* Cas des nombres SurReels extremaux (negatif, positif et evidemment cas particulier de */ /* l'origine...) : */ if (Numer(NombreSurReelDuJourCourant) < 0) { EGAL(NombreSurReelDuJourSuivantLeft_ ,Pred(Numer(NombreSurReelDuJourCourant)) ,Neut(Denom(NombreSurReelDuJourCourant)) ); EGAL(NombreSurReelDuJourSuivantRight ,Succ(Dyad(Numer(NombreSurReelDuJourCourant))) ,Neut(Dyad(Denom(NombreSurReelDuJourCourant))) ); /* Fils de gauche ("Left_") et de droite ("Right") du nombre SurReel le plus negatif... */ } else { if (Numer(NombreSurReelDuJourCourant) == 0) { EGAL(NombreSurReelDuJourSuivantLeft_ ,Pred(Numer(NombreSurReelDuJourCourant)) ,Neut(Denom(NombreSurReelDuJourCourant)) ); EGAL(NombreSurReelDuJourSuivantRight ,Succ(Numer(NombreSurReelDuJourCourant)) ,Neut(Denom(NombreSurReelDuJourCourant)) ); /* Fils de gauche ("Left_") et de droite ("Right") du nombre SurReel 0={O|O}... */ } else { if (Numer(NombreSurReelDuJourCourant) > 0) { EGAL(NombreSurReelDuJourSuivantLeft_ ,Pred(Dyad(Numer(NombreSurReelDuJourCourant))) ,Neut(Dyad(Denom(NombreSurReelDuJourCourant))) ); EGAL(NombreSurReelDuJourSuivantRight ,Succ(Numer(NombreSurReelDuJourCourant)) ,Neut(Denom(NombreSurReelDuJourCourant)) ); } /* Fils de gauche ("Left_") et de droite ("Right") du nombre SurReel le plus positif... */ else { printf("ERREUR...\n"); } } } } else { EGAL(NombreSurReelDuJourSuivantLeft_ ,Pred(Dyad(Numer(NombreSurReelDuJourCourant))) ,Neut(Dyad(Denom(NombreSurReelDuJourCourant))) ); EGAL(NombreSurReelDuJourSuivantRight ,Succ(Dyad(Numer(NombreSurReelDuJourCourant))) ,Neut(Dyad(Denom(NombreSurReelDuJourCourant))) ); /* Cas des autres nombres SurReels, c'est-a-dire ceux qui ne sont pas extremaux... */ } GenerationDesNombresSurReels(JourCourant+Successeur,NombreSurReelDuJourSuivantLeft_); /* Calcul des deux "fils" du nombre SurReel 'NombreSurReelDuJourSuivantLeft_'... */ GenerationDesNombresSurReels(JourCourant+Successeur,NombreSurReelDuJourSuivantRight); /* Calcul des deux "fils" du nombre SurReel 'NombreSurReelDuJourSuivantRight'... */ } else { /* Cas ou l'on a genere suffisamment de generations de nombres SurReels... */ } } main() { Fraction NombreSurReelOrigine; EGAL(NombreSurReelOrigine,OrigineSpatiale,DenominateurNombreEntier); GenerationDesNombresSurReels(PremierJour,NombreSurReelOrigine); /* Calcul des deux "fils" du nombre SurReel "origine"... */ }