Thách thức này là viết mã nhanh có thể thực hiện một tổng vô hạn khó tính toán.
Đầu vào
Một n
bằng n
ma trận P
với mục số nguyên nhỏ hơn 100
về giá trị tuyệt đối. Khi kiểm tra tôi rất vui khi cung cấp đầu vào cho mã của bạn ở bất kỳ định dạng hợp lý nào mà mã của bạn muốn. Mặc định sẽ là một dòng trên mỗi hàng của ma trận, phân tách không gian và được cung cấp trên đầu vào tiêu chuẩn.
P
sẽ là xác định tích cực mà ngụ ý nó sẽ luôn luôn đối xứng. Ngoài ra, bạn không thực sự cần biết ý nghĩa tích cực có nghĩa là gì để trả lời thử thách. Tuy nhiên, điều đó có nghĩa là thực sự sẽ có câu trả lời cho số tiền được xác định dưới đây.
Tuy nhiên, bạn cần phải biết sản phẩm vector ma trận là gì.
Đầu ra
Mã của bạn sẽ tính tổng vô hạn:
trong phạm vi cộng hoặc trừ 0,0001 của câu trả lời đúng. Dưới đây Z
là tập hợp các số nguyên và Z^n
tất cả các vectơ có thể có các n
phần tử nguyên và e
là hằng số toán học nổi tiếng xấp xỉ bằng 2.71828. Lưu ý rằng giá trị trong số mũ chỉ đơn giản là một số. Xem dưới đây cho một ví dụ rõ ràng.
Làm thế nào điều này liên quan đến chức năng Riemann Theta?
Trong ký hiệu của bài viết này về xấp xỉ hàm Riemann Theta, chúng tôi đang cố gắng tính toán . Vấn đề của chúng tôi là một trường hợp đặc biệt vì ít nhất hai lý do.
- Chúng tôi đặt tham số ban đầu được gọi
z
trong bài báo được liên kết thành 0. - Chúng ta tạo ma trận
P
theo cách sao cho kích thước tối thiểu của một giá trị riêng1
. (Xem bên dưới để biết cách tạo ma trận.)
Ví dụ
P = [[ 5., 2., 0., 0.],
[ 2., 5., 2., -2.],
[ 0., 2., 5., 0.],
[ 0., -2., 0., 5.]]
Output: 1.07551411208
Chi tiết hơn, chúng ta hãy xem chỉ một thuật ngữ trong tổng số P. Lấy ví dụ chỉ một thuật ngữ trong tổng:
và x^T P x = 30
. Lưu ý rằng đó e^(-30)
là về 10^(-14)
và vì vậy không chắc là quan trọng để có được câu trả lời chính xác cho đến dung sai cho trước. Hãy nhớ lại rằng tổng vô hạn sẽ thực sự sử dụng mọi vectơ có thể có độ dài 4 trong đó các phần tử là số nguyên. Tôi chỉ chọn một để đưa ra một ví dụ rõ ràng.
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
Ghi bàn
Tôi sẽ kiểm tra mã của bạn trên các ma trận được chọn ngẫu nhiên P có kích thước tăng dần.
Điểm của bạn chỉ đơn giản là lớn nhất n
mà tôi nhận được câu trả lời đúng trong vòng chưa đầy 30 giây khi tính trung bình trên 5 lần chạy với ma trận được chọn ngẫu nhiên P
có kích thước đó.
Cà vạt thì sao?
Nếu có hòa, người chiến thắng sẽ là người có mã chạy nhanh nhất trung bình trên 5 lần chạy. Trong trường hợp những thời điểm đó cũng bằng nhau, người chiến thắng là câu trả lời đầu tiên.
Làm thế nào đầu vào ngẫu nhiên sẽ được tạo ra?
- Đặt M là ma trận m by n ngẫu nhiên với m <= n và các mục nhập là -1 hoặc 1. Trong Python / numpy
M = np.random.choice([0,1], size = (m,n))*2-1
. Trong thực tế tôi sẽ thiết lậpm
vền/2
. - Đặt P là ma trận danh tính + M ^ T M. Trong Python / numpy
P =np.identity(n)+np.dot(M.T,M)
. Bây giờ chúng tôi được đảm bảo rằng đóP
là xác định tích cực và các mục trong một phạm vi phù hợp.
Lưu ý rằng điều này có nghĩa là tất cả các giá trị riêng của P ít nhất là 1, làm cho vấn đề có thể dễ dàng hơn so với vấn đề chung là xấp xỉ hàm Riemann Theta.
Ngôn ngữ và thư viện
Bạn có thể sử dụng bất kỳ ngôn ngữ hoặc thư viện nào bạn thích. Tuy nhiên, với mục đích ghi điểm, tôi sẽ chạy mã của bạn trên máy của mình, vì vậy vui lòng cung cấp hướng dẫn rõ ràng về cách chạy mã trên Ubuntu.
Máy của tôi Thời gian sẽ được chạy trên máy của tôi. Đây là bản cài đặt Ubuntu tiêu chuẩn trên Bộ xử lý tám lõi AMD FX-8350. Điều này cũng có nghĩa là tôi cần để có thể chạy mã của bạn.
Câu trả lời hàng đầu
n = 47
trong C ++ của TonMedeln = 8
trong Python của Maltysen
x
số [-1,0,2,1]
. bạn có thể xây dựng trên này? (Gợi ý: Tôi không phải là một chuyên gia toán học)