2012-05-03 13 views
13

के साथ एकल सरल समीकरण का समाधान सेट गणना करने के लिए मैं प्रपत्र का एक सरल समीकरण है मान लीजिए। यह एकमात्र समीकरण है जो हमें दिया जाता है। संभावित समाधानों में हमें समाधान (एक्स, वाई) की आवश्यकता है जिसमें एक्स सबसे छोटा है। जैसेएल्गोरिथ्म दो चर

7x + 4y = 14, then (2, 0) is the solution 
7x + 4y = 15, then (1, 2) is the solution 
7x + 4y = 32, then (4, 1) and (0, 8) are the possible solutions, 
of which (0, 8) is the correct solution 

मैं कम से कम संभव समय में इसे गणना करने के लिए एक एल्गोरिदम तैयार करना चाहता हूं। वर्तमान एल्गोरिथ्म जो मैं मन में है कुछ इस तरह चला जाता है:

Given an input n 
Calculate max(x) = n/7 
for i = 0 to max(x) 
    If the equation 7*i + 4*y = n holds 
     return value of i and y 
    else 
     continue 

इस एल्गोरिथ्म, मुझे लगता है, सबसे ज्यादा मामले व्यवहार में तक हे (एन) के एक चलने का समय हो सकता है। क्या समाधान की गणना करने के लिए कुछ बेहतर एल्गोरिदम है?

+3

आप कहते हैं 'अगर समीकरण 7 * i + 4 * y = n धारण करता है' मैं आपको लूप से मिलता हूं लेकिन y क्या है? – msam

+0

क्या एक्स और वाई पर ऊपरी सीमा है? यदि हां, तो बाइनरी सफलता के लिए अपना रास्ता खोजें। –

+2

आप [रैखिक पूर्णांक प्रोग्रामिंग] (http://en.wikipedia.org/wiki/Linear_programming#Integral_linear_programs) के बारे में पढ़ना चाहेंगे। आपकी समस्या निश्चित रूप से सामान्यीकृत समस्या का एक विशिष्ट उदाहरण है, लेकिन यदि आप जिस सरलीकृत समस्या का सामना कर रहे हैं, उसके लिए एक कुशल समाधान है तो मैं उत्सुक हूं। – amit

उत्तर

7

हमें अधिक सामान्य समस्या

  • दो coprime धनात्मक पूर्णांक a और b के लिए विचार करना एक सकारात्मक पूर्णांक n दिया, जैसे कि a*x + b*y = n न्यूनतम x साथ गैर नकारात्मक पूर्णांकों की जोड़ी (x,y) खोजते हैं। किसी भी समाधान

    a*x0 + b*y0 = n 
    

    सभी समाधान दिया (यदि वहाँ एक है। वहाँ होने की ज़रूरत नहीं है, जैसे 7*x + 4*y = 5 गैर नकारात्मक x और y साथ कोई हल नहीं है।)

पल के लिए nonnegativity की अनदेखी, कुछ पूर्णांक k के लिए फॉर्म (x0 - k*b, y0 + k*a) है। तो x सापेक्ष b के शेष और y सापेक्ष a के समाधान की एक अपरिवर्तनीय है, और हम

a*x ≡ n (mod b), and b*y ≡ n (mod a) 

तो हम समीकरण a*x ≡ n (mod b) का समाधान करने की जरूरत है - एक दूसरे को इस प्रकार है।

0 < ca*c ≡ 1 (mod b) के साथ एक पूर्णांक बनें।आप इसे विस्तारित यूक्लिडियन एल्गोरिदम, या (समतुल्य) ओ 0 (लॉग बी) चरणों में a/b के निरंतर अंश विस्तार द्वारा उदाहरण के लिए पाते हैं। दोनों एल्गोरिदम प्राकृतिक रूप से उस संपत्ति के साथ अद्वितीय c < b उत्पन्न करते हैं।

फिर x के लिए न्यूनतम उम्मीदवार n*c मॉड्यूल b का शेष x0 है।

समस्या गैर नकारात्मक x और y तभी x0*a <= n अगर साथ एक समाधान है, और फिर x0 न्यूनतम गैर नकारात्मक x nonnegtaive x और y के साथ किसी भी समाधान में प्रदर्शित होने के लिए है।

बेशक

, छोटे a और b 7 और 4 तरह के लिए, जानवर बल नहीं a सापेक्ष b का प्रतिलोम की गणना की तुलना में धीमी है।

+0

उत्कृष्ट उत्तर –

6

हम

7(x-4)+4(y+7)=7x+4y 

तो अगर (एक्स, वाई) एक समाधान है, तो है (एक्स -4, y + 7) भी एक समाधान है। इसलिए यदि कोई समाधान है तो x < 4 के साथ एक है। यही कारण है कि आपको केवल x = 0..3 का परीक्षण करने की आवश्यकता है जो निरंतर समय में चलता है।

इसे फ़ॉर्म कुल्हाड़ी + द्वारा = n के किसी भी समीकरण तक बढ़ाया जा सकता है, आपको केवल x = 0..b-1 का परीक्षण करने की आवश्यकता है।

+0

मुझे लगता है कि समीकरण बदला जा सकता है। सिर्फ एक नमूना क्या है। –

+2

यदि समीकरण फॉर्म ax + by = n का है तो यदि कोई समाधान है, तो x Thomash

+0

आपका विचार अच्छा और सत्य है (मुझे लगता है), लेकिन उत्तर पर्याप्त जानकारीपूर्ण नहीं है। अगर मैं आप थे, तो मैं जवाब संपादित करूँगा और अधिक जानकारी और स्पष्टीकरण जोड़ूंगा। यदि आप ऐसा करते हैं, तो कुछ डाउनवॉटर शायद आपको कम कर देंगे। जिस तरह से, वैसे भी, मैंने इसे आगे बढ़ाया। – amit

1

हे (एन):

y=n/4; 
while((n-4y)%7!=0 && y!=0){ 
y--; 
} 
x=(n-4y)/7; 
+0

क्यों एक पूर्णांक पर कॉल फर्श? यदि एन एक int है, तो एन/4 है।इसके अलावा, दक्षता के लिए आपको एक्स के साथ शुरू करना चाहिए क्योंकि इसकी ऊपरी सीमा छोटी है। –

+0

मैंने इसे सामान्य बना दिया ... कुछ प्रोग्रामिंग भाषाएं हैं जो परिणाम को पूर्णांक नहीं होने पर डिवीजनों को फ़्लोट करने में परिवर्तित करती हैं। –

+0

तो आपने फर्श कॉल को छोड़कर अपने कोड जावा-विशिष्ट को सभी पहलुओं में बनाने का निर्णय लिया। –

2

मैं Numerical Recipes in C पुस्तक में सिंप्लेक्स विधि बाहर की जाँच की सिफारिश करेंगे। आप आसानी से सी कोड जैसे छद्म कोड का इलाज कर सकते हैं और जावा संस्करण बना सकते हैं। आपके द्वारा इच्छित सरलता का संस्करण "बाधित-सरल" है जो केवल सकारात्मक मानों में कार्य करता है। पुस्तक available online for free है। सेक्शन 10.8 के साथ शुरू करें और आगे पढ़ें।

+0

सिंपलक्स विधि शानदार है। –

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