दो धनात्मक पूर्णांक a और b दिए गए हैं, जिनका महत्तम समान भाजक (GCD) निकालना है। इस बार ये संख्याएँ काफी बड़ी हैं, इसलिए दोनों संख्याओं के सभी भाजक ढूँढकर उनमें से सबसे बड़ा कॉमन भाजक निकालना व्यावहारिक नहीं होगा। हमें इस एल्गोरिथ्म को बेहतर ढंग से अनुकूलित करने की आवश्यकता है।
मान लीजिए a > b। यदि हम किसी कॉमन भाजक d के बारे में सोचें, तो a और b दोनों ही d से विभाजित होते हैं। इसका मतलब है:
जहाँ x और y कुछ पूर्णांक हैं। अगर हम a में से b घटाएँ, तो हमें मिलता है:
इसलिए, d हमेशा a और b दोनों का भाजक रहेगा, और क्योंकि x और y पूर्णांक हैं ⇒ x-y भी पूर्णांक है। अतः a-b = d(x-y) से यह स्पष्ट होता है कि d को a-b का भी भाजक होना चाहिए। यह अवलोकन हमारी प्रोग्राम में किए जाने वाले चरणों की संख्या कम करने में मदद करता है।
यदि महत्तम समान भाजक d, a, b, और a-b सभी को विभाजित करता है, तो हम a के स्थान पर a-b का उपयोग करके GCD ढूँढ़ सकते हैं, क्योंकि a बड़ी संख्या है। हम इस प्रक्रिया को तब तक दोहरा सकते हैं जब तक a या b में से कोई एक 0 न हो जाए (ऐसी स्थिति में जो बचा हुआ गैर-शून्य मान है, वही GCD होगा):
a, b = int(input()), int(input())
while a > 0 and b > 0: # अगर a या b शून्य हो जाए => दूसरा मान ही GCD है
if b > a: # हमेशा a >= b रखने की कोशिश
a, b = b, a # संख्या को अदल-बदल करें
a, b = a - b, b # (a, b) का GCD, (a-b, b) का GCD के समान है
d = b if a == 0 else a # अगर a शून्य हो => b GCD है, अगर b शून्य हो => a GCD है
print('gcd:', d)
चलिए इस एल्गोरिथ्म के कुछ उदाहरण देखते हैं:
a = 8, b = 12
b > a ⇒ अदला-बदली ⇒ a = 12, b = 8
b > a ⇒ अदला-बदली ⇒ a = 8, b = 4
a = 4 - 4 = 0, b = 4
लूप से बाहर ⇒ GCD = 4
a = 54, b = 24
a = 54 - 24 = 30, b = 24
a = 30 - 24 = 6, b = 24
b > a ⇒ अदला-बदली ⇒ a = 24, b = 6
a = 18 - 6 = 12, b = 6
a = 12 - 6 = 6, b = 6
a = 6 - 6 = 0, b = 6
लूप से बाहर ⇒ GCD = 6
a = 17, b = 16
a = 17 - 16 = 1, b = 16
b > a ⇒ अदला-बदली ⇒ a = 16, b = 1
a = 14, b = 1
a = 13, b = 1
a = 12, b = 1
…
…
a = 0, b = 1
लूप से बाहर ⇒ GCD = 1
इनपुट (Input)
इनपुट की एकमात्र पंक्ति में दो पूर्णांक a और b (0 ≤ a, b ≤ ) दिए होते हैं।
आउटपुट (Output)
कार्यक्रम को a और b का महत्तम समान भाजक प्रिंट करना चाहिए।