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