/*************************************************************************************************************************************/ /* */ /* E T U D E E X H A U S T I V E D U P A R A D O X E D E S I M P S O N : */ /* */ /* */ /* Author of '$xtc/ParadoxeSimpson.21$vv$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20130405145848). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" #define dimX \ EXP4(BorneSuperieure-BorneInferieure+1) #define dimY \ dimX #define IMAGE(x,y) \ (*(image + (((y)*dimX) + (x)))) int GenererUneImage=FAUX; /* Cet indicateur lorsqu'il est VRAI permet de generer une image (introduit le */ /* 20130415093456). */ int EditerLesTableauxParadoxaux=FAUX; /* Cet indicateur lorsqu'il est VRAI permet d'editer les tableaux interessants */ /* (introduit le 20130416183750). */ #define BORNE_INFERIEURE \ 1 long int BorneInferieure=BORNE_INFERIEURE; #define BORNE_SUPERIEURE \ 5 long int BorneSuperieure=BORNE_SUPERIEURE; #define BORNE_PAS \ 1 long int BornePas=BORNE_PAS; /* Notations : */ /* */ /* H Homme */ /* F Femme */ /* m Medicament */ /* p Placebo */ /* NG Non Gueri */ /* G Gueri */ /* */ #define v____Gm ((vH___Gm)+(vF___Gm)) #define v____Gp ((vH___Gp)+(vF___Gp)) #define v___NGm ((vH__NGm)+(vF__NGm)) #define v___NGp ((vH__NGp)+(vF__NGp)) /* Definition du tableau {1}. */ #define vH___Gm H___Gm #define vH___Gp H___Gp #define vH__NGm H__NGm #define vH__NGp H__NGp /* Definition du tableau {2}. */ #define vF___Gm F___Gm #define vF___Gp F___Gp #define vF__NGm F__NGm #define vF__NGp F__NGp /* Definition du tableau {3}. */ #define v____GNGm ((v____Gm)+(v___NGm)) #define v____GNGp ((v____Gp)+(v___NGp)) #define vH___GNGm ((vH___Gm)+(vH__NGm)) #define vH___GNGp ((vH___Gp)+(vH__NGp)) #define vF___GNGm ((vF___Gm)+(vF__NGm)) #define vF___GNGp ((vF___Gp)+(vF__NGp)) #define wH___Gm ((vH___Gm)/(vH___GNGm)) #define wH___Gp ((vH___Gp)/(vH___GNGp)) #define wF___Gm ((vF___Gm)/(vF___GNGm)) #define wF___Gp ((vF___Gp)/(vF___GNGp)) #define w____Gm ((v____Gm)/(v____GNGm)) #define w____Gp ((v____Gp)/(v____GNGp)) void main() { unsigned char *image; /* Definition de l'image a generer... */ double H___Gm=36; double H__NGm=24; double H___Gp=14; double H__NGp=6; double F___Gm=4; double F__NGm=16; double F___Gp=18; double F__NGp=42; long int ComptageDeTousLesCas=0; long int ComptageDesCasParadoxauxMPP=0; long int ComptageDesCas_PP=0; long int ComptageDesCasParadoxauxPMM=0; long int ComptageDesCas_MM=0; gGetl(BorneInferieure,"BorneInferieure",BORNE_INFERIEURE); gGetl(BorneSuperieure,"BorneSuperieure",BORNE_SUPERIEURE); gGetl(BornePas,"BornePas",BORNE_PAS); /* Parametrage eventuel du nombre d'iterations afin de faciliter le lancement parallele... */ #define SI(pM,pP) COND((pM)>(pP),'>',COND((pM)<(pP),'<','=')) /* Procedure d'edition "Superieur-Inferieur"... */ if (GenererUneImage == FAUX) { printf("Cas par defaut :\n"); printf(" m...=%f %c p...=%f\n",w____Gm,SI(w____Gm,w____Gp),w____Gp); printf("Homme : m...=%f %c p...=%f\n",wH___Gm,SI(wH___Gm,wH___Gp),wH___Gp); printf("Femme : m...=%f %c p...=%f\n",wF___Gm,SI(wF___Gm,wF___Gp),wF___Gp); printf("\n"); /* Doit donner a priori les valeurs suivantes : */ /* */ /* m...=0.500000 > p...=0.400000 */ /* Homme : m...=0.600000 < p...=0.700000 */ /* Femme : m...=0.200000 < p...=0.300000 */ /* */ } else { image=malloc(dimY*dimX); /* Definition de l'image a generer... */ } for (H___Gm=BorneInferieure ; H___Gm <= BorneSuperieure ; H___Gm=H___Gm+BornePas) { for (H___Gp=BorneInferieure ; H___Gp <= BorneSuperieure ; H___Gp=H___Gp+BornePas) { for (H__NGm=BorneInferieure ; H__NGm <= BorneSuperieure ; H__NGm=H__NGm+BornePas) { for (H__NGp=BorneInferieure ; H__NGp <= BorneSuperieure ; H__NGp=H__NGp+BornePas) { for (F___Gm=BorneInferieure ; F___Gm <= BorneSuperieure ; F___Gm=F___Gm+BornePas) { for (F___Gp=BorneInferieure ; F___Gp <= BorneSuperieure ; F___Gp=F___Gp+BornePas) { for (F__NGm=BorneInferieure ; F__NGm <= BorneSuperieure ; F__NGm=F__NGm+BornePas) { for (F__NGp=BorneInferieure ; F__NGp <= BorneSuperieure ; F__NGp=F__NGp+BornePas) { int EditerLeTableauCourant=FAUX; /* A priori, les tableaux ne seront pas edites... */ int x; int y; #define NI(pM,pP) COND((pM)>(pP),2,COND((pM)<(pP),0,1)) unsigned char niveau; if ( (EditerLesTableauxParadoxaux == VRAI) || (GenererUneImage == VRAI) ) { #define BASE BorneSuperieure-BorneInferieure+1 #define xyHORNER(a,b,c,d) \ HORNER_1_03(BASE \ ,a-BorneInferieure \ ,b-BorneInferieure \ ,c-BorneInferieure \ ,d-BorneInferieure \ ) \ /* Procedure de multiplexage de 4 nombres... */ x=xyHORNER(H___Gm,H___Gp,H__NGm,H__NGp); y=xyHORNER(F___Gm,F___Gp,F__NGm,F__NGp); #define NI(pM,pP) COND((pM)>(pP),2,COND((pM)<(pP),0,1)) niveau=HORNER_1_02(10,NI(w____Gm,w____Gp),NI(wH___Gm,wH___Gp),NI(wF___Gm,wF___Gp)); /* Quelques valeurs interessantes : */ /* */ /* 022 ((w____Gm < w____Gp) && ((wH___Gm > wH___Gp) && (wF___Gm > wF___Gp))) */ /* */ /* 122 ((w____Gm = w____Gp) && ((wH___Gm > wH___Gp) && (wF___Gm > wF___Gp))) */ /* 222 ((w____Gm > w____Gp) && ((wH___Gm > wH___Gp) && (wF___Gm > wF___Gp))) */ /* */ /* en notant que : */ /* */ /* pM < pP NI(pM,pP)=0 */ /* pM = pP NI(pM,pP)=1 */ /* pM > pP NI(pM,pP)=2 */ /* */ /* Enfin, la base 10 est utilisee dans le schema de Horner ci-dessus, afin de "concatener" */ /* les trois valeurs de 'NI(...)'... */ /* */ /* */ /* Voici les 3x3x3=27 cas possibles : */ /* */ /* 000 w____Gm < w____Gp wH___Gm < wH___Gp wF___Gm < wF___Gp OK */ /* 001 w____Gm < w____Gp wH___Gm < wH___Gp wF___Gm = wF___Gp ? */ /* 002 w____Gm < w____Gp wH___Gm < wH___Gp wF___Gm > wF___Gp ? */ /* 010 w____Gm < w____Gp wH___Gm = wH___Gp wF___Gm < wF___Gp ? */ /* 011 w____Gm < w____Gp wH___Gm = wH___Gp wF___Gm = wF___Gp ? */ /* 012 w____Gm < w____Gp wH___Gm = wH___Gp wF___Gm > wF___Gp ? */ /* 020 w____Gm < w____Gp wH___Gm > wH___Gp wF___Gm < wF___Gp ? */ /* 021 w____Gm < w____Gp wH___Gm > wH___Gp wF___Gm = wF___Gp ? */ /* 022 w____Gm < w____Gp wH___Gm > wH___Gp wF___Gm > wF___Gp PARADOXE */ /* 100 w____Gm = w____Gp wH___Gm < wH___Gp wF___Gm < wF___Gp ? */ /* 101 w____Gm = w____Gp wH___Gm < wH___Gp wF___Gm = wF___Gp ? */ /* 102 w____Gm = w____Gp wH___Gm < wH___Gp wF___Gm > wF___Gp ? */ /* 110 w____Gm = w____Gp wH___Gm = wH___Gp wF___Gm < wF___Gp ? */ /* 111 w____Gm = w____Gp wH___Gm = wH___Gp wF___Gm = wF___Gp OK */ /* 112 w____Gm = w____Gp wH___Gm = wH___Gp wF___Gm > wF___Gp ? */ /* 120 w____Gm = w____Gp wH___Gm > wH___Gp wF___Gm < wF___Gp ? */ /* 121 w____Gm = w____Gp wH___Gm > wH___Gp wF___Gm = wF___Gp ? */ /* 122 w____Gm = w____Gp wH___Gm > wH___Gp wF___Gm > wF___Gp ? */ /* 200 w____Gm > w____Gp wH___Gm < wH___Gp wF___Gm < wF___Gp PARADOXE */ /* 201 w____Gm > w____Gp wH___Gm < wH___Gp wF___Gm = wF___Gp ? */ /* 202 w____Gm > w____Gp wH___Gm < wH___Gp wF___Gm > wF___Gp ? */ /* 210 w____Gm > w____Gp wH___Gm = wH___Gp wF___Gm < wF___Gp ? */ /* 211 w____Gm > w____Gp wH___Gm = wH___Gp wF___Gm = wF___Gp ? */ /* 212 w____Gm > w____Gp wH___Gm = wH___Gp wF___Gm > wF___Gp ? */ /* 220 w____Gm > w____Gp wH___Gm > wH___Gp wF___Gm < wF___Gp ? */ /* 221 w____Gm > w____Gp wH___Gm > wH___Gp wF___Gm = wF___Gp ? */ /* 222 w____Gm > w____Gp wH___Gm > wH___Gp wF___Gm > wF___Gp OK */ /* */ } else { } ComptageDeTousLesCas++; if ( (wH___Gm < wH___Gp) && (wF___Gm < wF___Gp) ) { ComptageDesCas_PP++; if (w____Gm > w____Gp) { ComptageDesCasParadoxauxMPP++; EditerLeTableauCourant=VRAI; } else { } } else { } if ( (wH___Gm > wH___Gp) && (wF___Gm > wF___Gp) ) { ComptageDesCas_MM++; if (w____Gm < w____Gp) { ComptageDesCasParadoxauxPMM++; EditerLeTableauCourant=VRAI; } else { } } else { } if (GenererUneImage == VRAI) { IMAGE(x,y) = niveau; } else { if (EditerLesTableauxParadoxaux == VRAI) { if (EditerLeTableauCourant == VRAI) { #define CHIFFRES 2 printf("CAS %03d au point (%d,%d)",niveau,x,y); printf(" [%d=(%d-%ld)x%ld^%d+(%d-%ld)x%ld^%d+(%d-%ld)x%ld^%d+(%d-%ld),%d=(%d-%ld)x%ld^%d+(%d-%ld)x%ld^%d+(%d-%ld)x%ld^%d+(%d-%ld)]\n" ,x ,(int)H___Gm,BorneInferieure,BASE,3 ,(int)H___Gp,BorneInferieure,BASE,2 ,(int)H__NGm,BorneInferieure,BASE,1 ,(int)H__NGp,BorneInferieure ,y ,(int)F___Gm,BorneInferieure,BASE,3 ,(int)F___Gp,BorneInferieure,BASE,2 ,(int)F__NGm,BorneInferieure,BASE,1 ,(int)F__NGp,BorneInferieure ); printf("\n"); printf("TABLEAU 1 :\n"); printf(" m... : G=%0*d NG=%0*d\n",CHIFFRES,(int)v____Gm,CHIFFRES,(int)v___NGm); printf(" p... : G=%0*d NG=%0*d\n",CHIFFRES,(int)v____Gp,CHIFFRES,(int)v___NGp); printf(" m...=%f %c p...=%f\n",w____Gm,SI(w____Gm,w____Gp),w____Gp); printf("\n"); printf("TABLEAU 2 :\n"); printf(" Hm.. : G=%0*d NG=%0*d\n",CHIFFRES,(int)vH___Gm,CHIFFRES,(int)vH__NGm); printf(" Hp.. : G=%0*d NG=%0*d\n",CHIFFRES,(int)vH___Gp,CHIFFRES,(int)vH__NGp); printf(" Hm..=%f %c Hp..=%f\n",wH___Gm,SI(wH___Gm,wH___Gp),wH___Gp); printf("TABLEAU 3 :\n"); printf(" Fm.. : G=%0*d NG=%0*d\n",CHIFFRES,(int)vF___Gm,CHIFFRES,(int)vF__NGm); printf(" Fp.. : G=%0*d NG=%0*d\n",CHIFFRES,(int)vF___Gp,CHIFFRES,(int)vF__NGp); printf(" Fm..=%f %c Fp..=%f\n",wF___Gm,SI(wF___Gm,wF___Gp),wF___Gp); printf("\n"); } else { } } else { } } } } } } } } } } if (GenererUneImage == FAUX) { printf("Recherche exhaustive dans [%ld,%ld] par pas de %ld.\n",BorneInferieure,BorneSuperieure,BornePas); printf("\n"); printf("Pour %ld cas :\n",ComptageDeTousLesCas); printf("\n"); printf("Il y a eu %ld cas paradoxaux de type '?pp', soit %f%% (?pp/TOTAL),\n",ComptageDesCas_PP,100*((double)ComptageDesCas_PP/(double)ComptageDeTousLesCas)); printf("Il y a eu %ld cas paradoxaux de type 'Mpp', soit %f%% (Mpp/TOTAL),\n",ComptageDesCasParadoxauxMPP,100*((double)ComptageDesCasParadoxauxMPP/(double)ComptageDeTousLesCas)); printf("Il y a eu %ld cas de type '?pp', soit %f%% (Mpp/?pp).\n",ComptageDesCas_PP,100*((double)ComptageDesCasParadoxauxMPP/(double)ComptageDesCas_PP)); printf("\n"); printf("Il y a eu %ld cas paradoxaux de type '?MM', soit %f%% (?MM/TOTAL),\n",ComptageDesCas_MM,100*((double)ComptageDesCas_MM/(double)ComptageDeTousLesCas)); printf("Il y a eu %ld cas paradoxaux de type 'pMM', soit %f%% (pMM/TOTAL),\n",ComptageDesCasParadoxauxPMM,100*((double)ComptageDesCasParadoxauxPMM/(double)ComptageDeTousLesCas)); printf("Il y a eu %ld cas de type '?MM', soit %f%% (pMM/?MM).\n",ComptageDesCas_PP,100*((double)ComptageDesCasParadoxauxPMM/(double)ComptageDesCas_MM)); /* Doit donner a priori des valeurs du type : */ /* */ /* Recherche exhaustive dans [1,5] par pas de 1. */ /* Pour 390625 cas : */ /* Il y a eu 82944 cas paradoxaux de type '?pp', soit 21.233664% (?pp/TOTAL), */ /* Il y a eu 232 cas paradoxaux de type 'Mpp', soit 0.059392% (Mpp/TOTAL) */ /* Il y a eu 82944 cas de type '?pp', soit 0.279707% (Mpp/?pp). */ /* */ /* Recherche exhaustive dans [1,10] par pas de 1. */ /* Pour 100000000 cas : */ /* Il y a eu 23629321 cas paradoxaux de type '?pp', soit 23.629321% (?pp/TOTAL), */ /* Il y a eu 222252 cas paradoxaux de type 'Mpp', soit 0.222252% (Mpp/TOTAL), */ /* Il y a eu 23629321 cas de type '?pp', soit 0.940577% (Mpp/?pp). */ /* */ /* Recherche exhaustive dans [1,25] par pas de 1. */ /* Pour 152587890625 cas : */ /* Il y a eu 37707425856 cas paradoxaux de type '?pp', soit 24.711939% (?pp/TOTAL), */ /* Il y a eu 581874524 cas paradoxaux de type 'Mpp', soit 0.381337% (Mpp/TOTAL), */ /* Il y a eu 37707425856 cas de type '?pp', soit 1.543130% (Mpp/?pp). */ /* */ /* Recherche exhaustive dans [1,30] par pas de 1. */ /* Pour 656100000000 cas : */ /* Il y a eu 162606530025 cas paradoxaux de type '?pp', soit 24.783803% (?pp/TOTAL), */ /* Il y a eu 2614488870 cas paradoxaux de type 'Mpp', soit 0.398489% (Mpp/TOTAL), */ /* Il y a eu 162606530025 cas de type '?pp', soit 1.607862% (Mpp/?pp). */ /* */ /* Recherche exhaustive dans [1,100] par pas de 4. */ /* Pour 152587890625 cas : */ /* Il y a eu 37886286736 cas paradoxaux de type '?pp', soit 24.829157% (?pp/TOTAL), */ /* Il y a eu 743629992 cas paradoxaux de type 'Mpp', soit 0.487345% (Mpp/TOTAL), */ /* Il y a eu 37886286736 cas de type '?pp', soit 1.962795% (Mpp/?pp). */ /* */ /* */ /* puis a compter du 20130416183750 : */ /* */ /* Recherche exhaustive dans [1,4] par pas de 1. */ /* Pour 65536 cas : */ /* Il y a eu 12544 cas paradoxaux de type '?pp', soit 19.140625% (?pp/TOTAL), */ /* Il y a eu 4 cas paradoxaux de type 'Mpp', soit 0.006104% (Mpp/TOTAL), */ /* Il y a eu 12544 cas de type '?pp', soit 0.031888% (Mpp/?pp). */ /* Il y a eu 12544 cas paradoxaux de type '?MM', soit 19.140625% (?MM/TOTAL), */ /* Il y a eu 4 cas paradoxaux de type 'pMM', soit 0.006104% (pMM/TOTAL), */ /* Il y a eu 12544 cas de type '?MM', soit 0.031888% (pMM/?MM). */ /* */ } else { write(1,image,dimX*dimY); /* Sortie de l'image... */ } }