Ранее я задавал вопрос о том, как быстро и точно вычислить вероятность. Тем не менее, очевидно, что это было слишком легко, так как было дано решение в закрытой форме! Вот более сложная версия.
Эта задача о написании кода для точного и быстрого вычисления вероятности . Вывод должен быть точной вероятностью, записанной в виде дроби в наиболее сокращенной форме. То есть это никогда не должно выводиться, 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. На данный момент самая быстрая запись.