Método congruente inverso

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 30 de abril de 2020; las comprobaciones requieren 3 ediciones .

El método congruencial inverso (o generador de Eichenauer-Lehn , también posiblemente Eichenauer-Lehn ) es un método de generación de números pseudoaleatorios basado en el uso del número de módulo inverso para generar el siguiente miembro de la secuencia.

Descripción

El método congruencial inverso fue propuesto por Eichenauer y Lehn en 1986 [1] como reemplazo del método congruencial lineal sin celosía [2] .

Este método consiste en calcular una secuencia de números aleatorios en el anillo de residuos módulo un número natural .

La principal diferencia con el método lineal es que al generar una secuencia, se utiliza el número inverso al elemento anterior en lugar del elemento anterior en sí.

Los parámetros del generador son [3] :

 - sal
 - multiplicador
 - incremento

En el caso de una n simple

El valor de los miembros de la secuencia se da como:

  si
si

En el caso de n compuesto

Si el número es compuesto, los elementos de la secuencia se calculan de la siguiente manera:

 

Los parámetros se eligen de tal manera que .

Período

La secuencia es periódica y el período no excede la dimensión del anillo . El período máximo se alcanza si el polinomio es primitivo . Una condición suficiente para el período máximo de la secuencia es tal elección de constantes y que el polinomio sea irreducible [4] .

En el caso de un compuesto, el período máximo posible es ( función de Euler ) [5] .

Ejemplo

El generador de congruencia inversa con parámetros genera una secuencia en el anillo , donde los números y , así como y son inversos entre sí. En este ejemplo, el polinomio es irreducible en y los números no son sus raíces, por lo que el periodo es máximo e igual a .

Ejemplos de implementación

Pitón

El código def egcd ( a , b ): if a == 0 : return ( b , 0 , 1 ) else : g , y , x = egcd ( b % a , a ) return ( g , x - ( b // a ) * y , y ) def modinv ( a , m ): gcd , x , y = egcd ( a , m ) if gcd != 1 : return Ninguno # modular inverse no existe else : return x % m def ICG ( n , a , c , semilla ): if ( semilla == 0 ): return c return ( a * modinv ( semilla , n ) + c ) % n semilla = 1 n = 5 a = 2 c = 3 cuenta = 10 para i en el rango ( recuento ): imprimir ( semilla ) semilla = ICG ( n , a , c , semilla )

C++

El código #incluir <iostream> utilizando el espacio de nombres estándar ; int mod_inv ( int a , int n ) { int b0 = norte , t , q ; intx0 = 0 , x1 = 1 ; _ si ( n == 1 ) devuelve 1 ; mientras ( un > 1 ) { q = un / n ; t = norte , norte = un % norte , un = t ; t = x0 , x0 = x1 - q * x0 , x1 = t ; } si ( x1 < 0 ) x1 += b0 ; devolver x1 ; } int ICG ( int n , int a , int c , int semilla ) { si ( semilla == 0 ) devolver c ; return ( a * mod_inv ( semilla , n ) + c ) % n ; } int principal ( vacío ) { semilla int = 1 ; entero n = 5 ; int a = 2 ; int c = 3 ; número int = 10 ; para ( int i = 0 ; i < cuenta ; i ++ ) { cout << semilla << endl ; semilla = ICG ( n , a , c , semilla ); } devolver 0 ; }

Generadores inversos compuestos

La principal desventaja de los generadores congruentes inversos es el aumento de la complejidad computacional con el aumento del período. Esta deficiencia se corrige en los generadores congruenciales inversos compuestos.

La construcción de generadores inversos compuestos es una combinación de dos o más generadores inversos congruentes.

Sean  números primos distintos, cada uno . Para cada índice dentro de , sea  una secuencia de elementos con punto . En otras palabras, .

Sea  una secuencia de números aleatorios dentro de , donde .

La secuencia resultante se define como la suma de: .

El período de la secuencia resultante [6] .

Una de las ventajas de este enfoque es la capacidad de utilizar generadores congruentes inversos que funcionan en paralelo.

Un ejemplo de un generador inverso compuesto

Sea y . Para simplificar, pongamos y . Para cada uno calculamos .

entonces _ Es decir, obtuvimos una secuencia con un punto .

Para deshacernos de los números fraccionarios, podemos multiplicar cada elemento de la secuencia resultante por y obtener una secuencia de números enteros:

Beneficios de los generadores congruentes inversos

Los generadores congruentes inversos se utilizan con fines prácticos por varias razones.

En primer lugar, los generadores congruentes inversos tienen una uniformidad bastante buena [7] , además, las secuencias resultantes están completamente desprovistas de la estructura reticular característica de los generadores congruentes lineales [1] [8] [9] .

En segundo lugar, las secuencias binarias obtenidas mediante el ICG no presentan desviaciones estadísticas no deseadas. Las secuencias obtenidas por este método han sido verificadas por una serie de pruebas estadísticas y permanecen estables con parámetros cambiantes [7] [8] [10] [11] .

En tercer lugar, los osciladores compuestos tienen las mismas propiedades que los osciladores inversos lineales simples [12] , pero al mismo tiempo tienen un período que supera significativamente el período de los osciladores individuales [13] . Además, el dispositivo de generadores compuestos permite lograr un alto aumento de rendimiento cuando se utiliza en sistemas multiprocesador [14] .

Existe un algoritmo que permite el desarrollo de generadores compuestos con periodos de longitud y complejidad predecibles, así como buenas propiedades estadísticas de las secuencias de salida [15] .

Desventajas de los generadores congruentes inversos

La principal desventaja de los generadores congruentes inversos es la lentitud de generar elementos de la secuencia: el cálculo de un elemento de la secuencia requiere operaciones de multiplicación [16] .

Notas

  1. 1 2 Knut, 2013 , pág. 45.
  2. Eichenauer, Lehn, 1986 .
  3. Hellekalek, 1995 , pág. 255: "Tenemos que elegir el módulo p, un multiplicador a, un término aditivo b".
  4. Amy Glen: Sobre la duración del período de las secuencias numéricas pseudoaleatorias, 2002 , 5.3, p. 67: "Si x2-bx-a es un polinomio primitivo sobre Fp, entonces Xi tiene una longitud de período completa p".
  5. Amy Glen: Sobre la duración del período de las secuencias numéricas pseudoaleatorias, 2002 , 5.4, p. 69: "La secuencia Xi es puramente periódica con una longitud de período d ≤ φ(m)".
  6. Hellekalek, 1995 , pág. 256: "Es elemental ver que el periodo de la sucesión (Xn)n es igual a M := p1*p2*...* pr".
  7. 1 2 Eichenauer-Herrmann, Niederreiter, 1992 .
  8. 1 2 Eichenauer-Herrmann, 1991 .
  9. Eichenauer-Herrmann, Grothe, Niederreiter et al, 1990 , p. 81: "Estos generadores no muestran la estructura reticular simple de los generadores congruenciales lineales ampliamente utilizados".
  10. Eichenauer-Herrmann, 1993 .
  11. Hellekalek, 1995 , pág. 261: "Las excelentes propiedades teóricas y empíricas de los métodos inversivos permanecen estables bajo la variación de los parámetros, siempre que tengamos la máxima duración del período".
  12. Bubicz, Stoklosa, 2006 , pág. 2: "El enfoque compuesto brinda las mismas propiedades sobresalientes de las secuencias producidas que los generadores inversivos simples".
  13. Bubicz, Stoklosa, 2006 , pág. 2: "Los generadores inversores compuestos permiten obtener una duración del período significativamente mayor que la obtenida por un solo ICG".
  14. Bubicz, Stoklosa, 2006 , pág. 2: "Parecen estar diseñados para aplicaciones con plataformas de hardware paralelas multiprocesador".
  15. Bubicz, Stoklosa, 2006 , pág. 2: “Existe una forma constante y sencilla de elección de parámetros, basada en el algoritmo de Chou. Garantiza la máxima longitud".
  16. Anne Gille-Genest: Generadores de números pseudoaleatorios, 2012 , p. 12: "La principal desventaja de estos dos generadores inversos es que el cálculo de un número aleatorio requiere la multiplicación de O(log m ) en F m , por lo que el algoritmo no es rápido".

Literatura

Libros
  • Knut D. E. El arte de la programación : Volumen 2. Algoritmos obtenidos - 3 - M .: Williams , 2013. - 828 p. — ISBN 978-5-8459-0081-4
Artículos