He calculado el primer $n=22$ coeficientes de dominó basados en las ideas de Vepir. El algoritmo tiene una complejidad de tiempo $O(4^n)$ y la complejidad espacial $O(2^n)$ (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 - $D_{22} \approx 1.04159*10^{53}$ 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:
$D_{0\;} = 1$
$D_{1\;} = 2$
$D_{2\;} = 5$
$D_{3\;} = 18$
$D_{4\;} = 97$
$D_{5\;} = 802$
$D_{6\;} = 10565$
$D_{7\;} = 228850$
$D_{8\;} = 8289217$
$D_{9\;} = 506526530$
$D_{10 } = 52501381765$
$D_{11 } = 9260170733266$
$D_{12 } = 2784551512218145$
$D_{13 } = 1429063630276963426$
$D_{14 } = 1252517782851235507141$
$D_{15 } = 1875484239084442842046130$
$D_{16 } = 4798818821638537354534159233$
$D_{17 } = 20984654018757393270224583817858$
$D_{18 } = 156836820191186149182649796402611461$
$D_{19 } = 2003511561206789377122778581243926768018$
$D_{20 } = 43746600983206157305472349537031148375171041$
$D_{21 } = 1632720578386908900755016228846582339781524154786$
$D_{22 } = 104159355027420388820987121345303301272029996166458949$
$D_{23 } = 11358102129403917231432165494822142898736362479589146061682$
$D_{24 } = 2117071962387596476689143406365411645227548761608194942194112321$
$D_{25 } = 674510308152303132671249373016113929650762465949837199637457187249602$
$D_{26 } = 367337379241994889203376240956745359336562483947308610993230043730270521221$
El logaritmo de $D_n$ parece crecer de forma cuadrática (lo que se puede apreciar incluso mirando la forma de la lista anterior). Tenemos aproximadamente: $$D_n \approx 2^{0.386712 n^2 - 0.667456 n + 3.63662} = \exp(0.268048 n^2 - 0.462645 n + 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 $B_{n+1}=B_n^2+1$ con $B_0=1$ ).
EDITAR
La primera $5$ vectores $v_i$ generando estos $D_i$ son (se omiten los ceros finales):
$v_0=(0,1)$
$v_1=(1,1)$
$v_2=(2, 1, 1, 1)$
$v_3=(5, 2, 3, 2, 2, 1, 2, 1)$
$v_4=(18, 6, 11, 6, 11, 4, 9, 4, 6, 2, 4, 2, 6, 2, 4, 2)$
$v_5=(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 $D_{n-1}$ . 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 $\frac{3}{4}$ de los elementos del vector anterior para obtener el tercer elemento se puede simplemente restar del primer elemento previamente calculado la suma de los $\frac{1}{4}$ 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',n-1)$ 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(s_k,3)$ donde $s_k$ 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$ . $a_k=D(s_k,4)$ , $b_k=D(s_k,5)$ et $c_k=(s_k,6)$ también tienen sus recurrencias: $$a_{k+3}=4a_{k+2}+12a_{k+1}+8a_k$$ $$b_{k+5}=5b_{k+4}+48b_{k+3}+108b_{k+2}+64b_{k+1}-32b_k$$ $$c_{k+8}=6c_{k+7}+164c_{k+6}+896c_{k+5}+1584c_{k+4}-992c_{k+3}-3328c_{k+2}+3584c_{k+1}-1024c_k$$ Con $a_0=b_0=c_0=1$ , $a_1=18=D_3$ , $a_2=96=D_4-1$ , $b_1=97=D_4$ , $b_2=801=D_5-1$ , $b_3=8961$ , $b_4=93697$ , $c_1=802=D_5$ , $c_2=10564=D_6-1$ , $c_3=207720$ , $c_4=3692192$ , $c_5=66924256$ , $c_6=1209149120$ , $c_7=21854550528$ . Para $D(s_k,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 $n \ge 4$ 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 $D_{26} \approx 2^{247.7}$ es el término más grande por debajo de $2^{255}$ por lo que habrá que utilizar tipos enteros más grandes cuando se intente ir más allá.