이 과제는 계산이 어려운 무한 합을 수행 할 수있는 빠른 코드를 작성하는 것입니다.
입력
n
의해 n
매트릭스 P
보다 작은 정수 항목이 100
절대 값이다. 테스트 할 때 코드가 원하는 적절한 형식으로 코드에 입력을 제공하게되어 기쁩니다. 기본값은 매트릭스의 행당 한 줄로, 공백으로 구분되고 표준 입력에서 제공됩니다.
P
할 것이다 명확한 긍정적 항상 대칭 될 것입니다 의미한다. 그 외에는 도전에 대한 긍정적 인 명확한 의미가 무엇인지 알 필요가 없습니다. 그러나 실제로 아래에 정의 된 합계에 대한 답변이 있음을 의미합니다.
그러나 행렬-벡터 곱이 무엇인지 알아야합니다 .
산출
코드는 무한 합을 계산해야합니다.
정답의 플러스 또는 마이너스 0.0001 이내로. 여기 Z
정수 세트가 Z^n
있고 n
정수 요소를 가진 모든 가능한 벡터 e
가 있으며, 대략 2.71828 과 같은 유명한 수학 상수 입니다. 지수의 값은 단순히 숫자입니다. 구체적인 예는 아래를 참조하십시오.
이것이 Riemann Theta 기능과 어떤 관련이 있습니까?
Riemann Theta 함수 를 근사화하는 것에 대한 이 논문의 표기에서 우리는 계산하려고합니다 . 우리의 문제는 적어도 두 가지 이유로 특별한 경우입니다.
- 우리
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
5 초 이상 P
해당 크기의 무작위로 선택된 행렬로 뛰면 30 초 이내에 정확한 답변을 얻을 수있는 최대 점수입니다 .
넥타이는 어때?
동점이있는 경우, 코드 실행이 평균 5 회 이상 가장 빠르게 실행됩니다. 그 시간도 같은 경우, 첫 번째 답변이 승자입니다.
무작위 입력은 어떻게 만들어 집니까?
- M <= n 및 항목이 -1 또는 1 인 임의의 m x n 행렬로 M을 시키십시오. In 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 이상이므로 Riemann Theta 함수를 근사화하는 일반적인 문제보다 잠재적으로 문제가 더 쉽다는 것을 의미합니다.
언어와 라이브러리
원하는 언어 나 라이브러리를 사용할 수 있습니다. 그러나 점수를 매기기 위해 내 컴퓨터에서 코드를 실행하므로 Ubuntu에서 코드를 실행하는 방법에 대한 명확한 지침을 제공하십시오.
내 컴퓨터 타이밍이 내 컴퓨터에서 실행됩니다. 이것은 8GB AMD FX-8350 8 코어 프로세서에 표준 우분투 설치입니다. 이것은 또한 코드를 실행할 수 있어야 함을 의미합니다.
선행 답변
n = 47
Ton Hospel의 C ++ 에서n = 8
에서 파이썬 Maltysen로
x
의 [-1,0,2,1]
. 이것에 대해 자세히 설명해 주시겠습니까? (힌트 : 저는 수학 전문가가 아닙니다)