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
.
Наконец, поскольку теперь мы просто хотим знать доли 1
s в списке 0
s и 1
s, все, что нам нужно, это среднее арифметическое этого списка. Однако это дает вероятность того, что оба, по крайней мере, одного точечного произведения отличны от нуля, поэтому мы вычтем его, 1
чтобы получить желаемый результат.
n
были бы полезны. Также может быть полезен явный пример A, B и двух внутренних продуктов.