s = '''
import fractions
a = 10
b = 12
def b_gcd(m, n):
fact = 1
while m > 1 and n > 1 and m != n:
om, on = m & 1, n & 1
if om and on:
m, n = abs(m - n)>>1, min(m, n)
elif not (om or on):
fact, m, n = fact<<1, m>>1, n>>1
else:
m, n = (m>>1, n) if on else (m, n>>1)
m, n = (m, n) if n > m else (n, m)
return (m or n)<<(fact - 1)
def gcd3(m, n):
while m != 0 and n != 0:
if m > n:
m = m % n
else:
n = n % m
return (m + n)
def gcd2(m, n):
factor = 1
while m > 1 and n > 1:
if m % 2 == 0 and n % 2 == 0:
factor *= 2
m /= 2
n /= 2
continue
elif m % 2 != 0 and n % 2 != 0:
m, n = abs(m - n) / 2, min(m, n)
continue
if m % 2 == 0:
m /= 2
if n % 2 == 0:
n /= 2
if m == 0 or n == 0:
out = m + n
elif n == m:
out = n
elif m == 1 or n == 1:
out = 1
return factor * out
def gcd(m, n):
if m == 0:
return n
if n == 0:
return m
if m == n:
return n
if m == 1 or n == 1:
return 1
if m % 2 == 0 and n % 2 == 0:
return 2 * gcd(m / 2, n / 2)
if m % 2 == 0 and n % 2 != 0:
return gcd(m / 2, n)
if n % 2 == 0 and m % 2 != 0:
return gcd(m, n / 2)
if m % 2 != 0 and n % 2 != 0:
if n > m:
return gcd((n-m)/2, m)
else:
return gcd((m-n)/2, n)
'''
import random
import timeit
import fractions
# for test in range(100):
# a, b = random.randint(0, 100), random.randint(0, 100)
# fa = gcd(a, b)
# fb = gcd2(a, b)
# assert fa == fb, 'Not ok'
number = 10 ** 5
print timeit.timeit('gcd(a, b)', setup=s, number=number)
print timeit.timeit('gcd2(a, b)', setup=s, number=number)
print timeit.timeit('gcd3(a, b)', setup=s, number=number)
print timeit.timeit('b_gcd(a, b)', setup=s, number=number)
print timeit.timeit('fractions.gcd(a, b)', setup=s, number=number)
print 'ok'
cyA9ICcnJwppbXBvcnQgZnJhY3Rpb25zCmEgPSAxMApiID0gMTIKCmRlZiBiX2djZChtLCBuKToKICAgIGZhY3QgPSAxCiAgICAgCiAgICB3aGlsZSBtID4gMSBhbmQgbiA+IDEgYW5kIG0gIT0gbjoKICAgICAKICAgICAgICBvbSwgb24gPSBtICYgMSwgbiAmIDEKICAgICAgICAgCiAgICAgICAgaWYgb20gYW5kIG9uOgogICAgICAgICAgICBtLCBuID0gYWJzKG0gLSBuKT4+MSwgbWluKG0sIG4pCiAgICAgICAgIAogICAgICAgIGVsaWYgbm90IChvbSBvciBvbik6CiAgICAgICAgICAgIGZhY3QsIG0sIG4gPSBmYWN0PDwxLCBtPj4xLCBuPj4xCiAgICAgICAgIAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG0sIG4gPSAobT4+MSwgbikgaWYgb24gZWxzZSAobSwgbj4+MSkKICAgICAKICAgIG0sIG4gPSAobSwgbikgaWYgbiA+IG0gZWxzZSAobiwgbSkKICAgIHJldHVybiAobSBvciBuKTw8KGZhY3QgLSAxKQoKZGVmIGdjZDMobSwgbik6CiAgICB3aGlsZSBtICE9IDAgYW5kIG4gIT0gMDoKICAgICAgICBpZiBtID4gbjoKICAgICAgICAgICAgbSA9IG0gJSBuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbiA9IG4gJSBtCiAgICByZXR1cm4gKG0gKyBuKQoKCmRlZiBnY2QyKG0sIG4pOgogICAgZmFjdG9yID0gMQoKICAgIHdoaWxlIG0gPiAxIGFuZCBuID4gMToKCiAgICAgICAgaWYgbSAlIDIgPT0gMCBhbmQgbiAlIDIgPT0gMDoKICAgICAgICAgICAgZmFjdG9yICo9IDIKICAgICAgICAgICAgbSAvPSAyCiAgICAgICAgICAgIG4gLz0gMgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGVsaWYgbSAlIDIgIT0gMCBhbmQgbiAlIDIgIT0gMDoKICAgICAgICAgICAgbSwgbiA9IGFicyhtIC0gbikgLyAyLCBtaW4obSwgbikKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbSAlIDIgPT0gMDoKICAgICAgICAgICAgbSAvPSAyCgogICAgICAgIGlmIG4gJSAyID09IDA6CiAgICAgICAgICAgIG4gLz0gMgoKICAgIGlmIG0gPT0gMCBvciBuID09IDA6CiAgICAgICAgb3V0ID0gbSArIG4KICAgIGVsaWYgbiA9PSBtOgogICAgICAgIG91dCA9IG4KICAgIGVsaWYgbSA9PSAxIG9yIG4gPT0gMToKICAgICAgICBvdXQgPSAxCgogICAgcmV0dXJuIGZhY3RvciAqIG91dAoKCmRlZiBnY2QobSwgbik6CiAgICBpZiBtID09IDA6CiAgICAgICAgcmV0dXJuIG4KCiAgICBpZiBuID09IDA6CiAgICAgICAgcmV0dXJuIG0KCiAgICBpZiBtID09IG46CiAgICAgICAgcmV0dXJuIG4KCiAgICBpZiBtID09IDEgb3IgbiA9PSAxOgogICAgICAgIHJldHVybiAxCgogICAgaWYgbSAlIDIgPT0gMCBhbmQgbiAlIDIgPT0gMDoKICAgICAgICByZXR1cm4gMiAqIGdjZChtIC8gMiwgbiAvIDIpCgogICAgaWYgbSAlIDIgPT0gMCBhbmQgbiAlIDIgIT0gMDoKICAgICAgICByZXR1cm4gZ2NkKG0gLyAyLCBuKQoKICAgIGlmIG4gJSAyID09IDAgYW5kIG0gJSAyICE9IDA6CiAgICAgICAgcmV0dXJuIGdjZChtLCBuIC8gMikKCiAgICBpZiBtICUgMiAhPSAwIGFuZCBuICUgMiAhPSAwOgogICAgICAgIGlmIG4gPiBtOgogICAgICAgICAgICByZXR1cm4gZ2NkKChuLW0pLzIsIG0pCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBnY2QoKG0tbikvMiwgbikKJycnCmltcG9ydCByYW5kb20KaW1wb3J0IHRpbWVpdAppbXBvcnQgZnJhY3Rpb25zCgojIGZvciB0ZXN0IGluIHJhbmdlKDEwMCk6CiMgICAgIGEsIGIgPSByYW5kb20ucmFuZGludCgwLCAxMDApLCByYW5kb20ucmFuZGludCgwLCAxMDApCiMgICAgIGZhID0gZ2NkKGEsIGIpCiMgICAgIGZiID0gZ2NkMihhLCBiKQojICAgICBhc3NlcnQgZmEgPT0gZmIsICdOb3Qgb2snCgpudW1iZXIgPSAxMCAqKiA1CnByaW50IHRpbWVpdC50aW1laXQoJ2djZChhLCBiKScsIHNldHVwPXMsIG51bWJlcj1udW1iZXIpCnByaW50IHRpbWVpdC50aW1laXQoJ2djZDIoYSwgYiknLCBzZXR1cD1zLCBudW1iZXI9bnVtYmVyKQpwcmludCB0aW1laXQudGltZWl0KCdnY2QzKGEsIGIpJywgc2V0dXA9cywgbnVtYmVyPW51bWJlcikKcHJpbnQgdGltZWl0LnRpbWVpdCgnYl9nY2QoYSwgYiknLCBzZXR1cD1zLCBudW1iZXI9bnVtYmVyKQpwcmludCB0aW1laXQudGltZWl0KCdmcmFjdGlvbnMuZ2NkKGEsIGIpJywgc2V0dXA9cywgbnVtYmVyPW51bWJlcikKcHJpbnQgJ29rJwo=