मान लीजिए कि हमारे पास एक संख्या एन है, हमें एक सकारात्मक संख्या एम खोजना है जैसे कि जीसीडी (एन ^ एम, एन एंड एम) जितना संभव हो उतना बड़ा हो और एम <एन। हम इस प्रकार प्राप्त सबसे बड़ा gcd भी लौटा देंगे।
तो, अगर इनपुट 20 की तरह है, तो आउटपुट 31 होगा
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- यदि bit_count(n) 0 के समान है, तो
- i के लिए 2 से लेकर int तक ((n) का वर्गमूल) + 1, do
- यदि n mod i 0 के समान है, तो
- रिटर्न इंट(n / i)
- यदि n mod i 0 के समान है, तो
- i के लिए 2 से लेकर int तक ((n) का वर्गमूल) + 1, do
- अन्यथा,
- वैल:=0
- p :=
- डुपन:=n
- जबकि n गैर-शून्य है, करें
- यदि (n और 1) 0 के समान है, तो
- वैल:=वैल + पी
- p :=p * 2
- n :=n>> 1
- यदि (n और 1) 0 के समान है, तो
- रिटर्न gcd(val XOR dupn, val AND dupn)
- वापसी 1
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
from math import gcd, sqrt def bit_count(n): if (n == 0): return 0 else: return (((n & 1) == 0) + bit_count(n >> 1)) def maximum_gcd(n): if (bit_count(n) == 0): for i in range(2, int(sqrt(n)) + 1): if (n % i == 0): return int(n / i) else: val = 0 p = 1 dupn = n while (n): if ((n & 1) == 0): val += p p = p * 2 n = n >> 1 return gcd(val ^ dupn, val & dupn) return 1 n = 20 print(maximum_gcd(n))
इनपुट
20
आउटपुट
31