Mathematica, 159 100 87 86 85 byte
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
Per cambiare nbasta cambiare la definizione della variabile all'inizio.
Dal momento che è una forza bruta è piuttosto lento, ma ecco i primi otto risultati:
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
L'ultimo ha già impiegato 231 secondi e l'autonomia è orribilmente esponenziale.
Spiegazione
Come ho detto è una forza bruta. In sostanza, sto solo elencando tutto il possibile Ae B, calcolo i due prodotti punto per ogni possibile coppia e quindi trovo la frazione di coppie che ha prodotto {0, 0}. Le funzioni combinatorie di Mathematica e algebra lineare sono state molto utili per giocare a golf:
{1,-1}~(t=Tuples)~n
Questo genera tutte le n-tuple contenenti 1o -1, cioè, tutte le possibili A. Per n = 3quello è:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
Per calcolare Bfacciamo quasi lo stesso:
{1,0,0,-1}~t~n
Ripetendo 0, dupliciamo ogni tupla per ciascuna 0che contiene, aumentando così il 0doppio di 1o -1. Sempre usando n = 3come esempio:
{{-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}}
Ora, per ogni possibile A, vogliamo che il prodotto scalare di ciascuna di quelle possibili B, entrambi con A[1 .. n]e A[2 .. n+1]. Ad esempio, se la nostra corrente Aè {1, 1, -1}, vogliamo il prodotto punto con entrambi {1, 1, -1}e con {1, -1, 1}. Dal momento che tutte le nostre Bsono già convenientemente le righe di una matrice, vogliamo le due liste secondarie Acome colonne di un'altra matrice, in modo da poter calcolare un semplice prodotto punto tra loro. Ma trasporre {{1, 1, -1}, {1, -1, 1}}dà semplicemente {{1, 1}, {1, -1}, {-1, 1}}quale è solo un elenco di tutte le liste secondarie cicliche a 2 elementi di A. Questo è ciò che fa:
Partition[#,2,1,1]
Quindi lo calcoliamo e prendiamo il prodotto punto con il nostro elenco di B. Dato che ora otteniamo un elenco nidificato (poiché ogni possibile Aproduce un vettore separato), li appiattiamo con ##&@@.
Per scoprire se una coppia {x, y}è {0, 0}calcoliamo Sign[Norm[{x,y}]] dove Normdà √(x²+y²). Questo dà 0o 1.
Infine, dal momento che ora vogliamo solo sapere le frazioni di 1s in un elenco di 0s e 1s tutti abbiamo bisogno è la media aritmetica della lista. Tuttavia, questo produce la probabilità che entrambi i prodotti con almeno un punto siano diversi da zero, quindi lo sottraggiamo 1per ottenere il risultato desiderato.
nsarebbero utili. Anche un esempio esplicito di A, B e dei due prodotti interni potrebbe essere d'aiuto.