/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S H U F F L E  :                                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xrD/shuffle.01$K' :                                                                                            */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19????????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#define   ZERO      0
#define   BIT       1
#define   CX        0x0000000f
#define   NBITCX    4
#define   MEXP      0xff000000
#define   CEXP      (NBITCX*2)
#define   MEXPBIT   0xff800000
#define   CEXPBIT   (NBITCX*2+1)
#define   MMOT      0xffffffff
#define   NBITMO    32
#define   MAGIK     7
SHUFFLE(work)
int       work;
     {
     return         work * MAGIK;
     }
shuffle(work)
int       work;
     {
     int  n;
     unsigned       kumul = ZERO;
     unsigned       chumul = ZERO;
     unsigned       exp = (work & MEXP) >> (NBITMO - CEXP);
     unsigned       workl = work ^ (exp << (NBITMO - CEXP));
     unsigned       chiffre;
     for  (n = ZERO ; n < (NBITMO / NBITCX) - (CEXP / NBITCX) ; n++)
          {
          chiffre = (((workl & CX) * MAGIK) & CX);
          chumul = (chumul << BIT) ^ chiffre;
          kumul = (kumul >> NBITCX) | ((chiffre) << (NBITMO - NBITCX));
          workl = workl >> NBITCX;
          }
     return    (kumul >> CEXP) | ((exp ^ chumul) << (NBITMO - CEXP));
     }
fpermutation(work)
int       work;
     {
     int  n;
     unsigned       kumul = ZERO;
     unsigned       exp = (work & MEXPBIT) >> (NBITMO - CEXPBIT);
     unsigned       workl = work ^ (exp << (NBITMO - CEXPBIT));
     unsigned       chiffre;
     for  (n = ZERO ; n < NBITMO - CEXPBIT ; n++)
          {
          chiffre = workl & BIT;
          kumul = (kumul << BIT) | chiffre;
          workl = workl >> BIT;
          }
     return    (kumul) | ((exp) << (NBITMO - CEXPBIT));
     }
ipermutation(work)
int       work;
     {
     int  n;
     unsigned       kumul = ZERO;
     unsigned       workl = work;
     unsigned       chiffre;
     for  (n = ZERO ; n < NBITMO ; n++)
          {
          chiffre = workl & BIT;
          kumul = (kumul << BIT) | chiffre;
          workl = workl >> BIT;
          }
     return    (kumul);
     }
main()
     {
     union     mixte
               {
               float     f;
               unsigned  i;
               };
     union     mixte     e;
     float     work = 0.0;
     float     rdn = 0.0;
     double    moyenne = 0.0;
     int       nombre = 100;
     int       pas = 10000000 - 1;
     int n;
     for (n = ZERO ; n < nombre * pas ; n = n + pas)
          {
          e.f = work;
          e.i = n;
          CAL2(Prin0("\n"));
          CAL2(Prin1(" avant = %d",e.i));
          e.i = ipermutation(e.i);
          rdn = e.i;
          CAL2(Prin1("   apres = %u",e.i));
          moyenne = moyenne + rdn;
          work = work + 0.01073;
          }
     CAL2(Prin1("moyenne = %g\n",moyenne / nombre));
     }



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.