चुनौती यह है कि मैट्रिक्स के हफियन की गणना के लिए सबसे तेज़ कोड लिखना संभव हो ।
एक सममितीय 2n
- 2n
मैट्रिक्स के हफियन को इस प्रकार A
परिभाषित किया गया है:
यहाँ S 2n पूर्णांक के सभी क्रमपरिवर्तन के सेट को दर्शाता 1
है 2n
, जो कि है [1, 2n]
।
विकिपीडिया लिंक एक अलग दिखने वाला सूत्र भी देता है, जो ब्याज का हो सकता है (और यदि आप वेब पर आगे देखते हैं तो और भी तेज़ तरीके मौजूद हैं)। वही विकी पेज आसन्न मैट्रिसेस के बारे में बात करता है लेकिन आपके कोड को अन्य मैट्रिसेस के लिए भी काम करना चाहिए। आप मान सकते हैं कि सभी पूर्णांक होंगे, लेकिन ऐसा नहीं है कि वे सभी सकारात्मक हैं।
एक तेज़ एल्गोरिथम भी है लेकिन इसे समझना कठिन है। और क्रिश्चियन सिवर्स इसे (हास्केल में) लागू करने वाले पहले व्यक्ति थे।
इस प्रश्न में मैट्रिक्स सभी वर्ग और सममित सम आयाम के साथ हैं।
संदर्भ कार्यान्वयन (ध्यान दें कि यह सबसे धीमी संभव विधि का उपयोग कर रहा है)।
यहाँ श्री एक्सकोडर से कुछ उदाहरण अजगर कोड है।
from itertools import permutations
from math import factorial
def hafnian(matrix):
my_sum = 0
n = len(matrix) // 2
for sigma in permutations(range(n*2)):
prod = 1
for j in range(n):
prod *= matrix[sigma[2*j]][sigma[2*j+1]]
my_sum += prod
return my_sum / (factorial(n) * 2 ** n)
print(hafnian([[-1, 1, 1, -1, 0, 0, 1, -1], [1, 0, 1, 0, -1, 0, -1, -1], [1, 1, -1, 1, -1, -1, 0, -1], [-1, 0, 1, -1, -1, 1, -1, 0], [0, -1, -1, -1, -1, 0, 0, -1], [0, 0, -1, 1, 0, 0, 1, 1], [1, -1, 0, -1, 0, 1, 1, 0], [-1, -1, -1, 0, -1, 1, 0, 1]]))
4
M = [[1, 1, 0, 0, 0, 0, 0, 1, 0, 0], [1, 1, -1, 0, -1, 1, 1, 1, 0, -1], [0, -1, -1, -1, 0, -1, -1, 0, -1, 1], [0, 0, -1, 1, -1, 1, -1, 0, 1, -1], [0, -1, 0, -1, -1, -1, -1, 1, -1, 1], [0, 1, -1, 1, -1, 1, -1, -1, 1, -1], [0, 1, -1, -1, -1, -1, 1, 0, 0, 0], [1, 1, 0, 0, 1, -1, 0, 1, 1, -1], [0, 0, -1, 1, -1, 1, 0, 1, 1, 1], [0, -1, 1, -1, 1, -1, 0, -1, 1, 1]]
print(hafnian(M))
-13
M = [[-1, 0, -1, -1, 0, -1, 0, 1, -1, 0, 0, 0], [0, 0, 0, 0, 0, -1, 0, 1, -1, -1, -1, -1], [-1, 0, 0, 1, 0, 0, 0, 1, -1, 1, -1, 0], [-1, 0, 1, -1, 1, -1, -1, -1, 0, -1, -1, -1], [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, -1, 0], [-1, -1, 0, -1, 0, 0, 1, 1, 1, 1, 1, 0], [0, 0, 0, -1, 0, 1, 1, -1, -1, 0, 1, 0], [1, 1, 1, -1, 0, 1, -1, 1, -1, -1, -1, -1], [-1, -1, -1, 0, 0, 1, -1, -1, -1, 1, -1, 0], [0, -1, 1, -1, 1, 1, 0, -1, 1, -1, 1, 1], [0, -1, -1, -1, -1, 1, 1, -1, -1, 1, 0, -1], [0, -1, 0, -1, 0, 0, 0, -1, 0, 1, -1, 1]]
print(hafnian(M))
13
M = [[-1, 1, 0, 1, 0, -1, 0, 0, -1, 1, -1, 1, 0, -1], [1, -1, 1, -1, 1, 1, -1, 0, -1, 1, 1, 0, 0, -1], [0, 1, 1, 1, -1, 1, -1, -1, 0, 0, -1, 0, -1, -1], [1, -1, 1, -1, 1, 0, 1, 1, -1, -1, 0, 0, 1, 1], [0, 1, -1, 1, 0, 1, 0, 1, -1, -1, 1, 1, 0, -1], [-1, 1, 1, 0, 1, 1, -1, 0, 1, -1, -1, -1, 1, -1], [0, -1, -1, 1, 0, -1, -1, -1, 0, 1, -1, 0, 1, -1], [0, 0, -1, 1, 1, 0, -1, 0, 0, -1, 0, 0, 0, 1], [-1, -1, 0, -1, -1, 1, 0, 0, 1, 1, 0, 1, -1, 0], [1, 1, 0, -1, -1, -1, 1, -1, 1, 1, 1, 0, 1, 0], [-1, 1, -1, 0, 1, -1, -1, 0, 0, 1, -1, 0, -1, 0], [1, 0, 0, 0, 1, -1, 0, 0, 1, 0, 0, 1, 1, 1], [0, 0, -1, 1, 0, 1, 1, 0, -1, 1, -1, 1, 1, -1], [-1, -1, -1, 1, -1, -1, -1, 1, 0, 0, 0, 1, -1, -1]]
print(hafnian(M))
83
काम
आपको कोड लिखना चाहिए, जो मैट्रिक्स 2n
द्वारा दिया गया 2n
है, इसके हाफ़ियनियन को आउटपुट करता है।
जैसा कि मुझे आपके कोड का परीक्षण करने की आवश्यकता होगी, यह उपयोगी होगा यदि आप मुझे अपने कोड के लिए एक इनपुट के रूप में मैट्रिक्स देने के लिए एक सरल तरीका दे सकते हैं, उदाहरण के लिए मानक से पढ़कर। मैं आपके कोड को यादृच्छिक रूप से चुने हुए मैट्रीस तत्वों के साथ परीक्षण करूंगा। {-1, 0, 1} से चयनित। इस तरह के परीक्षण का उद्देश्य हाफ़ियन को कम करने के लिए एक बहुत बड़ा मूल्य होगा।
आदर्श रूप से आपका कोड मैट्रिस में ठीक वैसे ही पढ़ा जा सकेगा जैसा कि मैंने उन्हें इस प्रश्न के उदाहरण में मानक से सीधे में दिया है। यह इनपुट [[1,-1],[-1,-1]]
उदाहरण के लिए जैसा दिखेगा । यदि आप एक और इनपुट प्रारूप का उपयोग करना चाहते हैं, तो कृपया पूछें और मैं इसे समायोजित करने की पूरी कोशिश करूंगा।
स्कोर और संबंध
मैं आपके कोड को बढ़ते हुए आकार के बेतरतीब मैट्रीस पर परीक्षण करूँगा और पहली बार आपके कोड को मेरे कंप्यूटर पर 1 मिनट से अधिक समय तक रोक देगा। निष्पक्षता सुनिश्चित करने के लिए स्कोरिंग मैट्रीस सभी सबमिशन के अनुरूप होगा।
यदि दो लोगों को समान स्कोर मिलता है, तो विजेता वह है जो उस मूल्य के लिए सबसे तेज़ है n
। यदि वे एक दूसरे के 1 सेकंड के भीतर हैं तो यह पहले पोस्ट किया गया एक है।
भाषाएं और पुस्तकालय
आप किसी भी उपलब्ध भाषा और लाइब्रेरियों का उपयोग कर सकते हैं, लेकिन हाफ़ियन की गणना करने के लिए कोई पूर्व-मौजूदा फ़ंक्शन नहीं। संभव होने पर, अपने कोड को चलाने में सक्षम होना अच्छा होगा, इसलिए कृपया अपने कोड को लिनक्स में कैसे चलाएं / संकलित करें, यदि संभव हो तो पूर्ण विवरण शामिल करें। `
माई मशीन द टाइमिंग को मेरी 64-बिट मशीन पर चलाया जाएगा। यह 8GB RAM, AMD FX-8350 Eight-Core Processor और Radeon HD 4250 के साथ एक मानक ubuntu स्थापित है। इसका मतलब यह भी है कि मुझे आपका कोड चलाने में सक्षम होना चाहिए।
अधिक भाषाओं में उत्तर के लिए कॉल करें
अपनी पसंदीदा सुपर फास्ट प्रोग्रामिंग भाषा में उत्तर प्राप्त करना बहुत अच्छा होगा। चीजों को शुरू करने के लिए, फोरट्रान , निम और जंग के बारे में कैसे ?
लीडरबोर्ड
- C ++ का उपयोग करके 52 मील । 30 सेकंड।
- सी का उपयोग करके ngn द्वारा 50 । 50 सेकंड।
- 46 ईसाइयों द्वारा हास्केल का उपयोग करके । 40 सेकंड।
- 40 मील की दूरी पर पायथन 2 + pypy का उपयोग करके । 41 सेकंड।
- पायथन 3 + pypy का उपयोग करके ngn द्वारा 34 । 29 सेकंड।
- 28 डेनिस द्वारा पायथन 3 का उपयोग कर । 35 सेकंड। (Pypy धीमा है)