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
这会生成包含1或-1即all的所有n元组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。
最后,由于我们现在只想知道s和s 1列表中0s 的分数,1所以我们所需要的只是列表的算术平均值。但是,这产生了至少一个点积都为非零的可能性,因此我们将其减去1以获得期望的结果。
n会有所帮助。也可能是A,B和两个内积的明确示例可能有所帮助。