পাইথন-এ সর্বশ্রেষ্ঠ সাধারণ বিভাজকের জন্য কোড [বন্ধ]


108

A এবং b এর সর্বশ্রেষ্ঠ সাধারণ বিভাজক (GCD) হ'ল বৃহত্তম সংখ্যা যা উভয়কেই বাকী ছাড়াই ভাগ করে দেয়।

দুটি সংখ্যার জিসিডি সন্ধান করার একটি উপায় হ'ল ইউক্লিডের অ্যালগরিদম, যা এই পর্যবেক্ষণের ভিত্তিতে তৈরি করা হয় যে যদি rবাকী বাকী অংশটি aবিভাজন করা হয় bতবে তা হয় gcd(a, b) = gcd(b, r)। বেস কেস হিসাবে, আমরা ব্যবহার করতে পারি gcd(a, 0) = a

একটি ফাংশন বলা GCD যে পরামিতি নেয় লিখুন aএবং bএবং তাদের সাধারণ গুণনীয়ক ফেরৎ।



উত্তর:


300

এটি স্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে

>>> from fractions import gcd
>>> gcd(20,8)
4

inspectপাইথন ২.7- এ মডিউলটির উত্স কোড :

>>> print inspect.getsource(gcd)
def gcd(a, b):
    """Calculate the Greatest Common Divisor of a and b.

    Unless b==0, the result will have the same sign as b (so that when
    b is divided by it, the result comes out positive).
    """
    while b:
        a, b = b, a%b
    return a

পাইথন 3.5 পর্যন্ত gcd হয় mathমডিউল ; মধ্যে fractionsএকটি হ্রাস করা হয়। অধিকন্তু, inspect.getsourceআর কোনও পদ্ধতির জন্য ব্যাখ্যাযোগ্য উত্স কোড আর দেয় না।


3
এটা তোলে ফেরত দেয় না "_largest_ সংখ্যা কোনো বাকি সঙ্গে উভয় তাদের ভাগ" যেমন, fractions.gcd(1, -1)হয় -1কিন্তু 1 > -1অর্থাত, 1ভাগ উভয় 1এবং -1কোন বাকি সঙ্গে এবং এটি চেয়ে বড় -1দেখতে bugs.python.org/issue22477
JFS

1
@ জেফাসেবাস্টিয়ান আমি এটিকে একটি সমস্যা হিসাবে দেখছি না ... সোর্স কোডের মন্তব্যটি কেবল দেখুন: "বি == 0 না হলে ফলাফলের খ হিসাবে একই চিহ্ন থাকবে" , সুতরাং gcd(1, -1) == -1এটি আমার কাছে সম্পূর্ণ বৈধ বলে মনে হয়।
মার্কো বোনেলি

@ মার্কোবোনেলি: হ্যাঁ এটি নথিভুক্ত হিসাবে আচরণ করে তবে এটি পাঠ্যপুস্তকের সংজ্ঞা নয় যা বেশিরভাগ লোকের সাথে পরিচিত। আমি উপরে আলোচনা করেছি যে পড়ুন । ব্যক্তিগতভাবে, আমি যেমনটি পছন্দ করি fractions.gcd()(এটি ইউক্লিডিয়ান রিংয়ের উপাদানগুলিতে কাজ করে)।
jfs

1
পাইথন ৩.৩ অনুসারে @ জেফএসব্যাসতিয়ান এফডব্লিউআইডাব্লু math.gcd(1, -1)ফিরে এসেছে 1
একিউম্যানাস

1
উত্তর এবং মন্তব্যে যেমন বলা হয়েছে ঠিক তেমনই এএবিবি math.gcd () এবং ভগ্নাংশ.gcd () আলাদা।
jfs

39

এমএন সহ অ্যালগরিদমগুলি ভয়াবহ দীর্ঘ চলতে পারে।

এটি একটি আরও ভাল সম্পাদন করে:

def gcd(x, y):
    while y != 0:
        (x, y) = (y, x % y)
    return x

5
এটি স্ট্যান্ডার্ড লাইব্রেরির মধ্যে একটি।
sayantankhan

10
কিভাবে যে অ্যালগরিদম এমনকি কাজ করে? এটি যাদু মত।
ডুডারসন

20
@ নেটম: না, অ্যাসাইনমেন্টটি সেভাবে লেখা যায় না ; টিপল অ্যাসাইনমেন্টটি xনির্ধারিত হওয়ার আগে ব্যবহার করে । আপনি প্রথমে বরাদ্দ yকরেছেন , সুতরাং এখন সেট করা যাচ্ছে ( সর্বদা 0 হিসাবে )। x y0y % y
মার্টিজন পিটারস

1
@ মার্তিজজনপিটারগুলি হ্যাঁ, আপনি ঠিক বলেছেন, আমার একটি অস্থায়ী পরিবর্তনশীল ব্যবহার করা উচিত ছিল। এর মতো: x_ = y; y = x% y; x = x_
নেটম

3
@ নেটম: যা এই উত্তর হিসাবে করা একটি টুপল অ্যাসাইনমেন্ট ব্যবহার করার সময় প্রয়োজন হয় না।
মার্টিজন পিটারস

18

কোডটির এই সংস্করণটি জিসিডি সন্ধানের জন্য ইউক্লিডের অ্যালগরিদম ব্যবহার করে।

def gcd_recursive(a, b):
    if b == 0:
        return a
    else:
        return gcd_recursive(b, a % b)

28
আপনি নামটিতে ইটার ব্যবহার করেছেন তবে এটি আসলে একটি পুনরাবৃত্ত সংস্করণ।
শিপলু মোকাদ্দিম

লুপ সংস্করণগুলির তুলনায় পুনরাবৃত্তি দুর্বল দক্ষ, + আপনাকে এটিকে বি> এ
ডঃ গলু

1
def gcd(a, b): if b == 0: return a return gcd(b, a % b)
আন্দ্রেয়াস কে।


2
def gcd(m,n):
    return gcd(abs(m-n), min(m, n)) if (m-n) else n

5
যখন আপনি সাম্যের জন্য তুলনা করতে চাইছেন তখন কখনও 'হ'ল ব্যবহার করবেন না। ছোট পূর্ণসংখ্যার ক্যাশে সিপিথন বাস্তবায়ন বিশদ।
মারিয়াস গেডমিনাস


1

পুনরাবৃত্তি ব্যবহার করে ,

def gcd(a,b):
    return a if not b else gcd(b, a%b)

ব্যবহার করার সময় ,

def gcd(a,b):
  while b:
    a,b = b, a%b
  return a

ল্যাম্বদা ব্যবহার করে,

gcd = lambda a,b : a if not b else gcd(b, a%b)

>>> gcd(10,20)
>>> 10

1
ল্যাম্বদা সংস্করণটি কাজ করতে পারে না কারণ এটি পুনরাবৃত্তি বন্ধ করার কোনও শর্ত নেই। আমি মনে করি এটি কেবল আপনার পূর্বনির্ধারিত ফাংশনটি কল করছে।
রিম

0
a=int(raw_input('1st no \n'))
b=int(raw_input('2nd no \n'))

def gcd(m,n):
    z=abs(m-n)
    if (m-n)==0:
        return n
    else:
        return gcd(z,min(m,n))


print gcd(a,b)

ইউক্যালিডের অ্যালগরিদমের উপর ভিত্তি করে একটি ভিন্ন পদ্ধতির।


0
def gcdRecur(a, b):
    '''
    a, b: positive integers

    returns: a positive integer, the greatest common divisor of a & b.
    '''
    # Base case is when b = 0
    if b == 0:
        return a

    # Recursive case
    return gcdRecur(b, a % b)

0

পুনরাবৃত্তি সঙ্গে অজগর মধ্যে:

def gcd(a, b):
    if a%b == 0:
        return b
    return gcd(b, a%b)


0

আমি মনে করি আরেকটি উপায় হ'ল পুনরাবৃত্তি ব্যবহার করা। আমার কোডটি এখানে:

def gcd(a, b):
    if a > b:
        c = a - b
        gcd(b, c)
    elif a < b:
        c = b - a
        gcd(a, c)
    else:
        return a

আপনি পুনরাবৃত্তির কলের পরে ফিরে আসছেন না ... চালানোর চেষ্টা করুন gcd(10,5)...
টমেরিকু

0

এর জন্য a>b:

def gcd(a, b):

    if(a<b):
        a,b=b,a
        
    while(b!=0):
        r,b=b,a%r
        a=r
    return a

উভয়ের জন্য a>bবা a<b:

def gcd(a, b):

    t = min(a, b)

    # Keep looping until t divides both a & b evenly
    while a % t != 0 or b % t != 0:
        t -= 1

    return t

4
সোয়াপ Vars পাইথন শিশুদের খেলা হল: b, a = a, b। ভাষা সম্পর্কে আরও পড়ার চেষ্টা করুন
জেসন হু

3
আপনি যা বলেন তা আমি পছন্দ করি তবে আপনি যা বলছেন তা পছন্দ করি না
জ্যাকিঝু

0

লুপগুলি ব্যবহার করে হোমওয়ার্ক অ্যাসাইনমেন্টের জন্য আমাকে এরকম কিছু করতে হয়েছিল। সবচেয়ে কার্যকর উপায় নয়, তবে আপনি যদি কোনও ফাংশন ব্যবহার করতে না চান তবে এটি কাজ করে:

num1 = 20
num1_list = []
num2 = 40
num2_list = []
x = 1
y = 1
while x <= num1:
    if num1 % x == 0:
        num1_list.append(x)
    x += 1
while y <= num2:
    if num2 % y == 0:
        num2_list.append(y)
    y += 1
xy = list(set(num1_list).intersection(num2_list))
print(xy[-1])


-1

এই কোডটি # ব্যবহারকারীর দেওয়া পছন্দ অনুসারে দুইটির বেশি সংখ্যার জিসিডি গণনা করে, এখানে ব্যবহারকারী সংখ্যাটি দেয়

numbers = [];
count = input ("HOW MANY NUMBERS YOU WANT TO CALCULATE GCD?\n")
for i in range(0, count):
  number = input("ENTER THE NUMBER : \n")
  numbers.append(number)
numbers_sorted = sorted(numbers)
print  'NUMBERS SORTED IN INCREASING ORDER\n',numbers_sorted
gcd = numbers_sorted[0]

for i in range(1, count):
  divisor = gcd
  dividend = numbers_sorted[i]
  remainder = dividend % divisor
  if remainder == 0 :
  gcd = divisor
  else :
    while not remainder == 0 :
      dividend_one = divisor
      divisor_one = remainder
      remainder = dividend_one % divisor_one
      gcd = divisor_one

print 'GCD OF ' ,count,'NUMBERS IS \n', gcd

5
স্ট্যাক ওভারফ্লোতে স্বাগতম! এই কোডটি কেন কাজ করে তা ব্যাখ্যা করার জন্য আপনি কিছু আখ্যান যোগ করার বিষয়টি বিবেচনা করবেন এবং এটি কীসের প্রশ্নের উত্তর দেয়? এই প্রশ্নটি জিজ্ঞাসা করা ব্যক্তির পক্ষে এবং অন্য যে কেউ উপস্থিত হয়েছে এটি খুব সহায়ক হবে।
অ্যান্ড্রু বারবার

-1

মান অদলবদল আমার পক্ষে ভাল কাজ করে নি। সুতরাং আমি কেবল সংখ্যার জন্য একটি আয়নার মতো পরিস্থিতি স্থাপন করেছি যা একটি <বি বা অ> বিতে প্রবেশ করানো হয়েছে:

def gcd(a, b):
    if a > b:
        r = a % b
        if r == 0:
            return b
        else:
            return gcd(b, r)
    if a < b:
        r = b % a
        if r == 0:
            return a
        else:
            return gcd(a, r)

print gcd(18, 2)

2
এটি বৈধ পাইথন সিনট্যাক্সও নয়। ইন্ডেন্টেশন গুরুত্বপূর্ণ।
মারিয়াস গেডমিনাস

2
যখন a = খ সম্পর্কে কী হবে? এটি ধরার জন্য আপনার প্রাথমিক আইএফ শর্ত থাকা উচিত।
josh.thomson

-1

এর ধারণাটি বাস্তবায়িত করার সমাধান এখানে Iteration:

def gcdIter(a, b):
    '''
    a, b: positive integers

    returns: a positive integer, the greatest common divisor of a & b.
    '''
    if a > b:
        result = b
    result = a

    if result == 1:
        return 1

    while result > 0:
        if a % result == 0 and b % result == 0:
            return result
        result -= 1

-2
#This program will find the hcf of a given list of numbers.

A = [65, 20, 100, 85, 125]     #creates and initializes the list of numbers

def greatest_common_divisor(_A):
  iterator = 1
  factor = 1
  a_length = len(_A)
  smallest = 99999

#get the smallest number
for number in _A: #iterate through array
  if number < smallest: #if current not the smallest number
    smallest = number #set to highest

while iterator <= smallest: #iterate from 1 ... smallest number
for index in range(0, a_length): #loop through array
  if _A[index] % iterator != 0: #if the element is not equally divisible by 0
    break #stop and go to next element
  if index == (a_length - 1): #if we reach the last element of array
    factor = iterator #it means that all of them are divisibe by 0
iterator += 1 #let's increment to check if array divisible by next iterator
#print the factor
print factor

print "The highest common factor of: ",
for element in A:
  print element,
print " is: ",

greatest_common_devisor (ক)


-2
def gcdIter(a, b):
gcd= min (a,b)
for i in range(0,min(a,b)):
    if (a%gcd==0 and b%gcd==0):
        return gcd
        break
    gcd-=1

এটি সহজতম উপায় ... এটিকে শক্ত করবেন না!
পার বেস বাস

3
কোড সরবরাহ করার জন্য ধন্যবাদ যা সমস্যা সমাধানে সহায়তা করতে পারে তবে সাধারণভাবে উত্তরগুলির মধ্যে আরও বেশি সহায়ক হয় যদি সেগুলির মধ্যে কোডটি কী করার উদ্দেশ্যে করা হয়েছে এবং কেন এটি সমস্যার সমাধান করে তার ব্যাখ্যা অন্তর্ভুক্ত করে।
নিউরন

1
এই কোডটি অসম্পূর্ণ (কোনও চূড়ান্ত রিটার্নের বিবৃতি নেই) এবং অযথাই ফর্ম্যাটেড (কোনও ইনডেন্টিয়ন নয়)। আমি এও নিশ্চিত নই যে এই breakবিবৃতিটি কী অর্জন করতে চাইছে।
kdopen
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.