চ্যালেঞ্জটি হ'ল ম্যাট্রিক্সের হাফনিয়ান গণনার জন্য দ্রুততম কোডটি লিখতে হবে ।
একটি প্রতিসম 2n
- 2n
ম্যাট্রিক্সের হাফনিয়ান A
হিসাবে সংজ্ঞায়িত করা হয়:
এখানে S 2n থেকে পূর্ণসংখ্যার সব একাধিক বিন্যাসন সেট প্রতিনিধিত্ব করে 1
করতে 2n
হলো, [1, 2n]
।
উইকিপিডিয়া লিঙ্কটি একটি পৃথক চেহারা সূত্রও দেয় যা আগ্রহী হতে পারে (এবং ওয়েবে আরও ভালভাবে দেখলে আরও দ্রুত পদ্ধতি বিদ্যমান) exist একই উইকির পৃষ্ঠাটি সংলগ্ন ম্যাট্রিকগুলির বিষয়ে কথা বলে তবে আপনার কোডটি অন্য ম্যাট্রিকগুলির জন্যও কাজ করা উচিত। আপনি ধরে নিতে পারেন মানগুলি সমস্তই পূর্ণসংখ্যার হবে তবে এটি যে সবগুলি ইতিবাচক তা নয়।
একটি দ্রুত অ্যালগরিদম আছে তবে এটি বোঝা শক্ত বলে মনে হচ্ছে। এবং খ্রিস্টান সিভারস হলেন এটি প্রথম প্রয়োগ করেছিলেন (হাস্কেলের মধ্যে)।
এই প্রশ্নের ম্যাট্রিকগুলি সমস্ত মাত্রা সহ বর্গক্ষেত্র এবং প্রতিসম হয়।
রেফারেন্স বাস্তবায়ন (নোট করুন এটি সবচেয়ে ধীরতম পদ্ধতিটি ব্যবহার করছে)।
মিঃ এক্সকোডারের কাছ থেকে পাইথন কোডের কয়েকটি উদাহরণ এখানে।
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
, এটি তার হাফিয়ানিয়াকে আউটপুট করে।
যেহেতু আপনার কোডটি পরীক্ষা করার দরকার হবে এটি সহায়ক হবে যদি আপনি আমাকে আপনার কোডটিতে ইনপুট হিসাবে একটি ম্যাট্রিক্স দেওয়ার সহজ উপায় দিতে পারেন, উদাহরণস্বরূপ স্ট্যান্ডার্ড ইন থেকে পড়ে I আমি উপাদানগুলির সাথে এলোমেলোভাবে নির্বাচিত ম্যাট্রিকগুলিতে আপনার কোডটি পরীক্ষা করব {-1, 0, 1 from থেকে নির্বাচিত} এই জাতীয় পরীক্ষার উদ্দেশ্য হফনিয়ান একটি খুব বড় মান হ'ল সুযোগ হ্রাস করা।
আদর্শভাবে আপনার কোডটি মেট্রিক্সে ঠিক যেমন পড়তে সক্ষম হবে ঠিক তেমন স্ট্যান্ডার্ড থেকে এই প্রশ্নের উদাহরণগুলিতে। এটি ইনপুটটিকে [[1,-1],[-1,-1]]
উদাহরণ হিসাবে দেখাবে । আপনি যদি অন্য ইনপুট ফর্ম্যাটটি ব্যবহার করতে চান তবে দয়া করে জিজ্ঞাসা করুন এবং আমি যথাসম্ভব চেষ্টা করব।
স্কোর এবং টাই
আমি ক্রমবর্ধমান আকারের এলোমেলো ম্যাট্রিকগুলিতে আপনার কোডটি পরীক্ষা করব এবং আপনার কোডটি আমার কম্পিউটারে 1 মিনিটেরও বেশি সময় নেয় প্রথমবার বন্ধ করব। ন্যায্যতা নিশ্চিত করার জন্য স্কোরিং ম্যাট্রিকগুলি সমস্ত জমা দেওয়ার জন্য সামঞ্জস্যপূর্ণ হবে।
যদি দু'জন লোক একই স্কোর পায় তবে বিজয়ী হ'ল এটির মানটি সবচেয়ে দ্রুত n
। সেগুলি যদি একে অপরের 1 সেকেন্ডের মধ্যে থাকে তবে এটি প্রথমে পোস্ট করা।
ভাষা ও গ্রন্থাগার
আপনি পছন্দ মতো যে কোনও উপলভ্য ভাষা এবং লাইব্রেরি ব্যবহার করতে পারেন তবে হাফনিয়ান গণনা করার জন্য পূর্ব-বিদ্যমান কোনও কার্য নেই। যেখানে সম্ভব, আপনার কোডটি চালাতে সক্ষম হওয়াই ভাল হবে সুতরাং দয়া করে লিনাক্সে কীভাবে আপনার কোডটি চালানো / সংকলন করা যায় তার জন্য সম্পূর্ণ ব্যাখ্যা অন্তর্ভুক্ত করুন `
আমার মেশিনের সময়গুলি আমার -৪-বিট মেশিনে চালিত হবে। এটি 8 জিবি র্যাম, এএমডি এফএক্স-8350 আট-কোর প্রসেসর এবং র্যাডিয়ন এইচডি 4250 সহ একটি স্ট্যান্ডার্ড উবুন্টু ইনস্টল This এর অর্থ এটিও আপনার কোডটি চালাতে সক্ষম হওয়া দরকার।
আরও ভাষায় উত্তরগুলির জন্য কল করুন
আপনার পছন্দসই সুপার ফাস্ট প্রোগ্রামিং ভাষায় উত্তর পাওয়া ভাল লাগবে। জিনিস শুরু করার জন্য, কীভাবে দুর্গ , নিম এবং মরিচা সম্পর্কে ?
লিডারবোর্ড
- 52 মাইল মাইল সি ++ ব্যবহার করে । 30 সেকেন্ড.
- 50 এনজিএন দ্বারা সি ব্যবহার করে । 50 সেকেন্ড
- 46 খ্রিস্টান সিভর্স হাস্কেল ব্যবহার করে । 40 সেকেন্ড
- পাইথন 2 + পিপি ব্যবহার করে মাইল 40 মাইল । 41 সেকেন্ড
- পাইগন 3 + পিপি ব্যবহার করে এনএনজি দ্বারা 34 । 29 সেকেন্ড।
- 28 পাইথন 3 ব্যবহার করে ডেনিস । 35 সেকেন্ড। (পাইপি ধীরে ধীরে)