def new_point(p)
      case p
      when :infinity
        infinity
      when Array
        x, y = p
        Point.new(self, x, y)
      when Integer
        generator.multiply_by_scalar(p)
      else
        raise ArgumentError, "Invalid point specifier #{p.inspect}."
      end
    end
def new_point(p)
      case p
      when :infinity
        infinity
      when Array
        x, y = p
        Point.new(self, x, y)
      when Integer
        generator.multiply_by_scalar(p)
      else
        raise ArgumentError, "Invalid point specifier #{p.inspect}."
      end
    end
These parameters are defined in http://www.secg.org/collateral/sec2_final.pdf

 @param opts (Hash)
 @option opts :p (Integer) A prime number that defines the field used.  The field will be *F<sub>p</sub>*.
 @option opts :a (Integer) The a parameter in the curve equation (*y^2 = x^3 + ax + b*).
 @option opts :b (Integer) The b parameter in the curve equation.
 @option opts :g (Array(Integer)) The coordinates of the generator point, with x first.
 @option opts :n (Integer) The order of g.  This is the smallest positive
   integer `i` such that the generator point multiplied by `i` is infinity.
   This is also the number of different points that are on the curve.
 @option opts :h (Integer) The cofactor (optional).
 Creates a new point.
 The argument can either be an array of integers representing the
 coordinates, with x first, or it can be `:infinity`.