Ամենամեծ ընդհանուր բաժանարար (GCD) - Էվկլիդեսի ալգորիթմ
Մի քանի անգամ ալգորիթմը գործարկելուց հետո կարելի է նկատել, որ որոշ գործողություններ ավելորդ են, և ամենամեծ ընդհանուր բաժանարար (GCD) գտնելու ալգորիթմը հնարավոր է օպտիմիզացնել։
Հանելով ամենամեծ ընդհանուր բաժանարար գտնելու տարբերակում անընդհատ հանում ենք փոքր թիվը մեծ թվից, մինչև ստանանք 0 կամ վերջնական պատասխանին հավասար թիվ։ Այդ գործընթացը կարելի է արագացնել, եթե մեծ թիվը բաժանենք փոքր թվի վրա ու խնդիրը լուծենք մնացորդով։ Մոդուլո (modulo) գործողության դեպքում մեծ թիվը անընդհատ բաժանվում է փոքր թվի վրա, ու վերցվում է մնացորդը, մինչև ստացվի 0։ Վերջին ոչ զրոյական մնացորդը հանդիսանում է ամենամեծ ընդհանուր բաժանարարը (GCD)։
Մոդուլո գործողությունը պարզապես ավելի արդյունավետ միջոց է GCD գտնելու համար։ Բազմաթիվ անգամ մեծ թվից փոքրը հանելու փոխարեն, դուք բաժանում եք այդ թվերը իրենց ընդհանուր բաժանարարներով, ու արդյունքում շատ ավելի արագ եք մոտենում մեծագույն ընդհանուր բաժանարարին։
a, b = int(input()), int(input())
while a > 0 and b > 0: # Եթե a-ն կամ b-ն 0 են, ապա մյուսը կլինի GCD
a, b = b, a % b # (a, b)-ի GCD-ն հավասար է (b, a % b)-ի GCD-ին
d = b if a == 0 else a # եթե a-ն 0 է, ապա b-ն է GCD, իսկ եթե b-ն է 0, ապա a-ն է GCD
print('gcd:', d)
Այս ալգորիթմը առաջին անգամ հիշատակվել է Էվկլիդեսի գրքում, որը գրվել է մ.թ.ա. մոտ 300 թվականին։
Եկեք դիտարկենք ալգորիթմի աշխատանքի մի քանի օրինակ.
a = 8, b = 12
a = 12, b = 8
a = 8, b = 4
a = 4, b = 0
break ⇒ GCD = 4
a = 54, b = 24
a = 24, b = 6
a = 6, b = 0
break ⇒ GCD = 6
a = 17, b = 16
a = 16, b = 1
a = 1, b = 0
break ⇒ GCD = 1
Մուտք
Մուտքի միակ տողում տրված են երկու ամբողջ թվեր a և b (0 ≤ a, b ≤ )։
Ելք
Ծրագիրը պետք է տպի a և b-ի ամենամեծ ընդհանուր բաժանարարը (GCD)։