J´ai un petit travail à effectuer pour l´école et j´ai besoin de petits renseignements.
Je recopie un texte trouvé sur Internet : (j´ai uniquement un problème de compréhension sur la remarque finale)
----------------------------------------------
formule de récurence : x(n+1)=a*x(n)+c modulo(m)
Condition nécessaire et suffisante pour que la suite de termes renvoyée par un générateur linéaire congruentiel décrive un cycle sur l´ensemble des valeurs de [[0 , M-1]] :
Il faut et il suffit que :
1. c soit premier avec m.
2. pour tout p entier naturel premier, si p divise M alors p doit diviser (a-1).
3. si M est divisible par 4, alors 4 doit diviser (a-1).
Remarque : Pour m = 2^k, il suffit donc que c soit impair, mais il est encore plus facile est d’assurer cette condition si m est premier. Pourtant, On choisit souvent m = 2^k où k est le nombre de bits dans un entier standard car ainsi, l’opération module est gratuite.
------------------------------------------------
Je comprend mal "l’opération module est gratuite".
Prenons par exemple m=32.
Prenons n un entier. n s´écrit en binaire :
n=a(u+1)a(u)...a(2)a(1)a(0) (quelquesoit i, a(i)=0 ou 1)
donc pour avoir son écriture en base 10 :
n=sum[(a(k)*2^k),k=0..u] (somme des ak*2^k où k varie de 0 à u) où les ak sont des entiers dans {0,1} et u un entier.
donc on en déduit n modulo 32 :
n mod(32)=sum(a(k)*2^k,k=0..31)
autrement dit on obient en écriture binaire :
n mod(32)=a(31)a(30)....a(1)a(0)
mais en quoi cette opération est "gratuite" ?
en gros cela reviens à une troncature, donc si j´ai bien compris l´ordinateur va calculer a*x(n)+c, puis comme la taille du nombre sera trop grande pour le type entier "standard", il va lui même ne garder que le début (ce qui revient à faire modulo m=32)
Cela se passe-t-il toujours comme ca ? ne peut-on pas envisager des cas où l´ordinateur ne garderait par exemple que la fin du nombre ?
un bien long post, pour une si petite question, ceci uniqument dans un soucis de clarté.
merci.