Я раніше задав питання, як швидко та точно обчислити ймовірність. Однак, очевидно, це було занадто просто, оскільки було прийнято рішення закритої форми! Ось більш складна версія.
Це завдання полягає в написанні коду для того, щоб точно і швидко обчислити ймовірність . Вихід повинен бути точною ймовірністю, записаною у вигляді дробу в найбільш скороченому вигляді. Тобто вона ніколи не повинна виводити, 4/8
а навпаки 1/2
.
Для деякого додатного цілого числа n
розглянемо рівномірно випадковий рядок довжиною 1s та -1s n
і назвемо його А. Тепер приєднайтесь до A
копії себе. Тобто, A[1] = A[n+1]
якщо індексація від 1 A[2] = A[n+2]
тощо. A
тепер має довжину 2n
. Тепер також розглянемо другий випадковий рядок довжини n
, перші n
значення якого становлять -1, 0 або 1 з вірогідністю 1/4,1 / 2, 1/4 кожне і назвемо його B.
Тепер розглянемо внутрішній продукт B
з A[1+j,...,n+j]
для різних j =0,1,2,...
.
Наприклад, розглянемо n=3
. Можливі значення для A
і B
можуть бути A = [-1,1,1,-1,...]
і B=[0,1,-1]
. У цьому випадку перші два внутрішніх вироби є 0
і 2
.
Завдання
Для кожного j
, починаючи з j=1
, ваш код повинен виводити ймовірність того, що всі перші j+1
внутрішні продукти дорівнюють нулю для кожного n=j,...,50
.
Копіюючи таблицю, виготовлену Мартином Бюттнером, j=1
ми маємо такі результати вибірки.
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
Оцінка
Ваш бал - найбільший, який j
ваш код заповнюється за 1 хвилину на моєму комп’ютері. Щоб трохи уточнити, кожен j
отримує одну хвилину. Зауважте, що код динамічного програмування в попередньому пов'язаному питанні зробить це легко j=1
.
Автоматичний вимикач
Якщо дві записи отримають однаковий j
бал, тоді виграшним буде той, який за n
одну хвилину на моїй машині потрапить до найвищого j
. Якщо два найкращі результати за цим критерієм рівні, то переможцем буде відповідь, подана першим.
Мови та бібліотеки
Ви можете використовувати будь-яку вільно доступну мову та бібліотеки, які вам подобаються. Я повинен бути в змозі запустити ваш код, тому, будь-ласка, включіть повне пояснення, як запустити / скомпілювати ваш код у Linux.
My Machine Часи синхронізуються на моїй машині. Це стандартна установка ubuntu на восьмиядерний процесор AMD FX-8350. Це також означає, що мені потрібно мати можливість запускати ваш код.
Виграшні записи
j=2
у Python Мітчем Шварцом.j=2
в Python від feersum. Наразі найшвидший запис.