Ранее я задавал вопрос о том, как быстро и точно вычислить вероятность. Тем не менее, очевидно, что это было слишком легко, так как было дано решение в закрытой форме! Вот более сложная версия.
Эта задача о написании кода для точного и быстрого вычисления вероятности . Вывод должен быть точной вероятностью, записанной в виде дроби в наиболее сокращенной форме. То есть это никогда не должно выводиться, 4/8а скорее 1/2.
Для некоторого положительного целого числа nрассмотрим равномерно случайную строку длиной 1 с и 1 с nи назовите ее A. Теперь объедините ее 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, если это вообще возможно.
Моя машина Время будет запущено на моей машине. Это стандартная установка Ubuntu на восьмиъядерный процессор AMD FX-8350. Это также означает, что мне нужно иметь возможность запустить ваш код.
Победные записи
j=2в питоне Митч Шварц.j=2в Python с помощью feersum. На данный момент самая быстрая запись.