/*************************************************************************************************************************************/ /* */ /* T E S T D E L A C O N J E C T U R E D E ' Gilbreath ' A V E C U N E S U I T E */ /* D E N O M B R E S I M P A I R S C R O I S S A N T S A L A P L A C E */ /* D E S N O M B R E S P R E M I E R S : */ /* */ /* */ /* Author of '$xtc/Gilbreath.02$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20250816170518). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" /* Quelques definitions : en particulier de 'VRAI' et 'FAUX', mais aussi de la procedure */ /* 'ABSO(...)' qui calcule la valeur absolue... */ #define I0 0 /* Index du premier "nombre premier". */ #define I1 30 /* Index du "nombre premier" dit "catastrophique". */ #define I2 39 /* Index du dernier "nombre premier". */ #define N ((I2-I0)+1) /* Nombre de "nombres premiers" generes... */ #define INITIALISATION(valeur,index) \ { \ tableau[index] = valeur; \ } int editer=FAUX; int simuler=VRAI; /* Indicateurs de controle des operations effectuees. */ extern void srand48(); extern double drand48(); extern double log(); #define GRAINE 1947 #define ALPHA 3.3068 /* Cette valeur donne pour N=9999 et GRAINE=1947 la valeur 104729 au nombre aleatoire numero */ /* 100000 (=N+1), c'est-a-dire le nombre premier numero 100000... */ #define BETA 1 #define DELTA (I1+(int)ALPHA+4) /* Logiquement, vu comme un seuil, 'DELTA' doit etre une fonction de 'I1' et de 'ALPHA'... */ /* Cette definition est le resultat d'experiences. */ /* */ /* Faire DELTA=0 supprime la discontinuite catastrophique. */ #define RANDOM(index) \ { \ long int ValeurAleatoire=((int)(((ALPHA-BETA)*drand48()*log((double)index+1))+BETA)); \ /* Le parametre 'BETA' garantit que 'ValeurAleatoire' ne peut etre nul. De plus l'usage */ \ /* du 'log(...)' fait que progressivement les nombres generes sont de plus en plus "rares", */ \ /* de plus en plus eloignes les uns des autres... */ \ \ if (index == I1) \ /* Est-ce le moment de creer une catastrophe ? */ \ { \ NombreAleatoireEntierCourant = NombreAleatoireEntierCourant + DELTA; \ /* Le parametre 'DELTA' regle l'amplitude de la discontinuite "catastrophique"... */ \ } \ else \ { \ } \ \ NombreAleatoireEntierCourant = (2*((NombreAleatoireEntierCourant+ValeurAleatoire)/2)+1); \ /* La division par 2, puis la multiplication par 2 avec incrementation de 1 permettent */ \ /* d'obtenir des nombres aleatoires impairs, le cumul via 'NombreAleatoireEntierCourant' */ \ /* donnant finalement une liste de nombres aleatoires entiers, impairs et croissants... */ \ \ INITIALISATION(NombreAleatoireEntierCourant,index); \ } #define RANDOM1 2 #define RANDOM2 3 /* Definition des deux premiers nombres premiers a forcer... */ void main() { long int tableau[N]; long int i1=I0,i2=I0; long int NombreAleatoireEntierCourant=RANDOM2; srand48(GRAINE); INITIALISATION(RANDOM1,I0+0); INITIALISATION(RANDOM2,I0+1); /* Forcage des deux premiers nombres premiers... */ for (i2=I0+2 ; i2<=I2 ; i2++) { RANDOM(i2); /* Generation aleatoire des "nombres premiers" suivants. */ } if (editer == VRAI) { for (i2=I0 ; i2<=I2 ; i2++) { printf("nombre[%ld]=%ld\n",i2+1,tableau[i2]); /* Edition conditionnelle des "nombres premiers" generes. */ } printf("\n"); } else { } if (simuler == VRAI) { for (i2=I0 ; i2<=I2 ; i2++) { for (i1=I0 ; i1<=(I2-i2) ; i1++) { printf("%4ld ",tableau[i1]); if ((i1+1) < N-i2) { tableau[i1] = ABSO(tableau[i1+1]-tableau[i1]); /* Difference iterative des couples de "nombres premiers". */ } else { } } printf("\n"); } } else { } }