Mathematica, 159 100 87 86 85 byte
n=3;1-Mean@Sign[##&@@Norm/@({1,0,0,-1}~t~n.Partition[#,2,1,1])&/@{1,-1}~(t=Tuples)~n]
Untuk mengubah, n
cukup ubah definisi variabel di awal.
Karena ini kekuatan kasar, ini cukup lambat, tetapi inilah delapan hasil pertama:
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
Yang terakhir sudah mengambil 231 detik dan runtime sangat eksponensial.
Penjelasan
Seperti yang saya katakan itu brute force. Pada dasarnya, saya hanya menghitung semua yang mungkin A
dan B
, menghitung dua produk titik untuk setiap pasangan yang memungkinkan dan kemudian menemukan sebagian kecil dari pasangan yang menghasilkan {0, 0}
. Combinatorics dan fungsi aljabar linear matematika cukup membantu dalam bermain golf ini:
{1,-1}~(t=Tuples)~n
Ini menghasilkan semua n-tupel yang mengandung 1
atau -1
, yaitu semua yang mungkin A
. Untuk n = 3
itu adalah:
{{1, 1, 1},
{1, 1, -1},
{1, -1, 1},
{1, -1, -1},
{-1, 1, 1},
{-1, 1, -1},
{-1, -1, 1},
{-1, -1, -1}}
Untuk menghitung, B
kami melakukan hal yang hampir sama:
{1,0,0,-1}~t~n
Dengan mengulangi 0
, kami duplikat setiap tupel untuk setiap 0
mengandung, sehingga membuat 0
dua kali lebih mungkin sebagai 1
atau -1
. Sekali lagi menggunakan n = 3
sebagai contoh:
{{-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}}
Sekarang, untuk setiap kemungkinan A
, kami ingin produk titik dari masing-masing yang mungkin B
, baik dengan A[1 .. n]
dan A[2 .. n+1]
. Misalnya jika saat ini kami A
adalah {1, 1, -1}
, kami ingin dot produk dengan baik {1, 1, -1}
dan dengan {1, -1, 1}
. Karena semua kita B
sudah dengan nyaman baris dari matriks, kami ingin dua sublists A
sebagai kolom dari matriks lain, sehingga kami dapat menghitung produk titik sederhana di antara mereka. Tetapi transposing {{1, 1, -1}, {1, -1, 1}}
hanya memberikan {{1, 1}, {1, -1}, {-1, 1}}
yang hanya daftar semua sub-siklik 2-elemen dari A
. Itulah yang dilakukan:
Partition[#,2,1,1]
Jadi kami menghitungnya dan mengambil produk titik dengan daftar kami B
. Karena sekarang kami mendapatkan daftar bersarang (karena setiap kemungkinan A
menghasilkan vektor terpisah), kami meratakannya dengan ##&@@
.
Untuk mengetahui apakah suatu pasangan {x, y}
adalah {0, 0}
kita menghitung di Sign[Norm[{x,y}]]
mana Norm
memberi √(x²+y²)
. Ini memberi 0
atau 1
.
Akhirnya, karena kita sekarang hanya ingin mengetahui fraksi 1
s dalam daftar 0
s dan 1
s semua yang kita butuhkan adalah rata-rata aritmatika dari daftar. Namun, ini menghasilkan probabilitas kedua produk setidaknya satu titik menjadi nol, jadi kami kurangi dari itu 1
untuk mendapatkan hasil yang diinginkan.
n
akan sangat membantu. Mungkin juga contoh eksplisit dari A, B dan dua produk dalam mungkin membantu.