मेरे पास एक बड़ा मैट्रिक्स है, एन! एक्स एन !, जिसके लिए मुझे निर्धारक लेने की जरूरत है। n के प्रत्येक क्रमचय के लिए, मैं सहयोगीएन के निर्धारक को लेने का कुशल तरीका! एक्स एन! मेपल में मैट्रिक्स
- लंबाई 2n का एक वेक्टर (यह आसान computationally है)
- 2n चर में का एक बहुपद (एन पर पुनरावर्ती अभिकलन रैखिक कारकों में से एक उत्पाद)
मैट्रिक्स वेक्टरों (पॉइंट्स के रूप में विचार) पर बहुपदों के लिए मूल्यांकन मैट्रिक्स है। तो सिग्मा, मैट्रिक्स (क्रमपरिवर्तन द्वारा अनुक्रमित) की ताऊ प्रविष्टि टाउ के लिए वेक्टर में मूल्यांकन सिग्मा के लिए बहुपद है।
उदाहरण: n=3
के लिए, यदि i
वें बहुपद (x1 - 4)(x3 - 5)(x4 - 4)(x6 - 1)
है और j
वें बिंदु (2,2,1,3,5,2)
है, तो मैट्रिक्स के (i,j)
वीं प्रविष्टि (2 - 4)(1 - 5)(3 - 4)(2 - 1) = -8
हो जाएगा। यहां n=3
, इसलिए अंक R^(3!) = R^6
में हैं और बहुपदों में 3!=6
चर हैं।
मेरा लक्ष्य यह निर्धारित करना है कि मैट्रिक्स नॉनसिंगुलर है या नहीं।
मेरे दृष्टिकोण अभी यह है:
- समारोह
point
एक क्रमचय ले जाता है और एक वेक्टर - समारोह
poly
एक क्रमचय ले जाता है और एक बहुपद - समारोह
nextPerm
देता आउटपुट आउटपुट लेक्सिकोग्राफिक ऑर्डर
मेरी कोड के संक्षिप्त स्यूडोकोड संस्करण इस प्रकार है:
B := [];
P := [];
w := [1,2,...,n];
while w <> NULL do
B := B append poly(w);
P := P append point(w);
w := nextPerm(w);
od;
// BUILD A MATRIX IN MAPLE
M := Matrix(n!, (i,j) -> eval(B[i],P[j]));
// COMPUTE DETERMINANT IN MAPLE
det := LinearAlgebra[Determinant](M);
// TELL ME IF IT'S NONSINGULAR
if det = 0 then return false;
else return true; fi;
मैं समारोह LinearAlgebra[Determinant]
में बनाया का उपयोग कर मेपल में काम कर रहा हूँ, लेकिन सब कुछ एक कस्टम बनाया समारोह निम्न स्तर मेपल कार्यों का उपयोग करता है (उदाहरण के लिए seq
, convert
और cat
)।
मेरी समस्या यह है कि यह बहुत लंबा लगता है, जिसका अर्थ है कि मैं धैर्य के साथ n=7
तक जा सकता हूं, लेकिन n=8
प्राप्त करने में दिन लगते हैं। आदर्श रूप में, मैं n=10
पर पहुंचने में सक्षम होना चाहता हूं।
क्या किसी के पास कोई विचार है कि मैं समय को कैसे सुधार सकता हूं? मैं एक अलग भाषा में काम करने के लिए खुला हूं, उदा। मैटलैब या सी, लेकिन मैपल के भीतर इसे गति देने का एक तरीका ढूंढना पसंद करेंगे।
मुझे एहसास है कि सभी गॉरी विवरणों के बिना जवाब देना मुश्किल हो सकता है, लेकिन प्रत्येक फ़ंक्शन के लिए कोड, उदा। point
और poly
, पहले से ही अनुकूलित किया गया है, इसलिए असली सवाल यह है कि अगर फ्लाई पर मैट्रिक्स का निर्माण करके निर्धारक को लेने का कोई तेज़ तरीका है, या ऐसा कुछ।
अद्यतन: यहाँ दो विचारों कि मुझे लगता है कि के साथ toyed है काम नहीं करते हैं:
मैं बहुआयामी पद स्टोर कर सकते हैं (क्योंकि वे कुछ समय ले गणना करने के लिए, मुझे नहीं पता
: फिर से करना है कि मैं इसे) लंबाईn!
का एक वेक्टर में मदद कर सकते हैं, और मक्खी पर अंक की गणना, और निर्धारक के लिए क्रमचय सूत्र में इन मूल्यों को प्लग चाहते हैंयहां समस्या यह है कि यह मैट्रिक्स के आकार में
O(N!)
है, इसलिए मेरे मामले के लिए यहO((n!)!)
होगा। जबn=10
,(n!)! = 3,628,800!
जो कि करने के लिए भी बड़ा करने का तरीका है।LU अपघटन का उपयोग करके निर्धारक की गणना करें। सौभाग्य से, मेरे मैट्रिक्स का मुख्य विकर्ण nonzero है, इसलिए यह व्यवहार्य है। चूंकि यह मैट्रिक्स के आकार में
O(N^3)
है, यहO((n!)^3)
बन जाता है जो कि करने योग्य के करीब है। हालांकि, समस्या यह है कि मुझे पूरे मैट्रिक्स को स्टोर करने की आवश्यकता है, जो स्मृति पर गंभीर तनाव डालता है, रन टाइम को कभी नहीं रोकता है। तो यह कम से कम कुछ और चतुरता के बिना कम से कम काम नहीं करता है। कोई विचार?
आपके बहुपदों के गुणांक कौन से डोमेन हैं, और मूल्यांकन बिंदु, से? आपके उदाहरण पूर्णांक दिखाते हैं - क्या यह एक सरलीकरण है या वास्तव में यह मामला है? –
वे पूर्णांक हैं। – Daniel