Эта задача состоит в написании быстрого кода, который может выполнить сложную в вычислительном отношении бесконечную сумму.
вход
n
С помощью n
матрицы P
с элементами , которые являются целыми меньше 100
по абсолютной величине. При тестировании я с радостью предоставлю ваш код в любом разумном формате, который вам нужен. По умолчанию будет одна строка на строку матрицы, разделенные пробелом и предоставленные на стандартном вводе.
P
будет положительно определенным, что означает, что он всегда будет симметричным. Кроме этого вам не нужно знать, что значит положительный ответ на вызов. Это, однако, означает, что на самом деле будет ответ на сумму, определенную ниже.
Однако вам необходимо знать, что такое матрично-векторный продукт .
Выход
Ваш код должен вычислять бесконечную сумму:
с точностью до плюс или минус 0,0001 от правильного ответа. Здесь Z
есть множество целых чисел и так Z^n
это все возможные векторы с n
целыми элементами и e
является известной математической константой , которая приблизительно равна 2,71828. Обратите внимание, что значение в показателе степени является просто числом. Смотрите ниже для явного примера.
Как это связано с тэта-функцией Римана?
В обозначениях этой статьи о приближении тэта-функции Римана мы пытаемся вычислить . Наша проблема - особый случай, по крайней мере, по двум причинам.
- Мы устанавливаем начальный параметр, вызванный
z
в связанной статье, в 0. - Мы создаем матрицу
P
таким образом, чтобы минимальный размер собственного значения был1
. (См. Ниже, как создается матрица.)
Примеры
P = [[ 5., 2., 0., 0.],
[ 2., 5., 2., -2.],
[ 0., 2., 5., 0.],
[ 0., -2., 0., 5.]]
Output: 1.07551411208
Более подробно, давайте посмотрим только один член в сумме для этого P. Возьмем, например, только один член в сумме:
и x^T P x = 30
. Обратите внимание, что e^(-30)
это примерно 10^(-14)
так, и вряд ли это важно для получения правильного ответа до заданного допуска. Напомним, что бесконечная сумма будет фактически использовать каждый возможный вектор длины 4, где элементы являются целыми числами. Я просто выбрал один, чтобы привести пример.
P = [[ 5., 2., 2., 2.],
[ 2., 5., 4., 4.],
[ 2., 4., 5., 4.],
[ 2., 4., 4., 5.]]
Output = 1.91841190706
P = [[ 6., -3., 3., -3., 3.],
[-3., 6., -5., 5., -5.],
[ 3., -5., 6., -5., 5.],
[-3., 5., -5., 6., -5.],
[ 3., -5., 5., -5., 6.]]
Output = 2.87091065342
P = [[6., -1., -3., 1., 3., -1., -3., 1., 3.],
[-1., 6., -1., -5., 1., 5., -1., -5., 1.],
[-3., -1., 6., 1., -5., -1., 5., 1., -5.],
[1., -5., 1., 6., -1., -5., 1., 5., -1.],
[3., 1., -5., -1., 6., 1., -5., -1., 5.],
[-1., 5., -1., -5., 1., 6., -1., -5., 1.],
[-3., -1., 5., 1., -5., -1., 6., 1., -5.],
[1., -5., 1., 5., -1., -5., 1., 6., -1.],
[3., 1., -5., -1., 5., 1., -5., -1., 6.]]
Output: 8.1443647932
P = [[ 7., 2., 0., 0., 6., 2., 0., 0., 6.],
[ 2., 7., 0., 0., 2., 6., 0., 0., 2.],
[ 0., 0., 7., -2., 0., 0., 6., -2., 0.],
[ 0., 0., -2., 7., 0., 0., -2., 6., 0.],
[ 6., 2., 0., 0., 7., 2., 0., 0., 6.],
[ 2., 6., 0., 0., 2., 7., 0., 0., 2.],
[ 0., 0., 6., -2., 0., 0., 7., -2., 0.],
[ 0., 0., -2., 6., 0., 0., -2., 7., 0.],
[ 6., 2., 0., 0., 6., 2., 0., 0., 7.]]
Output = 3.80639191181
Гол
Я протестирую ваш код на случайно выбранных матрицах P возрастающего размера.
Ваша оценка просто самая большая, n
за что я получаю правильный ответ менее чем за 30 секунд, когда усредняюсь за 5 прогонов со случайно выбранными матрицами P
такого размера.
Как насчет галстука?
Если есть ничья, победителем станет тот, чей код выполняется быстрее всего, усредненный за 5 запусков. В случае, если эти времена также равны, победителем является первый ответ.
Как будет создан случайный ввод?
- Пусть M - случайная матрица m на n с m <= n и записями, которые равны -1 или 1. В Python / numpy
M = np.random.choice([0,1], size = (m,n))*2-1
. На практике я собираюсьm
быть оn/2
. - Пусть P - единичная матрица + M ^ T M. В Python / numpy
P =np.identity(n)+np.dot(M.T,M)
. Теперь мы гарантируем, чтоP
это определенно положительно, и записи находятся в подходящем диапазоне.
Обратите внимание, что это означает, что все собственные значения P не меньше 1, что делает задачу потенциально более простой, чем общая задача аппроксимации тэта-функции Римана.
Языки и библиотеки
Вы можете использовать любой язык или библиотеку, которая вам нравится. Тем не менее, для целей скоринга я буду запускать ваш код на моей машине, поэтому, пожалуйста, предоставьте четкие инструкции о том, как запустить его в Ubuntu.
Моя машина Время будет запущено на моей машине. Это стандартная установка Ubuntu на 8-гигабайтный 8-ядерный процессор AMD FX-8350. Это также означает, что мне нужно иметь возможность запускать ваш код.
Ведущие ответы
n = 47
в C ++ Тон Хоспельn = 8
в Python Maltysen
источник
x
из[-1,0,2,1]
. Вы можете остановиться на этом? (Подсказка: я не математический гуру)Ответы:
C ++
Нет более наивного подхода. Оцените только внутри эллипсоида.
Использует библиотеки броненосцев, ntl, gsl и pthread. Установить с помощью
Скомпилируйте программу, используя что-то вроде:
В некоторых системах вам может потребоваться добавить
-lgslcblas
после-lgsl
.Запустите с размером матрицы, за которым следуют элементы в STDIN:
matrix.txt
:Или попробовать точность 1е-5:
infinity.cpp
:источник
-lgslcblas
флаг для компиляции. Удивительный ответ, кстати!Python 3
12 секунд n = 8 на моем компьютере, Ubuntu 4 ядра.
Действительно наивный, понятия не имею, что я делаю.
Это будет продолжать увеличивать диапазон,
Z
который он использует, пока не получит достаточно хороший ответ. Я написал свою собственную матрицу умножения, просто нужно использовать numpy.источник