Mathematica 159 100 87 86 85 bayt
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
Değiştirmek için n
sadece değişken tanımını başlangıçta değiştirin.
Kaba kuvvet olduğu için oldukça yavaş, ancak ilk sekiz sonuç:
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
Sonuncusu zaten 231 saniye sürdü ve çalışma süresi çok üstel.
açıklama
Dediğim gibi kaba kuvvet. Esasen, sadece mümkün olan her şeyi numaralandırıyorum A
ve B
olası her çift için iki nokta ürününü hesaplıyorum ve sonra elde edilen çiftlerin bir kısmını buluyorum {0, 0}
. Mathematica'nın kombinatorik ve lineer cebir fonksiyonları bunu golf oynamakta oldukça yardımcı oldu:
{1,-1}~(t=Tuples)~n
Bu , 1
veya -1
mümkün olan tüm n-tuplleri üretir A
. İçin n = 3
olmasıdır:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
Hesaplamak B
için neredeyse aynı şeyi yapıyoruz:
{1,0,0,-1}~t~n
Tekrarlayarak 0
, 0
içerdiği her bir demet için her bir tetiği çoğaltırız ve böylece veya 0
iki katına çıkarırız . Yine örnek olarak kullanmak :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}}
Şimdi, mümkün A
olan her biri için, ve B
ile mümkün olan her birinin nokta ürününü istiyoruz . Mevcut eğer Örneğin olduğunu , her iki ile nokta ürün istiyorum ve birlikte . Hepsi bizim zaten bir matrisin satırları olduğundan, iki alt listeyi başka bir matrisin sütunları olarak istiyoruz , böylece aralarında basit bir nokta ürünü hesaplayabiliriz. Ancak, transpozasyon , sadece 2 elementli döngüsel alt listelerin bir listesini verir . Bunun yaptığı şey: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}}
A
Partition[#,2,1,1]
Bu yüzden bunu hesaplıyoruz ve nokta ürünümüzü listemizle alıyoruz B
. Artık iç içe bir liste aldığımızdan (her olası A
bir ayrı vektör verdiğinden), bunları düzleştiriyoruz ##&@@
.
Bir çift olup olmadığını öğrenmek için {x, y}
ise {0, 0}
biz hesaplamak Sign[Norm[{x,y}]]
nerede Norm
verir √(x²+y²)
. Bu 0
veya verir 1
.
Son olarak, şimdi sadece s ve s 1
listesindeki s fraksiyonlarını bilmek istediğimizden tek ihtiyacımız listenin aritmetik ortalamasıdır. Bununla birlikte, bu, hem en az bir nokta ürününün sıfır olmayan olma olasılığını verir, bu nedenle istenen sonucu elde etmek için onu çıkarırız .0
1
1
n
yardımcı olacaktır. Ayrıca A, B ve iki iç ürünün açık bir örneği de yardımcı olabilir.