Processing math: 100%

18 votos

Una secuencia con fichas de dominó

Mi amigo se encontró con este problema hace años. Me pidió ayuda, pero tampoco pude resolverlo. La configuración es la siguiente.

Las fichas de dominó se colocan en formación triangular. Algo así...

  (n=2)

Reglas: 1. Si una ficha de dominó es golpeada, puede caer o no. 2. 2. Si una ficha de dominó no es golpeada, no cae.

El problema: Dn es el número de escenarios posibles para un determinado n . Encuentre la fórmula explícita de Dn .

Ejemplo: Para n=2, la ficha de dominó de la parte superior puede caer o no. Si no cae, las dos fichas de abajo no caen. Si lo hace, las dos fichas pueden o no caer. Por lo tanto, D2=5 .

Aclaración: La regla es: la ficha superior puede caer; para cualquier ficha no superior, sólo puede caer si cae al menos una ficha por encima de ella.

Por favor, ayuda. Muchas gracias.

7voto

Matta Puntos 169

Actualización: Encontré una recurrencia en mi respuesta de enfoque alternativo, aquí .


TL;DR

He reducido el problema al cálculo de los "coeficientes de dominó".

Pero parece que estos coeficientes no se pueden calcular fácilmente, y ahí se acaba mi respuesta.


Reducir el problema a "coeficientes de dominó"

Si dn es el número de escenarios con al menos una ficha de dominó caída en el n th fila, entonces

Dn=Dn1+dn

Definimos D0=1,d1=1 . Esto da D1=1+1=2 como se esperaba.

Decimos que una ficha de dominó está "activada" (puede caer) si y sólo si una ficha de dominó por encima de ella ha caído.

αn(k) es el número de maneras de tener exactamente k fichas de dominó "activadas" en el n th fila.

Ahora a calcular dn,n2 tenemos la expresión

dn=nk=1αn(k)(2k1)

Porque cada ficha de dominó "activada" se cae o no, dando 2k estados, y restamos 1 para el caso de que no estén todos caídos porque esa es la definición de dn .

Si una ficha de dominó cae, activa las dos fichas inferiores. Esto implica que αn(1)=0 porque nunca tenemos exactamente una ficha de dominó activada. Por lo tanto, definimos α para 2kn .

El problema es ahora calcular los "coeficientes de dominó" αn(k) .

Por fuerza bruta he encontrado el triángulo que da αn(k) 's para 2k7 es:

12174234211862331521841043223701609255218881056288.......

Filas de lectura n=2,3,4,5,6,7 y se introducen los coeficientes en la recursión:

Dn=Dn1+nk=2αn(k)(2k1)

Da Dn=5,18,97,802,10565,228850 como se esperaba. (Donde D1=2 .)


¿Resolver los coeficientes del dominó?

Para k=2 para activar exactamente dos fichas de dominó en (n) th fila, debe caer exactamente una ficha de dominó en (n1) th fila. Esto da la recursión para el primer coeficiente:

αn(2)=n1r=2αn1(r)r

Pero para k3 No veo una recursión obvia.

El número de formas de activar el dominó en el (n1) th La fila que puede caer ahora depende de las "islas" (carreras consecutivas de fichas de dominó activadas) y de los "huecos" (carreras consecutivas de fichas de dominó no activadas). Para escribir esto como una expresión,

Dejemos que S(n1,r) sea el conjunto de todos los (n1) th secuencias de filas de fichas de dominó donde exactamente r se activan las fichas de dominó. Entonces tenemos que sumar sobre todas sS(n1,r) :

αn(k)=n1r=2sS(n1,r)fk(s)

Donde fk(s) devuelve un valor en función del tamaño de cada "isla" Is y en función del valor del número de activaciones objetivo k en el n th fila.

Recogiendo todo s secuencias y evaluar fk(s) función en ellos es un problema ahora.

Obsérvese que el número de elementos de S(n1,r) es precisamente αn1(r) .

Si k=2 simplemente tenemos f2(s)=r para todos s que da la recursión αn(2) desde arriba.

Si k=3 tenemos f3(s)=(r1) si el s contiene exactamente una isla I de longitud r . De lo contrario, tenemos que observar las islas individuales, para obtener:

f3(s)=Is(L(I)1)

donde L(I) es la longitud de la isla Is . Esto es cierto porque para tener k=3 activó las fichas de dominó en el (n) th fila, necesitamos tener exactamente dos fichas de dominó conectadas en el (n1) th fila.

Para k4 El fk(s) ya no es "tan simple" como sumar longitudes de islas.

Para k=3 contamos maneras:

  • para activar el "single 2 -particiones largas" de las islas

Para k=4 tenemos que contar maneras:

  • para activar el "single 3 -particiones largas" de las islas
  • para activar "dos 1 -particiones largas" separadas con un espacio de al menos un

Y así sucesivamente, para mayores k tenemos más formas de "dividir las activaciones" de las islas.

No veo cómo simplificar esto en una "expresión de forma cerrada (de recursión)".

De ahí que mi respuesta se detenga aquí.

7voto

Matta Puntos 169

Actualización: @Bartek pone en práctica esta idea y calcula más términos nuevos en su respuesta .

Editar: Gracias @Bartek por tu comentario, he hecho la modificación sugerida.

Nota: . El enfoque alternativo que utiliza los "coeficientes de dominó" está en mi respuesta anterior .


TL;DR

Podemos utilizar una recurrencia vectorial para llevar la cuenta de nuevos escenarios de dominó.

Los primeros catorce términos dados por la recurrencia son: ( D14 ya es mayor que 1021 .)

D(n) = 2, 5, 18, 97, 802, 10565, 228850, 8289217, 506526530, 52501381765, 9260170733266, 2784551512218145, 1429063630276963426, 1252517782851235507141,...

Recurrencia

Definimos una secuencia de vectores v(n) para contar nuevos escenarios de dominó, y una "matriz de dominó" M para codificar si ciertos escenarios de dominó son posibles o no. En el n th paso, basta con observar el v(n) et M como si fueran de "dimensión (2n+1) ".

La secuencia Dn para nN es entonces la norma de Manhattan de la secuencia de vectores:

Dn=||v(n)||1

Donde la secuencia de vectores v(n)=(v(n)1,v(n)2,)T está dada por:

v(n+1)=v(n)M

Donde se comienza con v(1)=(1,1,0,0,)T como primer término.

Vamos a llenar la "matriz de dominó" M con 1 y 0 para representar qué cadenas binarias pueden o no generarse con las filas correspondientes en la formación de dominó.

La matriz M

Para rellenar el i th fila (a partir de i=0 ) de la matriz M , mira la representación binaria i(2) . Para rellenar el j th (a partir de j=0 ) en la fila, mira la representación binaria j(2) (rellenándolo con el 0 si es necesario). Tratar i(2),j(2) como filas consecutivas en la formación del triángulo del dominó, donde 0 representan fichas de dominó de pie y 1 representan fichas de dominó caídas. Si es posible tener estas filas en la formación de dominó, colocamos 1 en la matriz. Si no lo está, colocamos 0 en la matriz.

Por ejemplo, si i=2 entonces su representación binaria es i(2)=10 . Esto da la única posibilidad de j(2) son: 000,010,100,110 porque la ficha de la derecha no puede caer nunca en ese caso. Esto se traduce del binario al decimal como j=0,2,4,6 . Esto hace que el i=2 La fila comienza como (1,0,1,0,1,0,1) . El resto de la fila se rellena con 0 hasta la dimensión correspondiente.

Pondré el ejemplo de M cuando n=4 (La matriz es entonces (24+1)×(24+1) )

(1................1111.............1.1.1.1..........11111111.........1...1...1...1....1111111111111111.1.1.1.1.1.1.1.1..1111111111111111.1.......1.......11111....1111....11.1.1.1.1.1.1.1.1111111111111111111...1...1...1...1111111111111111111.1.1.1.1.1.1.1.1111111111111111111...............1)

Donde los puntos individuales " . "s representan ceros" 0 "s", para la visibilidad.

Volviendo a la recursión, esto da efectivamente Dn=2,5,18,97 como se esperaba.

Para calcular primero n términos, necesitamos primero (2n+1) filas de la matriz M .

A pesar de su tamaño, la matriz puede generarse rápidamente una vez que se observa su estructura fractal.

Visualización - La estructura fractal

Podemos tratar 0 y 1 en la matriz M como píxeles en blanco y negro.

Entonces, aquí está la imagen de un (210+1)×(210+1) caso ( n=10 ) de la matriz M :

enter image description here

2voto

Bartek Puntos 131

He calculado el primer n=22 coeficientes de dominó basados en las ideas de Vepir. El algoritmo tiene una complejidad de tiempo O(4n) y la complejidad espacial O(2n) (cálculo para n=22 me llevó alrededor de 5 horas), porque no almacenamos la matriz M y calcular sus valores siempre que sea necesario (la comprobación se realiza en la sentencia if, tiene una forma sencilla gracias a la implementación de operaciones bitwise). El código está en C++ y estoy usando boost para poder usar tipos de datos más grandes en lugar de sólo 64 bit long int (de hecho, 256 bits es el tamaño más pequeño que se puede utilizar para calcular el primer 22 coeficientes e incluso se agotará pronto - D221.041591053 por lo que la secuencia efectivamente crece rápidamente).

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
#include <vector>

int main() {
    const int n = 22;
    std::vector<boost::multiprecision::int256_t> v(1 << n), w = v;
    v[0] = 1;
    v[1] = 1;
    std::cout << "0: " << 1 << "\n1: " << 2 << "\n";
    for (int k = 2; k <= n; k++) {
        for (int j = 0; j < 1 << k; j++) {
            w[j] = 0;
            for (int i = 0; i < 1 << (k - 1); i++)
                if (!(j & ~i & ~(i << 1)))
                    w[j] += v[i];
        }
        boost::multiprecision::int256_t s = 0;
        for (int j = 0; j < 1 << k; j++) {
            v[j] = w[j];
            s += v[j];
        }
        std::cout << k << ": " << s << "\n";
    }
    return 0;
}

Los coeficientes resultantes son:
D0=1
D1=2
D2=5
D3=18
D4=97
D5=802
D6=10565
D7=228850
D8=8289217
D9=506526530
D10=52501381765
D11=9260170733266
D12=2784551512218145
D13=1429063630276963426
D14=1252517782851235507141
D15=1875484239084442842046130
D16=4798818821638537354534159233
D17=20984654018757393270224583817858
D18=156836820191186149182649796402611461
D19=2003511561206789377122778581243926768018
D20=43746600983206157305472349537031148375171041
D21=1632720578386908900755016228846582339781524154786
D22=104159355027420388820987121345303301272029996166458949
D23=11358102129403917231432165494822142898736362479589146061682
D24=2117071962387596476689143406365411645227548761608194942194112321
D25=674510308152303132671249373016113929650762465949837199637457187249602
D26=367337379241994889203376240956745359336562483947308610993230043730270521221

El logaritmo de Dn parece crecer de forma cuadrática (lo que se puede apreciar incluso mirando la forma de la lista anterior). Tenemos aproximadamente: Dn20.386712n20.667456n+3.63662=exp(0.268048n20.462645n+2.52072) Pero no sé qué precisión tiene esta aproximación ni cuáles podrían ser los coeficientes reales. Y tampoco dice mucho sobre la posible fórmula recursiva: parece que sigue estando fuera de alcance.

Este problema es un caso especial del más general - dado un grafo dirigido G Cuántas formas hay de asignar números 0 et 1 a sus vértices de forma que las flechas siempre apunten en la dirección no decreciente (es decir, no de 1 a 0 )? Podemos suponer, sin pérdida de generalidad, que el grafo es conexo (si no, la respuesta es sólo un producto de las respuestas de los componentes) y que es acíclico (el ciclo implica que todos sus tienen que tener el mismo número, por lo que podemos colapsarlos en un vértice). Hay un algoritmo fácil para responder a este problema en el caso de un árbol dirigido (sólo la recursión de las hojas hacia arriba), pero con vértices que interactúan de una manera más compleja, como en este problema, parece difícil, si no imposible, para llegar a un algoritmo rápido, sobre todo teniendo en cuenta, lo rápido que estos coeficientes crecen (aunque, por ejemplo, la fórmula para los árboles binarios perfectos de profundidad n crece aún más rápido y tiene una simple recursión Bn+1=B2n+1 con B0=1 ).

EDITAR
La primera 5 vectores vi generando estos Di son (se omiten los ceros finales):
v0=(0,1)
v1=(1,1)
v2=(2,1,1,1)
v3=(5,2,3,2,2,1,2,1)
v4=(18,6,11,6,11,4,9,4,6,2,4,2,6,2,4,2)
v5=(97,28,56,28,65,20,48,20,56,16,33,16,48,14,31,14,28,8,16,8,20,6,14,6,28,8,16,8,20,6,14,6)
Podemos encontrar la interpretación de cada coeficiente en este vector basándonos en las propiedades fractales de M - por ejemplo el primer elemento del vector v es sólo la suma de todos los elementos del vector anterior (y por lo tanto es sólo Dn1 . El segundo elemento es la suma de cada elemento en la posición impar (si contamos las posiciones desde la izquierda empezando por 0 ) y la tercera es la suma en cada posición no divisible por 4 . Sin embargo, a medida que avanzamos los patrones se vuelven más complejos, pero analizándolos se puede obtener tal vez un algoritmo más rápido (por ejemplo en lugar de sumar 34 de los elementos del vector anterior para obtener el tercer elemento se puede simplemente restar del primer elemento previamente calculado la suma de los 14 elementos con índices divisibles por 4 aunque esta mejora puede producir como máximo el doble de velocidad).

EDITAR 2
Pude calcular más términos de la secuencia (hasta 26 en lugar de 22 ) utilizando el siguiente algoritmo:

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
#include <vector>

int main() {
    int k = 0, n = 26;
    std::vector<boost::multiprecision::int256_t> v(1 << n - 2, 1), a(n + 1, 1);
    for (int i = 2; i < a.size(); i++)
        a[i] = 3 * a[i - 1] + 2 * a[i - 2];
    for (int i = 0; i < v.size(); i++)
        for (int j = i | (i << 1); j; j >>= 1) {
            k += j & 1;
            if (!(j & 1 && j - 1)){
                v[i] *= a[k + 1];
                k = 0;
            }
        }
    for (int i = n - 3; i > 0; i--) {
        std::vector<boost::multiprecision::int256_t> w(1 << i, 0);
        for (int j = 0; j < 1 << i; j++)
            for (int k = 0; k < 1 << i + 1; k++)
                if (!(~(j | j << 1) & k))
                    w[j] += v[k];
        v = w;
        std::cout << n - i + 1 << " " << v[1] + 1 << "\n";
    }
}

Lo que puede ser fácilmente paralelizado acelerando el proceso aún más. La forma de calcular los números también es diferente. Dejemos que D(s,n) denotan la configuración válida del dominó con la cadena binaria s en la parte superior y teniendo n capas - el problema inicial es evaluar D(0,n)+D(1,n)=D(1,n)+1 . Para obtener D(s,n) observamos que para n=1 todos son iguales a uno y para mayor n podemos considerar todas las cadenas s directamente debajo n , calcula recursivamente todos los valores D(s,n1) y sumarlos. La complejidad asintótica es la misma, pero podemos acelerar el programa partiendo de D(s,2) que es igual a 2 a la potencia del número de unos en s o (como en el algoritmo anterior) de D(s,3) observando que el número D(sk,3) donde sk es la cadena formada por k es igual a la OEIS A007483 que tiene una recursión simple y que para todos los demás s es sólo el producto de estos números para cada bloque consecutivo de unos en s . ak=D(sk,4) , bk=D(sk,5) et ck=(sk,6) también tienen sus recurrencias: ak+3=4ak+2+12ak+1+8ak bk+5=5bk+4+48bk+3+108bk+2+64bk+132bk ck+8=6ck+7+164ck+6+896ck+5+1584ck+4992ck+33328ck+2+3584ck+11024ck Con a0=b0=c0=1 , a1=18=D3 , a2=96=D41 , b1=97=D4 , b2=801=D51 , b3=8961 , b4=93697 , c1=802=D5 , c2=10564=D61 , c3=207720 , c4=3692192 , c5=66924256 , c6=1209149120 , c7=21854550528 . Para D(sk,7) No he encontrado tal serie - o no existe o (más probablemente) no hay suficientes términos para detectarla. Tampoco he encontrado una forma de calcular D(s,n) para cualquier n4 para todas las cadenas s por lo que el algoritmo sólo utiliza D(s,3) - si uno es capaz de calcularlos directamente puede obtener términos más grandes de la secuencia. Sólo quiero mencionar que D262247.7 es el término más grande por debajo de 2255 por lo que habrá que utilizar tipos enteros más grandes cuando se intente ir más allá.

1voto

Rob Pratt Puntos 296

He aquí otro enfoque, utilizando el principio de inclusión y exclusión. Queremos encontrar el número de 2 coloraciones de la cuadrícula triangular i{1,,n}, j{1,,i} que no tienen ninguna de las siguientes propiedades:

  • célula (i,1) es negro y la célula (i+1,1) es blanco
  • célula (i,i) es negro y la célula (i+1,i+1) es blanco
  • células (i,j) et (i,j+1) son de color negro y la célula (i+1,j+1) es blanco

Las expresiones de inclusión-exclusión para pequeños n son los siguientes. n=1:21=2n=2:23221+20=84+1=5n=3:26(424+23)+(23+522)21=6472+282=18n=4:210(628+327)+(27+1426+1125)(325+1824+923)+(423+1322)621+20=10241920+1376456+8412+1=97 En general n Los tres primeros términos (hasta dos propiedades) son fáciles, pero a partir de ahí la cosa se complica.

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