code: func (c *curvePoint) MakeAffine(pool *bnPool) *curvePoint {
  	if words := c.z.Bits(); len(words) == 1 && words[0] == 1 {
  		return c
  	}
  	if c.IsInfinity() {
  		c.x.SetInt64(0)
  		c.y.SetInt64(1)
  		c.z.SetInt64(0)
  		c.t.SetInt64(0)
  		return c
  	}
  	zInv := pool.Get().ModInverse(c.z, P)
  	t := pool.Get().Mul(c.y, zInv)
  	t.Mod(t, P)
  	zInv2 := pool.Get().Mul(zInv, zInv)
  	zInv2.Mod(zInv2, P)
  	c.y.Mul(t, zInv2)
  	c.y.Mod(c.y, P)
  	t.Mul(c.x, zInv2)
  	t.Mod(t, P)
  	c.x.Set(t)
  	c.z.SetInt64(1)
  	c.t.SetInt64(1)
  
  	pool.Put(zInv)
  	pool.Put(t)
  	pool.Put(zInv2)
  
  	return c
  }
docs: // MakeAffine converts c to affine form and returns c. If c is ∞, then it sets
  // c to 0 : 1 : 0.