/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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
                              {
                              }
                    }



Copyright © Jean-François COLONNA, 2025-2025.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2025-2025.