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
まだ始まったばかりで、変数の定義を変更してください。
ブルートフォースなのでかなり遅いですが、最初の8つの結果は次のとおりです。
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
、可能なすべてのペアのための2つのドット積を計算して、得られることがペアの割合を見つけます{0, 0}
。Mathematicaの組合せ論と線形代数関数はこれを行う上で非常に役立ちました:
{1,-1}~(t=Tuples)~n
これは、1
or を含むすべてのnタプルを生成します。-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
またはの2倍の可能性があり-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
がすでに行列の行になっているので、の2つのサブリスト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
リスト内のs の分数を知りたいだけなので、必要なのはリストの算術平均だけです。ただし、これにより、少なくとも1つの内積の両方が非ゼロになる確率が得られるので、それを減算して、目的の結果を得ます。0
1
1
n
役に立ちます。また、A、Bおよび2つの内積の明示的な例も役立つかもしれません。