/*************************************************************************************************************************************/
/* */
/* V I S U A L I S A T I O N 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 '$xrk/Goldbach.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 20130110095412). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R F A C E ' listG ' : */
/* */
/* */
/* :Debut_listG: */
/* :Fin_listG: */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* F I C H I E R S D ' I N C L U D E S : */
/* */
/*************************************************************************************************************************************/
#include INCLUDES_BASE
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define VISUALISER_LES_NOMBRES_PAIRS_HORIZONTALEMENT \
VRAI \
/* Faut-il visualiser les nombres pairs horizontalement ('VRAI') ou verticalement ('FAUX') ? */ \
/* Ce parametre a ete introduit le 20130112085356... */
#define MONTRER_LES_COUPLES_DE_NOMBRES_PREMIERS \
VRAI \
/* Faut-il visualiser les couples de nombres premiers ('VRAI') ou bien les couples de */ \
/* leurs index ('FAUX') ? */
#define EDITER_LE_PREMIER_ET_LE_DERNIER_NOMBRES_PAIRS \
FAUX \
/* Faut-il editer les premier et dernier nombres pairs ('VRAI') ou pas ('FAUX') ? Ceci a */ \
/* ete introduit le 20131127095700... */
#define VISUALISER_UNIQUEMENT_LE_NOMBRE_DE_DECOMPOSITIONS \
FAUX
#define VISUALISER_LE_NOMBRE_DE_DECOMPOSITIONS_COMME_UN_HISTOGRAMME \
FAUX
#define NIVEAU_DE_MARQUAGE_DU_NOMBRE_DE_DECOMPOSITIONS_1 \
BLANC
#define NIVEAU_DE_MARQUAGE_DU_NOMBRE_DE_DECOMPOSITIONS_2 \
NIVEAU_DE_MARQUAGE_DU_NOMBRE_DE_DECOMPOSITIONS_1
/* Faut-il visualiser uniquement le nombre de decompositions ('VRAI') ou bien les */
/* decompositions elles-memes ('FAUX') ? Ce parametre a ete introduit le 20131104134727 */
/* et complete le 20131105074956... */
#define FACTEUR_D_ECHELLE_DES_NOMBRES_PREMIERS \
UN
#define FACTEUR_D_ECHELLE_DES_INDEX \
UN
#define FACTEUR_D_ECHELLE_DU_NOMBRE_DE_DECOMPOSITIONS \
UN
/* Introduit le 20131126163733 afin de mieux occuper l'espace... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define PREMIER_NOMBRE_PREMIER \
SUCC(VERITABLE_PREMIER_NOMBRE_PREMIER) \
/* Premier nombre premier a traiter en excluant donc 2 ((introduit ici le 20130112101944). */
#define NOMBRE_DE_NOMBRES_PREMIERS \
ADD2(MUL2(BASE_DE_PARITE,COYR(Ymax)),PREMIER_NOMBRE_PAIR_A_TESTER) \
/* Nombre maximal de nombres premiers que l'on va calculer, mais en fait leur nombre est */ \
/* plus petit que cela car, en effet, la valeur ci-dessus donne plutot le plus grand */ \
/* nombre pair que l'on va decomposer... */
#define PREMIER_NOMBRE_PAIR_A_TESTER \
SIX \
/* Je note le 20130111115112 que l'on ne peut pas commencer a 'QUATRE' car, en effet, sa */ \
/* decomposition est : */ \
/* */ \
/* 4 = 2 + 2 */ \
/* */ \
/* or '2' est le seul nombre premier pair et dans les 'store_point_valide(...)' qui vont */ \
/* suivre les nombres premiers sont divises par 'BASE_DE_PARITE' afin de definir la */ \
/* coordonnee 'X'. Alors les deux premiers nombres premiers {2,3} entrent en collision */ \
/* donnant X=1 tous les deux. La solution est donc de commencer a 6... */
#include xci/valeurs_Goldbach.01.I"
#include xci/valeurs_Goldbach.02.I"
#define facteur_echelle_nombres_premiers \
facteur_d_echelle_des_nombres_premiers
#define montrer_couples_nombres_premiers \
montrer_les_couples_de_nombres_premiers
/* Afin de raccourcir des lignes a venir... */
#define GENERATION_D_UNE_LIGNE_OU_D_UNE_COLONNE(COXYR,selection_X_ou_Y,COXYA,X1,Y1,X2,Y2,est_premier_element,est_dernier_element) \
Bblock \
DEFV(genere_p,INIT(niveau_de_marquage_courant,NOIR_PLANCHER)); \
\
DEFV(Int,INIT(nombre_de_decompositions,ZERO)); \
/* Le nombre de decompositions a ete introduit le 20131104134727... */ \
\
EGAL(nombre_entier_courant \
,ADD2(MUL2(BASE_DE_PARITE \
,COXYR(selection_X_ou_Y(SE12(X1,X2),SE12(Y1,Y2))) \
) \
,PREMIER_NOMBRE_PAIR_A_TESTER \
) \
); \
/* On notera que grace au 'MUL2(BASE_DE_PARITE,...)' seuls les nombres pairs sont testes */ \
/* (ce qui est heureux puisque c'est le sujet de la Conjecture de Goldbach...). */ \
\
Test(EST_IMPAIR(nombre_entier_courant)) \
/* Test introduit le 20130112133805... */ \
Bblock \
PRINT_ERREUR("le premier nombre pair a tester est en fait impair"); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(EST_VRAI(est_premier_element)) \
/* Test introduit le 20131127170806... */ \
Bblock \
Test(IL_FAUT(editer_le_premier_et_le_dernier_nombres_pairs)) \
/* Test introduit le 20131127095700... */ \
Bblock \
CAL3(Prme1("PremierNombrePair=%d\n",nombre_entier_courant)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
VERIFICATION_DE_LA_CONJECTURE_DE_GOLDBACH(BLOC(Bblock \
DEFV(Int,INIT(coordonnee_1 \
,COXYA(COND(IL_FAUT(montrer_couples_nombres_premiers) \
,MUL2(facteur_echelle_nombres_premiers \
,DIVI(SOUS(nombre_premier_1 \
,PREMIER_NOMBRE_PREMIER \
) \
,BASE_DE_PARITE \
) \
) \
,MUL2(facteur_d_echelle_des_index \
,SOUS(index1 \
,INDEX_DU_PREMIER_NOMBRE_PREMIER \
) \
) \
) \
) \
) \
); \
DEFV(Int,INIT(coordonnee_2 \
,COXYA(COND(IL_FAUT(montrer_couples_nombres_premiers) \
,MUL2(facteur_echelle_nombres_premiers \
,DIVI(SOUS(nombre_premier_2 \
,PREMIER_NOMBRE_PREMIER \
) \
,BASE_DE_PARITE \
) \
) \
,MUL2(facteur_d_echelle_des_index \
,SOUS(index2 \
,INDEX_DU_PREMIER_NOMBRE_PREMIER \
) \
) \
) \
) \
) \
); \
/* Definition des deux coordonnees de rangement... */ \
/* */ \
/* On notera le 'DIVI(...,BASE_DE_PARITE)' destine a "economiser" un point sur deux l'axe */ \
/* 'OX' puisque l'on marque des nombres premiers qui sont donc necessairement impairs. */ \
/* Ainsi avec 'DIVI(...,BASE_DE_PARITE)' on ignore les nombres pairs... */ \
\
INCR(nombre_de_decompositions,I); \
/* Le nombre de decompositions a ete introduit le 20131104134727... */ \
\
Test(IL_FAUT(visualiser_uniquement_le_nombre_de_decompositions)) \
Bblock \
Eblock \
ATes \
Bblock \
Test(IFOU(EST_PAIR(nombre_premier_1) \
,EST_PAIR(nombre_premier_2) \
) \
) \
/* Ce test a ete introduit le 20130111141955 suite a 'v $xrk/Goldbach.01$K 20130111115112'. */ \
Bblock \
PRINT_ERREUR("un des nombres premiers au moins est pair"); \
CAL1(Prer1("NombrePremier1=%d\n",nombre_premier_1)); \
CAL1(Prer1("NombrePremier2=%d\n",nombre_premier_2)); \
/* On notera que l'on ne pourrait trouver ici que le nombre 2 (sauf grosse erreur...). */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
store_point_valide(niveau_de_marquage_courant \
,ImageR \
,X1,Y1 \
,FVARIABLE \
); \
store_point_valide(niveau_de_marquage_courant \
,ImageR \
,X2,Y2 \
,FVARIABLE \
); \
/* Marquage des deux nombres premiers dont la somme est egale au nombre entier courant... */ \
\
INCR(niveau_de_marquage_courant,PAS_COULEURS); \
/* Ainsi, le niveau de marquage evolue pour chaque nouveau couple de nombres premiers... */ \
\
Test(IFEXff(niveau_de_marquage_courant,NOIR_PLANCHER,BLANC)) \
Bblock \
EGAL(niveau_de_marquage_courant,NOIR_PLANCHER); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
) \
); \
\
Test(EST_VRAI(est_dernier_element)) \
/* Test introduit le 20131127170806... */ \
Bblock \
Test(IL_FAUT(editer_le_premier_et_le_dernier_nombres_pairs)) \
/* Test introduit le 20131127095700... */ \
Bblock \
CAL3(Prme1("DernierNombrePair=%d\n",nombre_entier_courant)); \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IL_FAUT(visualiser_uniquement_le_nombre_de_decompositions)) \
Bblock \
Test(IL_FAUT(visualiser_le_nombre_de_decompositions_comme_un_histogramme)) \
/* Test introduit le 20131105074956... */ \
Bblock \
Test(IL_FAUT(visualiser_les_nombres_pairs_horizontalement)) \
Bblock \
begin_colonneQ(DoIn \
,Ymin \
,MIN2(COYA(MUL2(facteur_d_echelle_du_nombre_de_decompositions \
,nombre_de_decompositions \
) \
) \
,Ymax \
) \
,pasY \
) \
Bblock \
store_point_valide(COND(IFEQ(Y,Ymax_begin_colonneQ) \
,niveau_de_marquage_du_nombre_de_decompositions_2 \
,niveau_de_marquage_du_nombre_de_decompositions_1 \
) \
,ImageR \
,selection_X_ou_Y(SE12(X1,X2),SE12(Y1,Y2)) \
,Y \
,FVARIABLE \
); \
/* Trace d'une barre verticale dont la longueur est le nombre de decompositions seuillee */ \
/* par 'Xmax'. */ \
Eblock \
end_colonneQ(EDoI) \
Eblock \
ATes \
Bblock \
begin_ligneQ(DoIn \
,Xmin \
,MIN2(COXA(MUL2(facteur_d_echelle_du_nombre_de_decompositions \
,nombre_de_decompositions \
) \
) \
,Xmax \
) \
,pasX \
) \
Bblock \
store_point_valide(COND(IFEQ(X,Xmax_begin_ligneQ) \
,niveau_de_marquage_du_nombre_de_decompositions_2 \
,niveau_de_marquage_du_nombre_de_decompositions_1 \
) \
,ImageR \
,X \
,selection_X_ou_Y(SE12(X1,X2),SE12(Y1,Y2)) \
,FVARIABLE \
); \
/* Trace d'une barre horizontale dont la longueur est le nombre de decompositions seuillee */ \
/* par 'Ymax'. */ \
Eblock \
end_ligneQ(EDoI) \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
store_point_valide(niveau_de_marquage_du_nombre_de_decompositions_2 \
,ImageR \
,COND(IL_FAUT(visualiser_les_nombres_pairs_horizontalement) \
,selection_X_ou_Y(SE12(X1,X2),SE12(Y1,Y2)) \
,MUL2(facteur_d_echelle_du_nombre_de_decompositions,nombre_de_decompositions) \
) \
,COND(IL_FAUT(visualiser_les_nombres_pairs_horizontalement) \
,MUL2(facteur_d_echelle_du_nombre_de_decompositions,nombre_de_decompositions) \
,selection_X_ou_Y(SE12(X1,X2),SE12(Y1,Y2)) \
) \
,FVARIABLE \
); \
/* On notera que le nombre de decompositions peut etre plus grand que la dimension maximale */ \
/* de l'axe correspondant... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Procedure introduite le 20130112083824 afin de pouvoir generer aussi bien une disposition */ \
/* en lignes qu'en colonnes... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* V I S U A L I S A T I O N D E L A C O N J E C T U R E D E G O L D B A C H : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
DEFV(Logical,INIT(visualiser_les_nombres_pairs_horizontalement,VISUALISER_LES_NOMBRES_PAIRS_HORIZONTALEMENT));
/* Faut-il visualiser les nombres pairs horizontalement ('VRAI') ou verticalement ('FAUX') ? */
/* Ce parametre a ete introduit le 20130112085356... */
DEFV(Logical,INIT(montrer_les_couples_de_nombres_premiers,MONTRER_LES_COUPLES_DE_NOMBRES_PREMIERS));
/* Faut-il visualiser les couples de nombres premiers ('VRAI') ou bien les couples de */
/* leurs index ('FAUX') ? */
DEFV(Logical,INIT(visualiser_uniquement_le_nombre_de_decompositions,VISUALISER_UNIQUEMENT_LE_NOMBRE_DE_DECOMPOSITIONS));
DEFV(Logical,INIT(visualiser_le_nombre_de_decompositions_comme_un_histogramme
,VISUALISER_LE_NOMBRE_DE_DECOMPOSITIONS_COMME_UN_HISTOGRAMME
)
);
DEFV(genere_p,INIT(niveau_de_marquage_du_nombre_de_decompositions_1,NIVEAU_DE_MARQUAGE_DU_NOMBRE_DE_DECOMPOSITIONS_1));
DEFV(genere_p,INIT(niveau_de_marquage_du_nombre_de_decompositions_2,NIVEAU_DE_MARQUAGE_DU_NOMBRE_DE_DECOMPOSITIONS_2));
/* Faut-il visualiser uniquement le nombre de decompositions ('VRAI') ou bien les */
/* decompositions elles-memes ('FAUX') ? Ce parametre a ete introduit le 20131104134727 */
/* et complete le 20131105074956... Le 20131121105424, ce niveau a ete "dedouble" afin */
/* de pouvoir differencier la partie "histogramme" et son maximum... */
DEFV(Logical,INIT(editer_le_premier_et_le_dernier_nombres_pairs,EDITER_LE_PREMIER_ET_LE_DERNIER_NOMBRES_PAIRS));
/* Faut-il editer les premier et dernier nombres pairs ('VRAI') ou pas ('FAUX') ? Ceci a */
/* ete introduit le 20131127095700... */
DEFV(Int,INIT(facteur_d_echelle_des_nombres_premiers,FACTEUR_D_ECHELLE_DES_NOMBRES_PREMIERS));
DEFV(Int,INIT(facteur_d_echelle_des_index,FACTEUR_D_ECHELLE_DES_INDEX));
DEFV(Int,INIT(facteur_d_echelle_du_nombre_de_decompositions,FACTEUR_D_ECHELLE_DU_NOMBRE_DE_DECOMPOSITIONS));
/* Introduit le 20131126163733 afin de mieux occuper l'espace... */
DEFV(Int,INIT(valeur_a_ne_pas_depasser_pour_les_nombres_premiers,PETIT_INFINI));
/* Valeur a ne pas depasser pour les nombres premiers (introduite le 20221021172432) car */
/* etant referencee dans 'v $xci/valeurs_Goldbach.02$I valeur_a_ne_pas_depasser', mais ici */
/* elle n'est pas modifiable... */
DEFV(Logical,INIT(ignorer_les_couples_commutes_dus_a_la_commutativite_de_l_addition,VRAI));
/* Contrairement a 'v $xci/valeurs_Goldbach$K ignorer_les_couples_commutes_dus_a_la_com...' */
/* (qui a inspire ce probleme), il faut evidemment ici ignorer le couple {P2,P1} de nombes */
/* premiers lorsque le couple {P1,P2} (avec P1<P2) a deja ete marque (ces deux marquages */
/* sont en fait identiques au niveau de l'image generee...). */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_L("horizontalement=""horizontal=""hor=""h=",visualiser_les_nombres_pairs_horizontalement);
GET_ARGUMENT_N("verticalement=""vertical=""ver=""v=",visualiser_les_nombres_pairs_horizontalement);
GET_ARGUMENT_L("nombre_decompositions=""nc=",visualiser_uniquement_le_nombre_de_decompositions);
GET_ARGUMENT_N("decompositions=""d=",visualiser_uniquement_le_nombre_de_decompositions);
GET_ARGUMENT_L("decompositions_histogramme=""dh="
,visualiser_le_nombre_de_decompositions_comme_un_histogramme
);
GET_ARGUMENT_P("niveau_marquage_decompositions_1=""ncm1=",niveau_de_marquage_du_nombre_de_decompositions_1);
GET_ARGUMENT_P("niveau_marquage_decompositions_2=""ncm2=",niveau_de_marquage_du_nombre_de_decompositions_2);
/* Arguments introduits le 20131104134727 et completes le 20131105074956... */
GET_ARGUMENT_L("editer_premier_dernier=""epd=",editer_le_premier_et_le_dernier_nombres_pairs);
/* Arguments introduits le 20131127095700... */
GET_ARGUMENT_L("nombres_premiers=""np=",montrer_les_couples_de_nombres_premiers);
GET_ARGUMENT_N("index=""in=",montrer_les_couples_de_nombres_premiers);
GET_ARGUMENT_I("echelle_nombres_premiers=""echelle_np=""enp=",facteur_d_echelle_des_nombres_premiers);
GET_ARGUMENT_I("echelle_index=""echelle_i=""ei=",facteur_d_echelle_des_index);
GET_ARGUMENT_I("echelle_decompositions=""echelle_d=""ed=",facteur_d_echelle_du_nombre_de_decompositions);
)
);
CALi(Inoir(ImageR));
DEBUT_DE_LA_GENERATION_DE_LA_LISTE_DES_NOMBRES_PREMIERS;
Test(IL_FAUT(visualiser_les_nombres_pairs_horizontalement))
/* Test introduit le 20130112085356... */
Bblock
begin_ligne
Bblock
GENERATION_D_UNE_LIGNE_OU_D_UNE_COLONNE(COXR,SE12
,COYA
,X,coordonnee_1
,X,coordonnee_2
,IFEQ(X,Xmin)
,IFEQ(X,Xmax)
);
Eblock
end_ligne
Eblock
ATes
Bblock
begin_colonne
Bblock
GENERATION_D_UNE_LIGNE_OU_D_UNE_COLONNE(COYR,SE22
,COXA
,coordonnee_1,Y
,coordonnee_2,Y
,IFEQ(Y,Ymin)
,IFEQ(Y,Ymax)
);
Eblock
end_colonne
Eblock
ETes
FIN_DE_LA_GENERATION_DE_LA_LISTE_DES_NOMBRES_PREMIERS;
CALi(Iupdate_image(nom_imageR,ImageR));
RETU_Commande;
Eblock
ECommande