/*************************************************************************************************************************************/
/* */
/* D E C O M P O S I T I O N ( S ) E N D E U X F A C T E U R S D ' U N N O M B R E E N T I E R : */
/* */
/* */
/* Author of '$xcg/factorise.01$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1994??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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_MINI
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#define NOMBRE_ENTIER_A_FACTORISER \
UN \
/* Nombre entier a factoriser... */
#define FRACTION_DE_LA_RACINE_CARREE_DU_NOMBRE_ENTIER_A_FACTORISER \
FU \
/* Definie l'amplitude des operations a realiser... */
#define EDITER_SOUS_LA_FORME_XYmax \
VRAI \
/* Doit-on editer la decomposition en deux facteurs ('FAUX') ou bien une commande de */ \
/* dimensionnement des images ('VRAI'). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E C O M P O S I T I O N ( S ) E N D E U X F A C T E U R S D ' U N N O M B R E E N T I E R : */
/* */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Int,INIT(nombre_entier_a_factoriser,NOMBRE_ENTIER_A_FACTORISER));
/* Nombre entier a factoriser... */
DEFV(Float,INIT(fraction_de_la_racine_carree_du_nombre_entier_a_factoriser
,FRACTION_DE_LA_RACINE_CARREE_DU_NOMBRE_ENTIER_A_FACTORISER
)
);
/* Definie l'amplitude des operations a realiser... */
DEFV(Logical,INIT(editer_sous_la_forme_XYmax,EDITER_SOUS_LA_FORME_XYmax));
/* Doit-on editer la decomposition en deux facteurs ('FAUX') ou bien une commande de */
/* dimensionnement des images ('VRAI'). */
/*..............................................................................................................................*/
GET_ARGUMENTS_(nombre_d_arguments
,BLOC(GET_ARGUMENT_I("nombre=""n=",nombre_entier_a_factoriser);
GET_ARGUMENT_F("fraction=""f=",fraction_de_la_racine_carree_du_nombre_entier_a_factoriser);
GET_ARGUMENT_L("XYmax=",editer_sous_la_forme_XYmax);
)
);
Test(IZGT(nombre_entier_a_factoriser))
Bblock
DEFV(Int,INIT(racine_carree_du_nombre_entier_a_factoriser,INTE(RACX(nombre_entier_a_factoriser))));
/* Racine carree approchee (car entiere) du nombre entier a factoriser */
DEFV(Int,INIT(premier_facteur,UNDEF));
DEFV(Int,INIT(second__facteur,UNDEF));
/* Les deux facteurs cherches... */
DEFV(Logical,INIT(continuer_la_recherche_du_premier_facteur,VRAI));
DEFV(Logical,INIT(continuer_la_recherche_du_second__facteur,VRAI));
/* Indique s'il faut continuer la factorisation ('VRAI') ou s'arreter ('FAUX'). */
EGAL(premier_facteur,racine_carree_du_nombre_entier_a_factoriser);
/* Initialisation du premier facteur cherche... */
Tant(IL_FAUT(continuer_la_recherche_du_premier_facteur))
Bblock
EGAL(continuer_la_recherche_du_second__facteur,VRAI);
/* Il faut rechercher le second facteur... */
EGAL(second__facteur,racine_carree_du_nombre_entier_a_factoriser);
/* Initialisation du second facteur cherche... */
Tant(IL_FAUT(continuer_la_recherche_du_second__facteur))
Bblock
Test(IFEQ(MUL2(premier_facteur,second__facteur),nombre_entier_a_factoriser))
Bblock
Test(IFGT(SOUS(second__facteur,premier_facteur)
,INTE(MUL2(fraction_de_la_racine_carree_du_nombre_entier_a_factoriser
,FLOT(racine_carree_du_nombre_entier_a_factoriser)
)
)
)
)
Bblock
EGAL(continuer_la_recherche_du_premier_facteur,FAUX);
EGAL(continuer_la_recherche_du_second__facteur,FAUX);
/* Lorsque la difference entre les deux facteurs devient trop grande (exprimee en */
/* fonction de la racine carree du nombre entier a decomposer), on arrete la recherche... */
Eblock
ATes
Bblock
Test(IL_FAUT(editer_sous_la_forme_XYmax))
Bblock
CAL2(Prin2("XYmaxNe %d %d\n"
,XYZmax(Gval("Xmin"),second__facteur)
,XYZmax(Gval("Ymin"),premier_facteur)
)
);
/* On a trouve une decomposition possible que l'on edite sous la forme d'une commande de */
/* de dimensionnement d'image. */
/* */
/* ATTENTION : passage de 'XYmax' a 'XYmaxNe' le 20020909111924. */
Eblock
ATes
Bblock
CAL2(Prin3(" %d = %d x %d\n",nombre_entier_a_factoriser,second__facteur,premier_facteur));
/* On a trouve une decomposition possible que l'on edite. On notera que cette edition */
/* est placee apres le test de 'fraction_de_la_racine_carree_du_nombre_entier_a_factoriser' */
/* car, en effet, sinon, cela donnerait de temps plus de reponses qu'attendues. Par exemple */
/* la factorisation : */
/* */
/* $xcg/factorise.01$X n=262144 */
/* */
/* donnerait : */
/* */
/* 262144 = 512x512 */
/* 262144 = 256x1024 */
/* */
/* c'est-a-dire une reponse de trop... */
/* */
/* On notera que pendant longtemps, il y a eu : */
/* */
/* CAL2(Prin3(" %d = %dx%d\n",...,premier_facteur,second__facteur)); */
/* */
/* ce qui editait un premier facteur plus petit que le second facteur. Or, cette commande */
/* est principalement destinee a factoriser des dimensions d'images ; on s'attend alors */
/* a trouver la dimension en 'X' puis celle en 'Y' ; les images ayant le plus souvent une */
/* apparence "horizontale" (ou a la limite "carree"), il est logique de permuter l'ordre */
/* des deux facteurs, afin d'editer d'abord la plus grande valeur, puis ensuite la plus */
/* petite... */
/* */
/* Enfin, les espaces qui separent les differentes composantes du resultat sont destines */
/* a faciliter les "cut and paste"... */
Eblock
ETes
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Test(IL_FAUT(continuer_la_recherche_du_second__facteur))
Bblock
Test(IFLT(second__facteur,nombre_entier_a_factoriser))
Bblock
INCR(second__facteur,I);
/* Incrementation du second facteur... */
Eblock
ATes
Bblock
EGAL(continuer_la_recherche_du_second__facteur,FAUX);
/* Lorsque le second facteur devient trop grand il ne faut pas s'arreter la, mais revenir */
/* a la boucle externe qui controle le premier facteur... */
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETan
Test(IL_FAUT(continuer_la_recherche_du_premier_facteur))
Bblock
Test(IFGT(premier_facteur,UN))
Bblock
DECR(premier_facteur,I);
/* Decrementation du second facteur... */
Eblock
ATes
Bblock
EGAL(continuer_la_recherche_du_premier_facteur,FAUX);
/* Lorsque le premier facteur devient trop petit il faut aussi s'arreter... */
Eblock
ETes
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETan
Eblock
ATes
Bblock
PRINT_ERREUR("le nombre entier est negatif ou nul et ne sera donc pas factorise");
Eblock
ETes
RETU_Commande;
Eblock
ECommande