Я раніше задав питання, як швидко та точно обчислити ймовірність. Однак, очевидно, це було занадто просто, оскільки було прийнято рішення закритої форми! Ось більш складна версія.
Це завдання полягає в написанні коду для того, щоб точно і швидко обчислити ймовірність . Вихід повинен бути точною ймовірністю, записаною у вигляді дробу в найбільш скороченому вигляді. Тобто вона ніколи не повинна виводити, 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. Наразі найшвидший запис.