/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   " C L E F S "   A   P A R T I R   D ' U N   F I C H I E R  :                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*             *     * * * * * *   * * * * * *   * * * * * *   *         *   * * * * * *   *   * * * * * *   *         *             */
/*                        *             *        *             **        *        *        *   *         *   **        *             */
/*            * *         *             *        *             * *       *        *        *   *         *   * *       *             */
/*                        *             *        *             *  *      *        *        *   *         *   *  *      *             */
/*           *   *        *             *        *             *   *     *        *        *   *         *   *   *     *             */
/*                        *             *        * * *         *    *    *        *        *   *         *   *    *    *             */
/*          * * * *       *             *        *             *     *   *        *        *   *         *   *     *   *             */
/*                        *             *        *             *      *  *        *        *   *         *   *      *  *             */
/*         *       *      *             *        *             *       * *        *        *   *         *   *       * *             */
/*                        *             *        *             *        **        *        *   *         *   *        **             */
/*        *         *     *             *        * * * * * *   *         *        *        *   * * * * * *   *         *             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        ATTENTION :                                                                                                                */
/*                                                                                                                                   */
/*                    J'ai note le 20030814103149 (suite a                                                                           */
/*                  'v $xig/fonct$vv$FON 20030805111250')                                                                            */
/*                  que le programme 'v $xcg/chiffrage.01$K'                                                                         */
/*                  ne gerait pas explicitement les debordements.                                                                    */
/*                  Cela fait que les clefs calculees n'ont en                                                                       */
/*                  toute generalite qu'une validite locale et                                                                       */
/*                  qu'exploitee autrement, elles peuvent induire                                                                    */
/*                  des problemes de portabilite...                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xcg/chiffrage.01$K' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1989??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
@define   PRAGMA_CL_____PAS_DE_LIBRAIRIES_DYNAMIQUES
                                        /* Introduit le 20061114154725 (car tres utile dans '$xE'...).                               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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   BORNE_INFERIEURE                                                                                                              \
                    UN
#define   BORNE_SUPERIEURE                                                                                                              \
                    MILLION
                                        /* Pour limiter la croissane ces 'SOMME_N'...                                                */

#define   METTRE_UN_ESPACE                                                                                                              \
                    VRAI
#define   EDITER_LE_NUMERO_DU_CARACTERE_COURANT                                                                                         \
                    VRAI
#define   EDITER_SOMME_0                                                                                                                \
                    VRAI
#define   EDITER_SOMME_1                                                                                                                \
                    VRAI
#define   EDITER_SOMME_2                                                                                                                \
                    VRAI
                                        /* Controle de l'edition finale...                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   LIMITE(x)                                                                                                                     \
                    MODU(x,borne_inferieure,borne_superieure)                                                                           \
                                        /* Pour limiter la croissane ces 'SOMME_N'...                                                */

#define   EDITER_UNE_SOMME(editer_la_somme,somme_a_editer)                                                                              \
                    Bblock                                                                                                              \
                    Test(IL_FAUT(mettre_un_espace))                                                                                     \
                         Bblock                                                                                                         \
                         CAL2(Prin0(" "));                                                                                              \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    Test(IL_FAUT(editer_la_somme))                                                                                      \
                         Bblock                                                                                                         \
                         CAL2(Prin1("%d",somme_a_editer));                                                                              \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Edition d'une somme quelconque.                                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   " C L E F S "   A   P A R T I R   D ' U N   F I C H I E R  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Int,INIT(borne_inferieure,BORNE_INFERIEURE));
     DEFV(Int,INIT(borne_superieure,BORNE_SUPERIEURE));
                                        /* Pour limiter la croissane ces 'SOMME_N'...                                                */
     DEFV(Logical,INIT(mettre_un_espace,METTRE_UN_ESPACE));
     DEFV(Logical,INIT(editer_le_numero_du_caractere_courant,EDITER_LE_NUMERO_DU_CARACTERE_COURANT));
     DEFV(Logical,INIT(editer_somme_0,EDITER_SOMME_0));
     DEFV(Logical,INIT(editer_somme_1,EDITER_SOMME_1));
     DEFV(Logical,INIT(editer_somme_2,EDITER_SOMME_2));
                                        /* Controle de l'edition finale...                                                           */
     DEFV(Int,INIT(numero_du_caractere_courant,ZERO));
                                        /* Numero du caractere courant.                                                              */
     DEFV(Int,INIT(somme_0,ZERO));
                                        /* Somme des caracteres,                                                                     */
     DEFV(Int,INIT(somme_1,ZERO));
                                        /* Somme des caracteres pondere par leur numero,                                             */
     DEFV(Int,INIT(somme_2,ZERO));
                                        /* Somme des caracteres pondere par le carre de leur numero.                                 */
                                        /* Nota : les trois sommes sont entieres afin d'eviter les overflows de conversion...        */
     DEFV(Char,INIT(caractere_courant,K_UNDEF));
                                        /* Caractere courant.                                                                        */
     /*..............................................................................................................................*/
     GET_ARGUMENTS_(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_I("inf=",borne_inferieure);
                         GET_ARGUMENT_I("sup=",borne_superieure);
                         GET_ARGUMENT_L("espace=",mettre_un_espace);
                         GET_ARGUMENT_L("numero=",editer_le_numero_du_caractere_courant);
                         GET_ARGUMENT_L("somme_0=",editer_somme_0);
                         GET_ARGUMENT_L("somme_1=",editer_somme_1);
                         GET_ARGUMENT_L("somme_2=",editer_somme_2);
                         )
                    );

     Tant(GetcharT(caractere_courant))
          Bblock
                                        /* Le caractere courant de l'entree courante est recupere ; et on boucle                     */
                                        /* sur cette recuperation tant que l'on n'est pas au bout du fichier.                        */
          INCR(numero_du_caractere_courant,I);
                                        /* Numero du caractere courant.                                                              */

          INCR(somme_0,NEUT(caractere_courant));
                                        /* Somme des caracteres,                                                                     */
                                        /*                                                                                           */
                                        /* ATTENTION : le debordement eventuel de 'somme_0' n'est pas gere explicitement...          */

          INCR(somme_1,MUL2(NEUT(numero_du_caractere_courant),caractere_courant));
          EGAL(somme_1,LIMITE(somme_1));
                                        /* Somme des caracteres pondere par leur numero,                                             */
                                        /*                                                                                           */
                                        /* ATTENTION : le debordement eventuel de 'somme_1' n'est pas gere explicitement...          */

          INCR(somme_2,MUL2(EXP2(numero_du_caractere_courant),caractere_courant));
          EGAL(somme_2,LIMITE(somme_2));
                                        /* Somme des caracteres pondere par le carre de leur numero.                                 */
                                        /*                                                                                           */
                                        /* ATTENTION : le debordement eventuel de 'somme_2' n'est pas gere explicitement...          */
          Eblock
     ETan

     EDITER_UNE_SOMME(editer_le_numero_du_caractere_courant,numero_du_caractere_courant);
     EDITER_UNE_SOMME(editer_somme_0,somme_0);
     EDITER_UNE_SOMME(editer_somme_1,somme_1);
     EDITER_UNE_SOMME(editer_somme_2,somme_2);

     RETU_Commande;
     Eblock
ECommande



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