Mersenne Twister

Fonte: testwiki
Saltar para a navegação Saltar para a pesquisa

O Mersenne Twister é um gerador de números pseudoaleatórios de uso geral (PRNG) desenvolvido em 1997 por Predefinição:Japonês e Predefinição:Japonês . [1] [2] Seu nome deriva da escolha de um primo de Mersenne como duração do seu período.


A versão mais comumente usada desteo algoritmo é baseada no primo de Mersenne 2199371. A implementação padrão, MT19937, usa um comprimento de palavra de 32 bits. Existe outra implementação (que apresenta ainda cinco variantes[3]) que usa um comprimento de palavra de 64 bits, MT19937-64; ela gera uma sequência diferente.

k-distribuição

Uma sequência pseudoaleatória xi de inteiros de w bits do período P é dita ser k-distribuída com precisão de v bits se a seguinte afirmação for verdadeira.

Seja trunc v ( x ) o número formado pelos bits v iniciais de x, e considere P dos k vetores de v bits
(truncv(xi),truncv(xi+1),,truncv(xi+k1))(0i<P) .
Então cada um dos 2kv combinações possíveis de bits ocorrem o mesmo número de vezes em um período, exceto pela combinação de zeros que ocorre uma vez com menos frequência.

Detalhe do algoritmo

Visualização da geração de inteiros pseudoaleatórios de 32 bits usando Mersenne Twister. A seção Extract number mostra um exemplo em que o inteiro 0 já foi gerado e o índice está no inteiro 1. Generate numbers é executado quando todos os inteiros foram gerados.

Para palavras de comprimento w bits, o Mersenne Twister gera inteiros no intervalo [0,2w1].

O algoritmo é baseado em uma recorrência linear de matriz sobre um campo binário finito F2 . O algoritmo é um registrador de deslocamento de feedback generalizado torcido[4] (GFSR torcido ou TGFSR) de forma normal racional (TGFSR(R)), com reflexão de bits de estado e moderação. A ideia básica é definir uma série xi por meio de uma relação de recorrência simples e, em seguida, gerar números da forma xiT, onde T é uma matriz inversível F2 chamada matriz de têmpera.

O algoritmo geral é caracterizado pelas seguintes quantidades:

  • w : tamanho da palavra (em número de bits)
  • n : grau de recorrência
  • m : palavra do meio, um deslocamento usado na relação de recorrência que define a série x, 1m<n
  • r : ponto de separação de uma palavra, ou o número de bits da máscara de bits inferior, 0rw1
  • a : coeficientes da matriz de torção da forma normal racional
  • b, c : máscaras de bits de têmpera TGFSR(R)
  • s, t : Mudanças de bits de têmpera TGFSR(R)
  • u, d, l : mudanças/máscaras adicionais de bits de têmpera Mersenne Twister

sendo que 2nwr1 é um primo de Mersenne. Essa escolha simplifica o teste de primitividade e o teste de distribuição k que são necessários para a aquisição de parâmetros.

A série x é definida como uma série de quantidades de w bits com a relação:

xk+n:=xk+m((xkuxk+1l)A)k=0,1,2,

onde denota concatenação de vetores de bits (com bits superiores à esquerda), o bitwise ou-exclusivo (XOR), xku significa os bits Predefinição:Nowrap superiores de xk, e xk+1l significa os bits r inferiores de xk+1.

Os subscritos podem ser todos compensados por -n

xk:=xk(nm)((xknuxk(n1)l)A)k=n,n+1,n+2,

onde o LHS, xk, é o próximo valor gerado na série em termos de valores gerados no passado, que estão no RHS.

A transformação de torção A é definida na forma normal racional como: A=(0Iw1aw1(aw2,,a0)) com Iw1 como o (w1)(w1) matriz identidade. A forma normal racional tem o benefício de que a multiplicação por A pode ser expressa eficientemente como: 𝒙A={𝒙1x0=0(𝒙1)𝒂x0=1 onde x0 é o bit de ordem mais inferior do vetor x.

Assim como o TGFSR(R), o Mersenne Twister é cascateado com uma transformação de moderação para compensar a dimensionalidade reduzida da equidistribuição (devido à escolha de A estar na forma normal racional). Observe que isso é equivalente a usar a matriz A onde A=T1*AT para T uma matriz inversível e, com isso, a análise do polinômio característico mencionada abaixo ainda é válida.

Assim como em A, escolhemos uma transformação de têmpera para ser facilmente computável e, portanto, não construímos T propriamente dito. Esta têmpera é definida no caso do Mersenne Twister como sendo

yx((xu)&d)yy((ys)&b)yy((yt)&c)zy(yl)

onde x é o próximo valor da série, y é um valor intermediário temporário e z é o valor retornado do algoritmo, com e como os deslocamentos bit a bit para a esquerda e para a direita, e & como o bit a bit AND. A primeira e a última transformações são adicionadas para melhorar a equidistribuição de bits mais baixos. Da propriedade do TGFSR, s+tw21 é necessário para atingir o limite superior da equidistribuição para os bits superiores.

Os coeficientes para MT19937 são:

(w,n,m,r)=(32,624,397,31)a=9908B0DF16(u,d)=(11,FFFFFFFF16)(s,b)=(7,9D2C568016)(t,c)=(15,EFC6000016)l=18

Observe que as implementações de 32 bits do Mersenne Twister geralmente têm d = FFFFFFFF16. Como resultado, o d é geralmente omitido da descrição do algoritmo, já que o AND com d nesse caso não têm efeito.

Os coeficientes para MT19937-64 são:[5]

(w,n,m,r)=(64,312,156,31)a=B5026F5AA96619E916(u,d)=(29,555555555555555516)(s,b)=(17,71D67FFFEDA6000016)(t,c)=(37,FFF7EEE00000000016)l=43

Inicialização

O estado necessário para uma implementação do Mersenne Twister é uma matriz de n valores de w bits cada. Para inicialização da matriz, um valor de semente de w bits é usado para fornecer x0 através xn1 através da configuração de x0 para o valor da semente e, posteriormente, a configuração

xi=f×(xi1(xi1(w2)))+i

para i de 1 para n1 .

  • O primeiro valor que o algoritmo gera é baseado em xn, não em x0 .
  • A constante f forma outro parâmetro para o gerador, embora não faça parte do algoritmo propriamente dito.
  • O valor de f para MT19937 é 1812433253.
  • O valor de f para MT19937-64 é 6364136223846793005. [5]

Comparação com GFSR clássico

Para atingir o limite superior teórico do período 2nwr1 em um TGFSR, ϕB(t) deve ser um polinômio primitivo, sendo ϕB(t) o polinômio característico de

B=(0Iw00Iw00Iw0000IwrS000)m-ésima linha
S=(0IrIwr0)A

A transformação de torção traz melhorias para o GFSR clássico com as seguintes propriedades principais:

  • O período atinge o limite superior teórico 2nwr1 (exceto se inicializado com 0)
  • Equidistribuição em n dimensões (por exemplo, geradores congruentes lineares podem, na melhor das hipóteses, gerenciar uma distribuição razoável em cinco dimensões)

Variantes

CryptMT é uma cifra de fluxo e um gerador de números pseudoaleatórios criptograficamente seguro que usa Mersenne Twister como base interna.[6] [7] Também foi desenvolvida por Matsumoto e Nishimura, em conjunto com Mariko Hagita e Mutsuo Saito. Foi submetida ao projeto eSTREAM da rede eCRYPT.[6] Ao contrário do Mersenne Twister ou seus outros derivados, o CryptMT é patenteado.

MTGP é uma variante do Mersenne Twister otimizada para unidades de processamento gráfico publicadas por Mutsuo Saito e Makoto Matsumoto.[8] As operações de recorrência linear são estendidas da MT e os parâmetros são escolhidos para permitir que muitos threads calculem a recursão em paralelo, enquanto compartilham seu espaço de estado para reduzir a quantidade de memória usada. O artigo afirma que houve uma melhora na equidistribuição em MT e no desempenho, com base em uma GPU antiga (era 2008) (Nvidia GTX260 com 192 núcleos) de 4,7 ms para 5×107 inteiros aleatórios de 32 bits.

O SFMT (Mersenne Twister rápido orientado a SIMD) é uma variante do Mersenne Twister, introduzida em 2006,[9] projetado para ser rápida quando executada em SIMDs de 128 bits.

  • É quase duas vezes mais rápido que o Mersenne Twister.[10]
  • Ele tem uma propriedade de equidistribuição de precisão de v-bit melhor que o MT, mas pior que oWELL ("Well Equidistributed Long-period Linear") .
  • Ele tem uma recuperação mais rápida do estado inicial de excesso zero do que o MT, mas mais lenta do que o WELL.
  • Ele suporta vários períodos de 2 607 − 1 a 2 216091 − 1.

Intel SSE2 e PowerPC AltiVec utilizam a variante SFMT, que também é usada para jogos com o Cell BE no PlayStation 3.[11]

TinyMT é uma variante do Mersenne Twister, proposto por Saito e Matsumoto em 2011.[12] O TinyMT usa apenas 127 bits de espaço de estado, uma diminuição significativa em comparação aos 2,5 KiB de estado do original. No entanto, tem um período de 21271, que é muito mais curto que a proposta original, por isso

é uma variante somente recomendada em casos em que a memória é escassa.

Características

Vantagens:

  • Com licença permissiva e livre de patentes para todas as variantes, exceto CryptMT.
  • Passa em vários testes de aleatoriedade estatística, incluindo os testes Diehard e a maioria, mas não todos os testes TestU01.[13]
  • Um período muito longo de 2199371 . Observe que um longo período não é garantia de qualidade em um gerador de números aleatórios, períodos curtos, como o 232 comum em muitos pacotes de software mais antigos, pode ser problemático.[14]
  • As implementações geralmente criam números aleatórios mais rapidamente do que os métodos implementados por hardware. Um estudo descobriu que o Mersenne Twister cria números aleatórios de ponto flutuante de 64 bits aproximadamente vinte vezes mais rápido do que o conjunto de instruções RDRAND baseado em processador e implementado por hardware.[15]

Desvantagens:

  • Buffer de estado relativamente grande, de quase 2,5 kB, a menos que a variante TinyMT seja usada.
  • Rendimento medíocre para os padrões modernos, a menos que a variante SFMT (discutida abaixo) seja usada.[16]
  • Exibe duas falhas claras (complexidade linear) tanto no Crush quanto no BigCrush no conjunto TestU01. O teste, como o Mersenne Twister, é baseado em um F2 -álgebra.[13]
  • Várias instâncias que diferem apenas no valor da semente (mas não em outros parâmetros) geralmente não são apropriadas para simulações de Monte Carlo que requerem geradores de números aleatórios independentes, embora exista um método para escolher vários conjuntos de valores de parâmetros.[17][18]
  • Difusão ruim: pode levar muito tempo para começar a gerar uma saída que passe nos testes de aleatoriedade, se o estado inicial for altamente não aleatório, principalmente se o estado inicial tiver muitos zeros. Uma consequência disso é que duas instâncias do gerador, iniciadas com estados iniciais quase iguais, geralmente produzirão quase a mesma sequência por muitas iterações, antes de eventualmente divergir. A atualização de 2002 do algoritmo MT melhorou a inicialização, de modo que começar com tal estado é muito improvável. [19] Diz-se que a versão GPU (MTGP) é ainda melhor.[20]
  • Contém subsequências com mais 0's do que 1's. Isso contribui para a baixa propriedade de difusão, dificultando a recuperação de estados com muitos zeros.
  • Não é criptograficamente seguro, a menos que a variante CryptMT (discutida abaixo) seja usada. O motivo é que observar um número suficiente de iterações (624 no caso do MT19937, já que esse é o tamanho do vetor de estado a partir do qual as iterações futuras são produzidas) permite prever todas as iterações futuras.

Aplicações

O Mersenne Twister é usado como gerador padrão pelos softwares:

Também está disponível no Apache Commons,[47] na biblioteca C++ padrão (desde C++11 ),[48][5] e no Mathematica.[49] Implementações de complementos são fornecidas em muitas bibliotecas de programas, incluindo as Bibliotecas Boost C++,[50] a Biblioteca CUDA,[51] e a Biblioteca Numérica NAG.[52]

O Mersenne Twister é um dos dois PRNGs no SPSS: o outro gerador é mantido apenas para compatibilidade com programas mais antigos, e o Mersenne Twister é considerado "mais confiável".[53] Também é de igual maneira um dos PRNGs no SAS: os outros geradores estão presentes apenas pelo fator de compatibilidade.[54] O Mersenne Twister é o PRNG padrão no Stata, o outro é o KISS, para compatibilidade com versões mais antigas do Stata.[55]

Alternativas

O gerador WELL ("Well Equidistributed Long-period Linear"), oferece recuperação mais rápida, aleatoriedade igual e velocidade quase igual.[56]

Geradores xorshift e variantes da Marsaglia são os mais rápidos na classe de LFSRs.[57]

MELGs de 64 bits ("Geradores F2-Lineares de 64 bits maximamente equidistribuídos com Período Primo de Mersenne") são completamente otimizados em termos das propriedades de distribuição k .[58]

A família ACORN (publicada inicialmente em 1989) é outro gerador k -distribuído, que apresenta velocidade computacional similar à MT e melhores propriedades estatísticas, pois satisfaz todos os critérios do TestU01; quando usado com escolhas apropriadas de parâmetros, o ACORN pode ter período e precisão arbitrariamente longos.

A família PCG é um gerador de longo período mais moderno, com melhor uso de cache e menos viés detectável usando métodos de análise modernos.[59]

Referências

Predefinição:Reflist

Leitura adicional

Ligações externas

  1. Predefinição:Citar periódico
  2. E.g. Marsland S. (2011) Machine Learning (CRC Press), §4.1.1. Also see the section "Adoption in software systems".
  3. Predefinição:Citar web
  4. Predefinição:Citar periódico
  5. 5,0 5,1 5,2 Predefinição:Citar web
  6. 6,0 6,1 Predefinição:Citar web
  7. Predefinição:Citar web
  8. Predefinição:Citar arXiv
  9. Predefinição:Citar web
  10. Predefinição:Citar web
  11. Predefinição:Citar web
  12. Predefinição:Citar web
  13. 13,0 13,1 P. L'Ecuyer and R. Simard, "TestU01: "A C library for empirical testing of random number generators", ACM Transactions on Mathematical Software, 33, 4, Article 22 (agosto 2007).
  14. Note: 219937 is approximately 4.3 × 106001; this is many orders of magnitude larger than the estimated number of particles in the observable universe, which is 1087.
  15. Predefinição:Citar periódico
  16. Predefinição:Citar web
  17. Predefinição:Citar web
  18. Predefinição:Citar web
  19. Predefinição:Citar web
  20. Predefinição:Citar periódico
  21. Predefinição:Citar web
  22. Predefinição:Citar web
  23. Predefinição:Citar web
  24. Predefinição:Citar web
  25. Predefinição:Citar web
  26. Predefinição:Citar web
  27. Predefinição:Citar web
  28. Predefinição:Citar web
  29. Predefinição:Citar web
  30. Predefinição:Citar web
  31. Predefinição:Citar web
  32. Predefinição:Citar web
  33. Predefinição:Citar web
  34. Predefinição:Citar web
  35. Predefinição:Citar web
  36. Predefinição:Citar web
  37. Predefinição:Citar web
  38. Predefinição:Citar web
  39. Predefinição:Citation.
  40. Predefinição:Citar web
  41. "uniform". Gretl Function Reference.
  42. Predefinição:Citar web
  43. Predefinição:Citar web
  44. Predefinição:Citar web
  45. Predefinição:Citar web
  46. Predefinição:Citar web
  47. Predefinição:Citar web
  48. Predefinição:Citar web
  49. [1] Mathematica Documentation
  50. Predefinição:Citar web
  51. Predefinição:Citar web
  52. Predefinição:Citar web
  53. Predefinição:Citar web
  54. Predefinição:Citar web
  55. Stata help: set rng -- Set which random-number generator (RNG) to use
  56. P. L'Ecuyer, "Uniform Random Number Generators", International Encyclopedia of Statistical Science, Lovric, Miodrag (Ed.), Springer-Verlag, 2010.
  57. Predefinição:Citar web
  58. Predefinição:Citar periódico
  59. Predefinição:Citar web