Mathematica, 159 100 87 86 85 bytes
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
Para cambiar, n
simplemente cambie la definición de la variable al principio.
Como es la fuerza bruta, es bastante lenta, pero aquí están los primeros ocho resultados:
n P(n)
1 1/2
2 3/8
3 7/32
4 89/512
5 269/2048
6 903/8192
7 3035/32768
8 169801/2097152
El último ya tomó 231 segundos y el tiempo de ejecución es terriblemente exponencial.
Explicación
Como dije, es fuerza bruta. Esencialmente, solo enumero todos los posibles A
y B
, calculo los dos productos de puntos para cada par posible y luego encuentro la fracción de pares que produjo {0, 0}
. Las funciones de combinatoria y álgebra lineal de Mathematica fueron bastante útiles para jugar golf:
{1,-1}~(t=Tuples)~n
Esto genera todas las n-tuplas que contienen 1
o -1
, es decir, todas las posibles A
. Por n = 3
eso es:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
Para calcular B
hacemos casi lo mismo:
{1,0,0,-1}~t~n
Repitiendo 0
, duplicamos cada tupla para cada uno 0
que contiene, con lo que 0
el doble de probabilidades 1
o -1
. Nuevamente usando n = 3
como ejemplo:
{{-1, -1, -1},
{-1, -1, 0}, {-1, -1, 0},
{-1, -1, 1},
{-1, 0, -1}, {-1, 0, -1},
{-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0},
{-1, 0, 1}, {-1, 0, 1},
{-1, 1, -1},
{-1, 1, 0}, {-1, 1, 0},
{-1, 1, 1},
{0, -1, -1}, {0, -1, -1},
{0, -1, 0}, {0, -1, 0}, {0, -1, 0}, {0, -1, 0},
{0, -1, 1}, {0, -1, 1},
{0, 0, -1}, {0, 0, -1}, {0, 0, -1}, {0, 0, -1},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 1}, {0, 0, 1}, {0, 0, 1}, {0, 0, 1},
{0, 1, -1}, {0, 1, -1},
{0, 1, 0}, {0, 1, 0}, {0, 1, 0}, {0, 1, 0},
{0, 1, 1}, {0, 1, 1},
{1, -1, -1},
{1, -1, 0}, {1, -1, 0},
{1, -1, 1},
{1, 0, -1}, {1, 0, -1},
{1, 0, 0}, {1, 0, 0}, {1, 0, 0}, {1, 0, 0},
{1, 0, 1}, {1, 0, 1},
{1, 1, -1},
{1, 1, 0}, {1, 1, 0},
{1, 1, 1}}
Ahora, para cada posible A
, queremos el producto escalar de cada uno de esos posibles B
, con A[1 .. n]
y A[2 .. n+1]
. Por ejemplo, si nuestro actual A
es {1, 1, -1}
, queremos el producto de punto con ambos {1, 1, -1}
y con {1, -1, 1}
. Como todos nuestros B
ya son convenientemente las filas de una matriz, queremos que las dos sublistas sean A
como columnas de otra matriz, para que podamos calcular un simple producto de puntos entre ellas. Pero la transposición {{1, 1, -1}, {1, -1, 1}}
simplemente da {{1, 1}, {1, -1}, {-1, 1}}
cuál es solo una lista de todas las sublistas cíclicas de 2 elementos A
. Eso es lo que hace esto:
Partition[#,2,1,1]
Entonces calculamos eso y tomamos el producto punto con nuestra lista de B
. Como ahora obtenemos una lista anidada (dado que cada posible A
produce un vector separado), los aplanamos con ##&@@
.
Para averiguar si un par {x, y}
es {0, 0}
, calculamos Sign[Norm[{x,y}]]
dónde Norm
da √(x²+y²)
. Esto da 0
o 1
.
Por último, ya que ahora sólo queremos saber las fracciones de 1
s en una lista de 0
s y 1
S Todo lo que necesitamos es la media aritmética de la lista. Sin embargo, esto produce la probabilidad de que al menos un producto de punto sea distinto de cero, por lo que lo restamos 1
para obtener el resultado deseado.
n
serían útiles. También puede ser útil un ejemplo explícito de A, B y los dos productos internos.