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 mudar n
basta alterar a definição da variável no início.
Como a força bruta é bastante lenta, mas aqui estão os oito primeiros 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
O último já levou 231 segundos e o tempo de execução é terrivelmente exponencial.
Explicação
Como eu disse, é força bruta. Basicamente, estou apenas enumerando tudo possível A
e B
calcule os dois produtos de ponto para cada par possível e, em seguida, encontre a fração de pares que produziu {0, 0}
. As funções combinatória e de álgebra linear do Mathematica foram bastante úteis no golfe:
{1,-1}~(t=Tuples)~n
Isso gera todas as n-tuplas que contêm 1
ou -1
, ou seja, tudo possível A
. Pois n = 3
isso é:
{{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
, fazemos quase o mesmo:
{1,0,0,-1}~t~n
Repetindo 0
, duplicamos cada tupla para cada um 0
que contém, aumentando assim a 0
probabilidade de duas vezes 1
ou -1
. Novamente usando n = 3
como exemplo:
{{-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}}
Agora, para cada possível A
, queremos o produto escalar de cada uma delas possível B
, com A[1 .. n]
e A[2 .. n+1]
. Por exemplo, se nossa atual A
é {1, 1, -1}
, queremos o produto escalar com ambos {1, 1, -1}
e com {1, -1, 1}
. Como todas as nossas B
já são convenientemente as linhas de uma matriz, queremos as duas sublistas A
como colunas de outra matriz, para que possamos calcular um simples produto de ponto entre elas. Mas a transposição {{1, 1, -1}, {1, -1, 1}}
simplesmente fornece {{1, 1}, {1, -1}, {-1, 1}}
qual é apenas uma lista de todas as sublistas cíclicas de 2 elementos A
. É o que isso faz:
Partition[#,2,1,1]
Então calculamos isso e pegamos o produto escalar com nossa lista de B
. Como agora obtemos uma lista aninhada (uma vez que cada possível A
gera um vetor separado), as aplainamos ##&@@
.
Para saber se um par {x, y}
é {0, 0}
calculamos Sign[Norm[{x,y}]]
onde Norm
dá √(x²+y²)
. Isso dá 0
ou 1
.
Finalmente, uma vez que agora só quero saber as frações de 1
s em uma lista de 0
s e 1
s toda necessidade que é a média aritmética da lista. No entanto, isso gera a probabilidade de que pelo menos um produto de ponto seja diferente de zero, então subtraímos 1
para obter o resultado desejado.
n
seriam úteis. Talvez também um exemplo explícito de A, B e dos dois produtos internos possa ajudar.