/*************************************************************************************************************************************/
/* */
/* E T U D E D E L A C O N J E C T U R E D E G O L D B A C H : */
/* */
/* */
/* Author of '$xci/valeurs_Goldbach.02$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20130110101422). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define NOMBRE_PREMIER(index) \
IdTb1(liste_des_nombres_premiers,index,NOMBRE_DE_NOMBRES_PREMIERS) \
/* Introduit le 20131208085138 pour alleger ce qui suit... */
#define RANGEMENT_D_UN_NOMBRE_PREMIER(nombre_premier) \
Bblock \
EGAL(NOMBRE_PREMIER(index_courant_des_nombres_premiers) \
,nombre_premier \
); \
INCR(index_courant_des_nombres_premiers,I); \
Eblock \
/* Rangement d'un nombre premier... */
#define DEBUT_DE_LA_GENERATION_DE_LA_LISTE_DES_NOMBRES_PREMIERS \
Bblock \
DEFV(Int,INIT(index_courant_des_nombres_premiers,INDEX_DU_PREMIER_NOMBRE_PREMIER)); \
DEFV(Local,DEFV(Int \
,DdTb1(POINTERi,liste_des_nombres_premiers,NOMBRE_DE_NOMBRES_PREMIERS,ADRESSE_NON_ENCORE_DEFINIE) \
) \
); \
MdTb1(liste_des_nombres_premiers,NOMBRE_DE_NOMBRES_PREMIERS,Int,ADRESSE_NON_ENCORE_DEFINIE); \
/* Definition de la liste des nombres premiers... */ \
DEFV(Int,INIT(nombre_entier_courant,UNDEF)); \
\
Test(EST_PAIR(PREMIER_NOMBRE_PREMIER)) \
/* Test introduit le 20130112102242 pour 'v $xrk/Goldbach.01$K PREMIER_NOMBRE_PREMIER'... */ \
Bblock \
RANGEMENT_D_UN_NOMBRE_PREMIER(PREMIER_NOMBRE_PREMIER); \
/* Le premier nombre premier est 2... */ \
\
EGAL(nombre_entier_courant,SUCC(PREMIER_NOMBRE_PREMIER)); \
/* Le premier nombre a tester ensuite est donc 3... */ \
Eblock \
ATes \
Bblock \
EGAL(nombre_entier_courant,PREMIER_NOMBRE_PREMIER); \
/* Le premier nombre a tester ensuite est donc 3... */ \
Eblock \
ETes \
\
Tant(IFLE(index_courant_des_nombres_premiers,INDEX_DU_DERNIER_NOMBRE_PREMIER)) \
Bblock \
DEFV(Int,INIT(index,UNDEF)); \
DEFV(Logical,INIT(le_nombre_entier_courant_est_premier,VRAI)); \
/* Le nombre courant est a priori premier... */ \
\
DoIn(index,INDEX_DU_PREMIER_NOMBRE_PREMIER,PRED(index_courant_des_nombres_premiers),I) \
Bblock \
Test(DIVISIBLE(nombre_entier_courant \
,NOMBRE_PREMIER(index) \
) \
) \
/* On teste ainsi la divisibilite par les nombres premiers deja memorises. */ \
Bblock \
EGAL(le_nombre_entier_courant_est_premier,FAUX); \
/* Et non, le nombre courant n'est pas premier... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
EDoI \
\
Test(EST_VRAI(le_nombre_entier_courant_est_premier)) \
Bblock \
RANGEMENT_D_UN_NOMBRE_PREMIER(nombre_entier_courant); \
/* Cas ou le nombre courant est premier... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
INCR(nombre_entier_courant,PAS_DE_PROGRESSION_DES_ENTIERS); \
/* Ainsi on ne teste que les nombres impairs... */ \
\
Test(EST_PAIR(nombre_entier_courant)) \
Bblock \
PRINT_ERREUR("les nombres entiers dont est testee la primalite sont pairs"); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETan \
\
DECR(index_courant_des_nombres_premiers,I); \
/* A priori ne sert a rien, mais permet de faire que 'index_courant_des_nombres_premiers' */ \
/* soit egal a 'INDEX_DU_DERNIER_NOMBRE_PREMIER'... */ \
DECR(nombre_entier_courant,PAS_DE_PROGRESSION_DES_ENTIERS); \
/* Retour sur le dernier nombre entier traite. Ceci a ete introduit le 20131127170008 */ \
/* pour 'v $xrk/Goldbach.01$K DernierNombrePair=.d.n..nombre_entier_courant'... */
#define VERIFICATION_DE_LA_CONJECTURE_DE_GOLDBACH(sequence_si_verifiee) \
Bblock \
DEFV(Int,INIT(nombre_premier_1,UNDEF)); \
DEFV(Int,INIT(index1,UNDEF)); \
\
EGAL(index1,INDEX_DU_PREMIER_NOMBRE_PREMIER); \
\
Test(IFLT(nombre_entier_courant \
,NOMBRE_PREMIER(INDEX_DU_DERNIER_NOMBRE_PREMIER) \
) \
) \
Bblock \
Tant(I3ET(IFLT(EGAL(nombre_premier_1,NOMBRE_PREMIER(index1)) \
,nombre_entier_courant \
) \
,IFLE(index1,INDEX_DU_DERNIER_NOMBRE_PREMIER) \
,IFLE(nombre_premier_1,valeur_a_ne_pas_depasser_pour_les_nombres_premiers) \
) \
) \
/* Optimisation ('DoIn(...)' remplace par 'Tant(...)') introduite le 20131208080258... */ \
/* */ \
/* Le 20221021173451 fut introduit le test de la valeur maximale a ne pas depasser pour */ \
/* nombres premiers... */ \
Bblock \
DEFV(Int,INIT(nombre_premier_2,UNDEF)); \
DEFV(Int,INIT(index2,UNDEF)); \
\
EGAL(index2 \
,COND(IL_FAUT(ignorer_les_couples_commutes_dus_a_la_commutativite_de_l_addition) \
,index1 \
,INDEX_DU_PREMIER_NOMBRE_PREMIER \
) \
); \
\
Tant(I3ET(IFLT(EGAL(nombre_premier_2,NOMBRE_PREMIER(index2)) \
,nombre_entier_courant \
) \
,IFLE(index2,INDEX_DU_DERNIER_NOMBRE_PREMIER) \
,IFLE(nombre_premier_2,valeur_a_ne_pas_depasser_pour_les_nombres_premiers) \
) \
) \
/* Optimisation ('DoIn(...)' remplace par 'Tant(...)') introduite le 20131208080258... */ \
/* */ \
/* On notera le 20131208082307 que ce calcul est passe de 269 a 114 secondes (sur */ \
/* '$LACT19') pour le calcul de 'v $xiirv/GOLD.A2'... */ \
/* */ \
/* Le 20221021173451 fut introduit le test de la valeur maximale a ne pas depasser pour */ \
/* nombres premiers... */ \
Bblock \
Test(IFEQ(nombre_entier_courant,ADD2(nombre_premier_1,nombre_premier_2))) \
/* Edition des nombres entiers pairs superieurs ou egaux a 4 satisfaisant a la conjecture */ \
/* de Goldbach : */ \
Bblock \
BLOC(sequence_si_verifiee); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
INCR(index2,I); \
Eblock \
ETan \
\
INCR(index1,I); \
Eblock \
ETan \
Eblock \
ATes \
Bblock \
PRINT_ERREUR("la liste de nombres premiers n'est pas assez longue"); \
CAL1(Prer2("(le plus grand nombre premier est %d, alors que le nombre entier courant vaut %d)\n" \
,NOMBRE_PREMIER(INDEX_DU_DERNIER_NOMBRE_PREMIER) \
,nombre_entier_courant \
) \
); \
Eblock \
ETes \
Eblock
#define FIN_DE_LA_GENERATION_DE_LA_LISTE_DES_NOMBRES_PREMIERS \
FdTb1(liste_des_nombres_premiers,NOMBRE_DE_NOMBRES_PREMIERS,Int,ADRESSE_NON_ENCORE_DEFINIE); \
/* Definition de la liste des nombres premiers... */ \
Eblock