func (z *e6) Square3(x *e6) *e6 {
	var s0, s1, s2, s3, s4 e2
	s0.Square(&x.B0)
	s1.Mul(&x.B0, &x.B1).Double(&s1)
	s2.Sub(&x.B0, &x.B1).AddAssign(&x.B2).Square(&s2)
	s3.Mul(&x.B1, &x.B2).Double(&s3)
	s4.Square(&x.B2)
	{  
		var buf, buf9 e2
		buf.Set(&s3)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		z.B0.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(z.B0).A0).Neg(&buf.A1)
		}  
		z.B0.A0.AddAssign(&buf9.A0)
	}  
	z.B0.AddAssign(&s0)
	{  
		var buf, buf9 e2
		buf.Set(&s4)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		z.B1.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(z.B1).A0).Neg(&buf.A1)
		}  
		z.B1.A0.AddAssign(&buf9.A0)
	}  
	z.B1.AddAssign(&s1)
	z.B2.Add(&s1, &s2).AddAssign(&s3).SubAssign(&s0).SubAssign(&s4)
	return z
}
Square3 squares a e6
package bn256
import "github.com/consensys/gurvy/bn256/fp"
type e6 struct {
	B0, B1, B2 e2
}
func (z *e6) SetString(s1, s2, s3, s4, s5, s6 string) *e6 {
	z.B0.SetString(s1, s2)
	z.B1.SetString(s3, s4)
	z.B2.SetString(s5, s6)
	return z
}
func (z *e6) Set(x *e6) *e6 {
	z.B0 = x.B0
	z.B1 = x.B1
	z.B2 = x.B2
	return z
}
func (z *e6) Equal(x *e6) bool {
	return z.B0.Equal(&x.B0) && z.B1.Equal(&x.B1) && z.B2.Equal(&x.B2)
}
func (z *e6) ToMont() *e6 {
	z.B0.ToMont()
	z.B1.ToMont()
	z.B2.ToMont()
	return z
}
func (z *e6) FromMont() *e6 {
	z.B0.FromMont()
	z.B1.FromMont()
	z.B2.FromMont()
	return z
}
func (z *e6) Add(x, y *e6) *e6 {
	z.B0.Add(&x.B0, &y.B0)
	z.B1.Add(&x.B1, &y.B1)
	z.B2.Add(&x.B2, &y.B2)
	return z
}
func (z *e6) Neg(x *e6) *e6 {
	z.B0.Neg(&z.B0)
	z.B1.Neg(&z.B1)
	z.B2.Neg(&z.B2)
	return z
}
func (z *e6) Sub(x, y *e6) *e6 {
	z.B0.Sub(&x.B0, &y.B0)
	z.B1.Sub(&x.B1, &y.B1)
	z.B2.Sub(&x.B2, &y.B2)
	return z
}
func (z *e6) MulByGen(x *e6) *e6 {
	var result e6
	result.B1 = x.B0
	result.B2 = x.B1
	{  
		var buf, buf9 e2
		buf.Set(&x.B2)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		result.B0.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(result.B0).A0).Neg(&buf.A1)
		}  
		result.B0.A0.AddAssign(&buf9.A0)
	}  
	z.Set(&result)
	return z
}
func (z *e6) Double(x *e6) *e6 {
	z.B0.Double(&x.B0)
	z.B1.Double(&x.B1)
	z.B2.Double(&x.B2)
	return z
}
func (z *e6) String() string {
	return (z.B0.String() + "+(" + z.B1.String() + ")*v+(" + z.B2.String() + ")*v**2")
}
func (z *e6) Mul(x, y *e6) *e6 {
	var rb0, b0, b1, b2, b3, b4 e2
	b0.Mul(&x.B0, &y.B0)  
	b1.Mul(&x.B1, &y.B1)  
	b2.Mul(&x.B2, &y.B2)  
	b3.Add(&x.B1, &x.B2)
	b4.Add(&y.B1, &y.B2)
	rb0.Mul(&b3, &b4).
		SubAssign(&b1).
		SubAssign(&b2)
	{  
		var buf, buf9 e2
		buf.Set(&rb0)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		rb0.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(rb0).A0).Neg(&buf.A1)
		}  
		rb0.A0.AddAssign(&buf9.A0)
	}  
	rb0.AddAssign(&b0)
	b3.Add(&x.B0, &x.B1)
	b4.Add(&y.B0, &y.B1)
	z.B1.Mul(&b3, &b4).
		SubAssign(&b0).
		SubAssign(&b1)
	{  
		var buf, buf9 e2
		buf.Set(&b2)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		b3.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(b3).A0).Neg(&buf.A1)
		}  
		b3.A0.AddAssign(&buf9.A0)
	}  
	z.B1.AddAssign(&b3)
	b3.Add(&x.B0, &x.B2)
	b4.Add(&y.B0, &y.B2)
	z.B2.Mul(&b3, &b4).
		SubAssign(&b0).
		SubAssign(&b2).
		AddAssign(&b1)
	z.B0 = rb0
	return z
}
func (z *e6) MulByE2(x *e6, y *e2) *e6 {
	var yCopy e2
	yCopy.Set(y)
	z.B0.Mul(&x.B0, &yCopy)
	z.B1.Mul(&x.B1, &yCopy)
	z.B2.Mul(&x.B2, &yCopy)
	return z
}
func (z *e6) MulByNotv2(x, y *e6) *e6 {
	var rb0, b0, b1, b2, b3 e2
	b0.Mul(&x.B0, &y.B0)  
	b1.Mul(&x.B1, &y.B1)  
	b2.Add(&x.B1, &x.B2)
	rb0.Mul(&b2, &y.B1).
		SubAssign(&b1)
	{  
		var buf, buf9 e2
		buf.Set(&rb0)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		rb0.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(rb0).A0).Neg(&buf.A1)
		}  
		rb0.A0.AddAssign(&buf9.A0)
	}  
	rb0.AddAssign(&b0)
	b2.Add(&x.B0, &x.B1)
	b3.Add(&y.B0, &y.B1)
	z.B1.Mul(&b2, &b3).
		SubAssign(&b0).
		SubAssign(&b1)
	z.B2.Mul(&x.B2, &y.B0).
		AddAssign(&b1)
	z.B0 = rb0
	return z
}
func (z *e6) Square(x *e6) *e6 {
	var b0, b1, b2, b3, b4 e2
	b3.Mul(&x.B0, &x.B1).Double(&b3)  
	b4.Square(&x.B2)                  
	{  
		var buf, buf9 e2
		buf.Set(&b4)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		b0.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(b0).A0).Neg(&buf.A1)
		}  
		b0.A0.AddAssign(&buf9.A0)
	}  
	b0.AddAssign(&b3)
	b1.Sub(&b3, &b4)                                   
	b2.Square(&x.B0)                                   
	b3.Sub(&x.B0, &x.B1).AddAssign(&x.B2).Square(&b3)  
	b4.Mul(&x.B1, &x.B2).Double(&b4)                   
	{  
		var buf, buf9 e2
		buf.Set(&b4)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		z.B0.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(z.B0).A0).Neg(&buf.A1)
		}  
		z.B0.A0.AddAssign(&buf9.A0)
	}  
	z.B0.AddAssign(&b2)
	z.B2.Add(&b1, &b3).
		AddAssign(&b4).
		SubAssign(&b2)
	z.B1 = b0
	return z
}
func (z *e6) Square2(x *e6) *e6 {
	var v0, v1, v2, v01, v02, v12 e2
	v0.Square(&x.B0)
	v1.Square(&x.B1)
	v2.Square(&x.B2)
	v01.Add(&x.B0, &x.B1)
	v01.Square(&v01)
	v02.Add(&x.B0, &x.B2)
	v02.Square(&v02)
	v12.Add(&x.B1, &x.B2)
	v12.Square(&v12)
	z.B0.Sub(&v12, &v1).SubAssign(&v2)
	{  
		var buf, buf9 e2
		buf.Set(&z.B0)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		z.B0.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(z.B0).A0).Neg(&buf.A1)
		}  
		z.B0.A0.AddAssign(&buf9.A0)
	}  
	z.B0.AddAssign(&v0)
	{  
		var buf, buf9 e2
		buf.Set(&v2)
		buf9.Double(&buf).
			Double(&buf9).
			Double(&buf9).
			Add(&buf9, &buf)
		z.B1.A1.Add(&buf.A0, &buf9.A1)
		{  
			(&(z.B1).A0).Neg(&buf.A1)
		}  
		z.B1.A0.AddAssign(&buf9.A0)
	}  
	z.B1.AddAssign(&v01).SubAssign(&v0).SubAssign(&v1)
	z.B2.Add(&v02, &v1).SubAssign(&v0).SubAssign(&v2)
	return z
}