Mathematica, 159 100 87 86 85 байт
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
Для изменения nпросто измените определение переменной в начале.
Так как это грубая сила, это довольно медленно, но вот первые восемь результатов:
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
Последний уже занял 231 секунду, и время выполнения ужасно экспоненциально.
объяснение
Как я уже сказал, это грубая сила. По сути, я просто перечисляю все возможные Aи Bвычисляю два точечных произведения для каждой возможной пары, а затем нахожу полученную долю пар {0, 0}. Комбинаторика Mathematica и функции линейной алгебры очень помогли в игре в гольф:
{1,-1}~(t=Tuples)~n
Это создает все n-кортежи, содержащие 1или -1, то есть все возможные A. Для n = 3этого есть:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
Для вычисления Bмы делаем почти то же самое:
{1,0,0,-1}~t~n
Повторяя 0, мы дублируем каждый кортеж для каждого, который 0он содержит, тем самым делая в 0два раза больше вероятности, чем 1или -1. Снова используя n = 3в качестве примера:
{{-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}}
Теперь, для каждого возможного A, мы хотим получить точечное произведение каждого из этих возможных B, как с, так A[1 .. n]и A[2 .. n+1]. Например , если наш текущий Aявляется {1, 1, -1}, мы хотим , чтобы скалярное произведение с обоими {1, 1, -1}и с {1, -1, 1}. Поскольку все наши Bуже удобно являются строками матрицы, мы хотим, чтобы эти два подсписка были Aстолбцами другой матрицы, чтобы мы могли вычислить простое произведение точек между ними. Но транспонирование {{1, 1, -1}, {1, -1, 1}}просто дает, {{1, 1}, {1, -1}, {-1, 1}}который является просто списком всех 2-элементных циклических подсписков A. Вот что это делает:
Partition[#,2,1,1]
Итак, мы вычислим это и возьмем скалярное произведение с нашим списком B. Так как теперь мы получаем вложенный список (поскольку каждый возможный Aдает отдельный вектор), мы выравниваем их с помощью ##&@@.
Чтобы узнать, есть ли пара {x, y}, {0, 0}мы вычисляем, Sign[Norm[{x,y}]] где Normдает √(x²+y²). Это дает 0или 1.
Наконец, поскольку теперь мы просто хотим знать доли 1s в списке 0s и 1s, все, что нам нужно, это среднее арифметическое этого списка. Однако это дает вероятность того, что оба, по крайней мере, одного точечного произведения отличны от нуля, поэтому мы вычтем его, 1чтобы получить желаемый результат.
nбыли бы полезны. Также может быть полезен явный пример A, B и двух внутренних продуктов.