Ранее я задавал вопрос о том, как быстро и точно вычислить вероятность. Тем не менее, очевидно, что это было слишком легко, так как было дано решение в закрытой форме! Вот более сложная версия.
Эта задача о написании кода для точного и быстрого вычисления вероятности . Вывод должен быть точной вероятностью, записанной в виде дроби в наиболее сокращенной форме. То есть это никогда не должно выводиться, 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. На данный момент самая быстрая запись.
источник
Ответы:
Python 2, j = 2
Я пытался найти что-то вроде «закрытой формы» для j = 2. Возможно, я мог бы сделать это на MathJax-образе, хотя это было бы очень уродливо, если бы теребили индекс. Я написал этот неоптимизированный код только для проверки формулы. Это займет около 1 секунды. Результаты совпадают с кодом Митча Шварца.
Рассмотрим последовательность, в которой i-й член равен,
e
если A [i] == A [i + 1] илиn
если A [i]! = A [i + 1].i
в программе есть числоn
с. Еслиi
четное, последовательность должна начинаться и заканчиваться наe
. Еслиi
нечетно, последовательность должна начинаться и заканчиватьсяn
. Последовательности дополнительно классифицируются по количеству последовательных последовательностейe
s илиn
s. Естьj
+1 от одного иj
другого.Когда идея случайной ходьбы увеличиваются до 3 -х измерениях, есть неудачная проблема , что существует 4 возможных направления , чтобы идти в ( по одному для каждого из
ee
,en
,ne
, илиnn
) означает , что они не являются линейно зависимыми. Таким образом,k
индекс суммирует количество шагов, выполненных в одном из направлений (1, 1, 1). Затем будет точное количество шагов, которые необходимо предпринять в трех других направлениях, чтобы отменить его.P (n, p) дает количество упорядоченных разбиений n объектов на p частей. W (l, d) дает количество способов случайного обхода
l
шагов, чтобы пройти расстояние точноd
. Как и прежде, есть 1 шанс двигаться влево, 1 шанс двигаться вправо и 2 остаться на месте.источник
j=3
. Это было бы удивительно!Python, J = 2
Подход динамического программирования
j = 1
в моем ответе на предыдущий вопрос не требует много модификаций для работы на более высоком уровнеj
, но быстро становится медленным. Таблица для справки:И код:
Здесь мы отслеживанием первых двух элементов
A
, последние два элементаB
(гдеb2
это последний элемент), и внутренние продукты(A[:n], B)
,(A[1:n], B[:-1])
и(A[2:n], B[:-2])
.источник