    "Abstraction of numeric types with the usual binary
     operations:

     - addition, `x + y`,
     - subtraction, `x - y`,
     - multiplication, `x * y`, and
     - division, `x / y`, along with
     - additive inverse `-x`.

     A concrete class which implements this interface should be
     a mathematical _ring_. That is:

     - both addition, `+`, and multiplication, `*`, should be
       associative and commutative,
     - there should be additive and multiplicative identities,
       denoted `0` and `1` respectively, satisfying `x+0 == x`
       and `x*1 == x`,
     - every instance `x` should have an additive inverse `-x`,
       satisfying `x + -x == 0`, and
     - multiplication should distribute over addition,
       satisfying `x*(y+z) == x*y + x*z`.

     It is preferred, but not required, that the class be a
     mathematical _field_. That is, in addition to the above:

     - every instance `x` such that `x!=0` should have a
       multiplicative inverse `1/x`, satisfying `x * 1/x == 1`.

     For numeric types which are not fields, for example,
     [[Integer]], there is still a division operation, which is
     understood to produce a [[remainder|Integral.remainder]].
     The division operation should satisfy:

     - `x*y / y == x`

     for any instance `y` other than `0`.

     For numeric types which _are_ fields, division never
     produces a remainder, and division should additionally
     satisfy:

     - `x/y * y == x`

     for any instance `y` other than `0`.

     Some numeric types, for example complex numbers, do not
     have a [[total order|Comparable]]. Numeric types with a
     total order also satisfy [[Number]]."
    see (`interface Number`)
    by ("Gavin")
    tagged("Numbers")
    shared interface Numeric<Other> of Other
            satisfies Invertible<Other>
            given Other satisfies Numeric<Other> {

        "The product of this number and the given number."
        shared formal Other times(Other other);

        "The quotient obtained by dividing this number by the
         given number. For integral numeric types, this
         operation results in a
         [[remainder|Integral.remainder]].

         When the given number is `0`, the additive identity,
         the behavior depends on the numeric type:

         - For some numeric types, including [[Integer]],
           division by `0` results in an exception.
         - For others, including [[Float]], it results in a
           special value of the type, for example, [[infinity]]."
        see (`function Integral.remainder`,
             `value infinity`)
        shared formal Other divided(Other other);

    }