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 nsadece 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 Ave Bolası 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 , 1veya -1mümkün olan tüm n-tuplleri üretir A. İçin n = 3olması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 Biçin neredeyse aynı şeyi yapıyoruz:
{1,0,0,-1}~t~n
Tekrarlayarak 0, 0içerdiği her bir demet için her bir tetiği çoğaltırız ve böylece veya 0iki katına çıkarırız . Yine örnek olarak kullanmak :1-1n = 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 Aolan her biri için, ve Bile 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}BA{{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ı Abir 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 Normverir √(x²+y²). Bu 0veya verir 1.
Son olarak, şimdi sadece s ve s 1listesindeki 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 .011
nyardımcı olacaktır. Ayrıca A, B ve iki iç ürünün açık bir örneği de yardımcı olabilir.