3. Буратино и бинарный поиск НОДа. Моделирование

☰ Теория

Наибольший общий делитель (НОД) чисел A, B принято обозначать (A,B).   [A,B] - используют для обозначения наименьшего общего кратного (НОК).
Несколько простых свойст НОД:
\(I. (a,b)=(a+b,b)=(a-b,b)\)
\(II. (a\cdot d ,b\cdot d)=d\cdot(a,b) \)
\(III. Если\ (a d)=1,\ то (a,d\cdot b)=(a,b) \)
\(IV. Если\ d=(a b)\ то (a/d, b/d)=1 \)

Эти простые правила позволяют модифицировать процедуру нахождения НОД
Для натуральных чисел A, B он может выглядеть так:
gcd=1 # Начальное (минимально возможное) значение НОД 
while ( A % 2 == 0 ) and ( B % 2 == 0 ): # Применяем свойство II для d=2
     A = A / /2
    B = B / /2
    gcd = gcd * 2
while ( A  != B ) and ( A != 1 ) and ( B ! = 1 ) : # Применяем модифицированный Алгоритм Евклида для нечётных чисел
    if A > B : 
        A = A - B # Используем свойство I. После этой операции A - чётное, B - нечётное
        while (A % 2 == 0):  # Используем свойство III
             A = A /  /2
    else : 
        B = B - A
        while ( B %  2 == 0 ):
             B = B / /2
   if  A < B : # умножаем nod на  меньшее из A, B
        gcd = gcd * A
   else :
        gcd = gcd * B


Этот алгоритм называется "бинарным алгоритмом нахождения НОД". 
 

Буратино стал использовать подсказку Пьеро по поиску наибольшего общего делителя для нечетных числел.
Однажды он применил этот способ  для чётного и нечётного числа и получил правильный ответ. Буратино выполнив ещё несколько примеров для четного и нечетного числа  и понял, что данный алгоритм работает для всех пар чисел, в которых хотя бы одно число нечётное. На уроке он рассказал об этом Мальвине. Мальвина похвалила его, дала мороженое и рассказала о некоторых свойствах НОД (см. теорию).
На основе этих правил  Буратино обновил свой алгоритм действий по поиску НОД:
gcd = 1
ПОКА (A чётное ) И (В чётное)  ДЕЛАЙ:
         А и В делим на 2
         gcd умножаем  на 2
Находим d=НОД (А. В) (одно из чисел нечётное - для этого случая уже умеем)
Умножаем gcd на d 
Промежуточные действия  Буратино записывал в тетрадь (смотри примеры)
Напишите программу, которая будет  выводить промежуточные результаты работы Буратино.
                   
Входные данные : натуральные чётные A, B (числа записаны в две строки, каждое не более 100000)
Выходные данные: Промежуточные записи поиска НОД, аналогичные выводу примеров.
Пояснения:
Первая строка содержит начальное значения чисел
Вторая строка содержит промежуточные значения - числа C, D и gcd (хотя бы одно из чисел A,B - нечётное; gcd  - степень числа 2)
Третья строка содержит НОД (C, D)
Четвертая  строка содержит НОД (A, B) 
 
Прмеры промежуточных записей из тетради Буратино:
48
72
48 72
6 9 8
3
24
768
32
768 32
24 1 32
1
32
96
36
96 36
24 9 4
3
12

Напишите программу
Auto
       

time 500 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
Python2
Комментарий учителя