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