Loading [MathJax]/extensions/TeX/mathchoice.js

6 votos

Secuencia de Tribonacci módulo X

La secuencia de Tribonacci satisface

T(n)=T(n1)+T(n2)+T(n3)

con T(0)=0 , T(1)=1 , T(2)=1 . Necesito calcular T(y) \mod 10000 para y > 2^{40} .

¿Cómo puedo hacer esto más rápido? Sé que esto es periódico en (\mathbb{Z}/10000\mathbb{Z})^3 pero no puedo encontrar el período.

¿Alguna sugerencia? Mi programa necesita mucho tiempo para calcular tales T(y) .

3voto

Michael Steele Puntos 345

Llame a U(n) = (T(n),T(n+1),T(n+2)) . La relación de recurrencia significa que para todo n U(n+1) = f(U(n)) donde f es la transformación lineal que envía (a,b,c) a (b,c,a+b+c) .

Por lo tanto, para calcular T(n) en lugar de calcular cada T(i) para cada i, se puede calcular simplemente la transformación lineal f^n aplicarlo a U(0) = (0,1,1) para conseguir U(n) = (T(n),T(n+1),T(n+2)) .

Para calcular f^{2^{40}} modulo 10000, escribir f como una matriz con coeficientes en \mathbb{Z}/10000\mathbb{Z} y cuadrarlo 40 veces.

1voto

Knox Puntos 1543

Tienes razón en que la secuencia es periódica, y su período es menor que (10^4)^3 .

El siguiente pseudocódigo calculará la periodicidad. El argumento m es el número respecto al cual se toma el módulo.

def TribonacciPeriod(m):
    a = 1; b = 1; c = 2 // manually do one iteration
    n = 1
    while (a != 0 or b != 1 or c != 1):
        tmp = (a + b + c) mod m
        a = b; b = c; c = tmp
        n += 1
    return n

Se garantiza que esto termine y devuelva un valor menor que m^3 .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X