Mathematica, 159 100 87 86 85 bajtów
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
Aby zmienić, npo prostu zmień definicję zmiennej na początku.
Ponieważ jest brutalna, działa dość wolno, ale oto pierwsze osiem wyników:
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
Ostatni z nich zajął już 231 sekund, a środowisko wykonawcze jest strasznie wykładnicze.
Wyjaśnienie
Jak powiedziałem, to brutalna siła. Zasadniczo po prostu wyliczam wszystkie możliwe Ai Bobliczam dwa produkty kropkowe dla każdej możliwej pary, a następnie znajduję ułamek par, które się wydały {0, 0}. Kombinatoryka Mathematiki i funkcje algebry liniowej były bardzo pomocne w grze w golfa:
{1,-1}~(t=Tuples)~n
Generuje to wszystkie n-krotki zawierające 1lub -1, tj. Wszystkie możliwe A. Bo n = 3to jest:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
Aby obliczyć B, robimy prawie to samo:
{1,0,0,-1}~t~n
Powtarzając 0, duplikujemy każdą krotkę dla każdej 0jej zawartości, dzięki czemu 0prawdopodobieństwo jest dwukrotnie większe niż 1lub -1. Ponownie używając n = 3jako przykładu:
{{-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}}
Teraz, dla każdego możliwego A, chcemy iloczynu kropkowego każdego z tych możliwych B, zarówno z, jak A[1 .. n]i A[2 .. n+1]. Np. Jeśli nasz prąd Ajest {1, 1, -1}, chcemy produktu kropkowego zarówno z, jak {1, 1, -1}i z {1, -1, 1}. Ponieważ wszystkie nasze Bsą już wygodnie rzędami macierzy, chcemy, aby dwie podlisty Abyły kolumnami innej macierzy, abyśmy mogli obliczyć prosty iloczyn między nimi. Ale transpozycja {{1, 1, -1}, {1, -1, 1}}po prostu daje, {{1, 1}, {1, -1}, {-1, 1}}co jest tylko listą wszystkich 2-elementowych cyklicznych list podrzędnych A. Tak to działa:
Partition[#,2,1,1]
Obliczamy to i bierzemy produkt kropkowy z naszą listą B. Ponieważ otrzymujemy teraz listę zagnieżdżoną (ponieważ każdy możliwy Adaje osobny wektor), spłaszczamy je za pomocą ##&@@.
Aby dowiedzieć się, czy dana para {x, y}jest {0, 0}obliczana, Sign[Norm[{x,y}]] gdzie Normdaje √(x²+y²). To daje 0lub 1.
Wreszcie, ponieważ teraz po prostu chcesz wiedzieć, ułamki 1sekund na liście 0s, a 1wszystko, czego potrzebujemy jest średnią arytmetyczną z listy. Daje to jednak prawdopodobieństwo, że zarówno co najmniej jeden iloczyn punktowy będzie niezerowy, więc odejmujemy go, 1aby uzyskać pożądany wynik.
nPomocne byłyby przypadki testowe dla pierwszych kilku osób . Może też pomóc wyraźny przykład A, B i dwóch wewnętrznych produktów.