/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S P R E M I E R S E L E M E N T S */ /* D ' U N E S U I T E A L E A T O I R E T Y P E ' BBS ' : */ /* */ /* */ /* Author of '$xci/valeurs_BBS$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20131224105835). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #include xci/sequence.01.I" #define X0 \ TROIS \ /* Definition du premier element de la suite 'X(n)'... */ #define NOMBRE_PREMIER_P \ PARE(43991) #define NOMBRE_PREMIER_Q \ PARE(44027) /* Definition des parametres premiers. */ #include xci/valeurs.01.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/valeurs.02.I" /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E S P R E M I E R S E L E M E N T S */ /* D ' U N E S U I T E A L E A T O I R E T Y P E ' BBS ' : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(premiere_image,PREMIERE_IMAGE)); /* Numero de la premiere image, */ DEFV(Int,INIT(derniere_image,DERNIERE_IMAGE)); /* Numero de la derniere image. */ DEFV(Int,INIT(numero_d_image,UNDEF)); /* Numero de l'image courante. */ DEFV(Int,INIT(pas_des_images,PAS_DES_IMAGES)); /* Pas de passage d'un numero d'image a une autre. */ DEFV(Int,INIT(Xn,X0)); /* Definition du premier element de la suite 'X(n)'... */ DEFV(Int,INIT(nombre_premier_P,NOMBRE_PREMIER_P)); DEFV(Int,INIT(nombre_premier_Q,NOMBRE_PREMIER_Q)); /* Definition des parametres premiers. */ #include xci/valeurs.03.I" /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(GET_ARGUMENT_I("premiere=""p=""D=",premiere_image); GET_ARGUMENT_I("derniere=""d=""A=",derniere_image); GET_ARGUMENT_I("pas=",pas_des_images); GET_ARGUMENT_I("Xn=""xn=""X0=""x0=",Xn); /* Parametres completes le 20140106155614 par "X0=" et "x0="... */ GET_ARGUMENT_I("npP=""P=",nombre_premier_P); GET_ARGUMENT_I("npQ=""Q=",nombre_premier_Q); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; ) ); Test(IFLE(premiere_image,derniere_image)) Bblock DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images) Bblock DEFV(Int,INIT(element_aleatoire_courant,MASQUE_VIDE)); Repe(NBITHX) Bblock EGAL(Xn,REST(EXP2(Xn),MUL2(nombre_premier_P,nombre_premier_Q))); EGAL(element_aleatoire_courant,OUIN(SLLS(element_aleatoire_courant,UN),ETLO(Xn,MASK2))); /* Il s'agit du generateur BBS ("Blum-Blum-Shub"). Il utilise deux nombres premiers P et */ /* Q, ainsi qu'une graine G tels que : */ /* */ /* P = 3 modulo 4 */ /* Q = 3 modulo 4 */ /* */ /* G E [2,(PxQ)-1)] */ /* */ /* Il est defini par l'iteration : */ /* */ /* X(0) = G */ /* */ /* 2 */ /* X(n+1) = X(n) modulo (PxQ) */ /* */ /* Le bit de poids le plus faible de X(n+1) est un bon bit pseudo-aleatoire... */ /* */ /* De plus P et Q doivent etre les plus grands possibles, mais tel que (PxQ)x(PxQ) tienne */ /* sur 63 bits (a cause de l'elevation au carre de X(i) afin d'eviter des debordements...). */ Eblock ERep CAL2(Prin1("%x\n",element_aleatoire_courant)) Eblock EDoI Eblock ATes Bblock PRINT_ERREUR("la relation d'ordre stricte ('premier < dernier') n'est pas respectee"); Eblock ETes RETU_Commande; Eblock ECommande