         NumberBase.downcast x[namex] y
 
   gcd__: (other) ->
-    step = (a, b) -> if b.sgn() > 0 then -> step b, a.mod(b) else a
+    step = (a, b) -> if b.isPos() then -> step b, a.mod(b) else a
 
     [x, y] = [@abs(), other.abs()]
     if x.cmp(y) > 0 then bounce step x, y else bounce step x, y
 
-  for name in ['neg', 'abs', 'sgn']
+  for name in [
+    'neg', 'abs', 'sgn', 'isPos', 'isNeg', 'isZero', 'isEven', 'isOdd'
+  ]
     do (name) ->
       namex = "#{name}__"
       operator name, (a) -> makeNum(a)[namex]()

    seq.sub(r, s)?.reverse()?.dropWhile((x) -> x == 0)?.first() or 0

  cmp__: (x) ->
    if @sign == 0
      -x.sign
    else if x.sign == 0
      @sign
    else if @sign != x.sign
      @sign

  toString: ->
    parts = @digits?.reverse()?.dropWhile((d) -> d == 0)?.map (d) -> d.toString()
    if parts
      sign = if @isNeg() then '-' else ''
      rest = parts.rest()?.map (t) -> "#{zeroes[t.length..]}#{t}"
      sign + parts.first() + if rest? then rest.join '' else ''
    else
