Це завдання полягає в написанні швидкого коду, який може виконати обчислювально важку нескінченну суму.
Вхідні дані
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
Більш детально, побачимо лише один доданок у сумі за цей П. Візьмемо, наприклад, лише один доданок у сумі:
і 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.
My Machine Часи синхронізуються на моїй машині. Це стандартна установка Ubuntu на 8 Гб AMD FX-8350 восьмиядерний процесор. Це також означає, що мені потрібно мати можливість запускати ваш код.
Провідні відповіді
n = 47
в C ++ від Тона Євангеліяn = 8
у Python by Maltysen
x
з [-1,0,2,1]
. Чи можете ви детальніше зупинитися на цьому? (Підказка: Я не гуру математики)