2015-04-05 10 views
12

मैं पूर्णांक की बहुपद अंगूठी पर मूल रूप से विघटन करना चाहता हूं (मूल बहुपद में पूर्णांक गुणांक हैं और सभी कारकों में पूर्णांक गुणांक हैं)।पूर्णांक गुणांक के साथ बहुपद का तेज कारक

उदाहरण के लिए मैं 4*x^6 + 20*x^5 + 29*x^4 - 14*x^3 - 71*x^2 - 48*x को (2*x^4 + 7*x^3 + 4*x^2 - 13*x - 16)*(2*x + 3)*x के रूप में विघटित करना चाहता हूं।

कोड की जटिलता और दृष्टिकोण की अक्षमता से बचने के लिए मुझे कौन सा एल्गोरिदम चुनना चाहिए (अंकगणितीय परिचालनों और स्मृति खपत की कुल राशि के बारे में बोलना)?

मैं सी प्रोग्रामिंग भाषा का उपयोग करने जा रहा हूं।

उदाहरण के लिए, शायद ring of integers modulo prime number पर बहुपद कारक के लिए कुछ अच्छे एल्गोरिदम हैं?

+2

मैटलैब या इसी तरह का उपयोग क्यों नहीं करें? –

+2

@ निकोसेनक्रैंटज़, आमतौर पर मैं इस उद्देश्य के लिए ऋषि गणित का उपयोग करता हूं। लेकिन अब मैं एल्गोरिदम को महसूस कर रहा हूं जो महत्वपूर्ण रूप से बहुपद कारक पर निर्भर करता है और जीपीयू (कुडा या ओपनक्ल आधारित) भी लक्ष्य मंच के रूप में है। तो यह सी – petRUShka

+0

हो सकता है कि शायद न्यूटन विधि चलाएं, कारक पाएं, बहुपद विभाजन, दोहराएं। – Makoto

उत्तर

0

मैथोवरफ्लो पर answer के अनुसार, SageFLINT का उपयोग कारक करने के लिए करता है।

FLINT (संख्या सिद्धांत के लिए फास्ट लाइब्रेरी) संख्या सिद्धांत में गणनाओं के समर्थन में एक सी लाइब्रेरी है। यह संख्या सिद्धांत में एल्गोरिदम में एक शोध परियोजना भी है।

तो यह पुस्तकालय में अपघटन एल्गोरिदम की प्राप्ति को देखने और यहां तक ​​कि उपयोग करने के लिए भी संभव है जो अच्छी तरह से परीक्षण और स्थिर है।

2

चूंकि ऋषि नि: शुल्क और मुक्त स्रोत है, इसलिए आपको ऋषि का उपयोग करने वाले एल्गोरिदम को खोजने में सक्षम होना चाहिए और फिर उसे कॉल करना चाहिए या सी में इसे फिर से कार्यान्वित करना चाहिए। हालांकि, अगर आपको वास्तव में स्क्रैच से एक प्रक्रिया लिखनी है, तो मैं वही करता हूं: सबसे पहले सभी गुणांक के जीसीडी को ढूंढें और इसे विभाजित करें, जो आपके बहुपद "सामग्री मुक्त" बनाता है। फिर व्युत्पन्न लें और मूल बहुपद और इसके व्युत्पन्न के बहुपद जीसीडी को खोजें। उस कारक को बहुपद विभाजन से मूल बहुपद से बाहर ले जाएं, जो आपकी समस्या को दो हिस्सों में विभाजित करता है: एक सामग्री मुक्त, वर्ग मुक्त बहुपद (पी/जीसीडी (पी, पी ') फैक्टरिंग, और एक और बहुपद (जीसीडी (पी, पी ')) जो वर्ग मुक्त नहीं हो सकता है। उत्तरार्द्ध के लिए, शुरुआत में शुरू करें, जब तक कि आप एक या अधिक सामग्री मुक्त, स्क्वायर-मुक्त बहुपदों को फैक्टरिंग करने में समस्या को कम नहीं कर लेते।

अगला चरण एक फैक्टरिंग एल्गोरिदम मॉड पी लागू करना होगा। बर्लकैम्प का एल्गोरिदम संभवतः सबसे आसान है, हालांकि कैंटोर-जैस्हेनॉस कला का राज्य है।

अंत में, पूर्णांक पर कारक के लिए ज़ैसहेनॉस एल्गोरिदम लागू करें। यदि आपको लगता है कि यह बहुत धीमा है, तो इसे "लेन्स्ट्रा-लेनस्ट्रा-लोवाज़ जाली आधार कमी एल्गोरिदम" का उपयोग करके बेहतर किया जा सकता है। http://en.wikipedia.org/wiki/Factorization_of_polynomials#Factoring_univariate_polynomials_over_the_integers

जैसा कि आप देख सकते हैं, यह सब जटिल है और सार बीजगणित से सिद्धांत के एक बड़े पैमाने पर निर्भर करता है। ऋषि कार्यान्वयन, या यहां तक ​​कि केवल अपने प्रोग्राम के भीतर सेज कर्नेल के चल रहे संस्करण को कॉल करने के लिए, उसी लाइब्रेरी का उपयोग करके आप बहुत बेहतर हैं।

संबंधित मुद्दे