# Haskell, 67 bytes

Here's the code:

    a&b|b<2=0|a==b=1+2&(b-1)|mod b a<1=1+2&(b-div b a)|1<2=(a+1)&b
    (2&)

And here's one reason why Haskell is awesome:

    f = (2&)

    (-->) :: Eq a => a -> a -> Bool
    (-->) = (==)

    h=[f(5)        --> 3
      ,f(30)       --> 6
      ,f(31)       --> 7
      ,f(32)       --> 5
      ,f(100)      --> 8
      ,f(200)      --> 9
      ,f(2016^155) --> 2015
      ]

Yes, in Haskell you can define `-->` to be equivalent to `==`.