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