func (z *e2) Square(x *e2) *e2 {
	var aplusb fp.Element
	var result e2
	aplusb.Add(&x.A0, &x.A1)                        
	result.A0.Sub(&x.A0, &x.A1)                     
	result.A0.MulAssign(&aplusb)                    
	result.A1.Mul(&x.A0, &x.A1).Double(&result.A1)  
	z.Set(&result)
	return z
}
Square sets z to the e2-product of x,x returns z
package bn256
import (
	"github.com/consensys/gurvy/bn256/fp"
)
type e2 struct {
	A0, A1 fp.Element
}
func (z *e2) SetString(s1, s2 string) *e2 {
	z.A0.SetString(s1)
	z.A1.SetString(s2)
	return z
}
func (z *e2) SetZero() *e2 {
	z.A0.SetZero()
	z.A1.SetZero()
	return z
}
func (z *e2) Clone() *e2 {
	return &e2{
		A0: z.A0,
		A1: z.A1,
	}
}
func (z *e2) Set(x *e2) *e2 {
	z.A0.Set(&x.A0)
	z.A1.Set(&x.A1)
	return z
}
func (z *e2) SetOne() *e2 {
	z.A0.SetOne()
	z.A1.SetZero()
	return z
}
func (z *e2) SetRandom() *e2 {
	z.A0.SetRandom()
	z.A1.SetRandom()
	return z
}
func (z *e2) Equal(x *e2) bool {
	return z.A0.Equal(&x.A0) && z.A1.Equal(&x.A1)
}
func (z *e2) IsZero() bool {
	return z.A0.IsZero() && z.A1.IsZero()
}
func (z *e2) Neg(x *e2) *e2 {
	z.A0.Neg(&x.A0)
	z.A1.Neg(&x.A1)
	return z
}
func (z *e2) String() string {
	return (z.A0.String() + "+" + z.A1.String() + "*u")
}
func (z *e2) ToMont() *e2 {
	z.A0.ToMont()
	z.A1.ToMont()
	return z
}
func (z *e2) FromMont() *e2 {
	z.A0.FromMont()
	z.A1.FromMont()
	return z
}
func (z *e2) Add(x, y *e2) *e2 {
	z.A0.Add(&x.A0, &y.A0)
	z.A1.Add(&x.A1, &y.A1)
	return z
}
func (z *e2) AddAssign(x *e2) *e2 {
	z.A0.AddAssign(&x.A0)
	z.A1.AddAssign(&x.A1)
	return z
}
func (z *e2) Sub(x, y *e2) *e2 {
	z.A0.Sub(&x.A0, &y.A0)
	z.A1.Sub(&x.A1, &y.A1)
	return z
}
func (z *e2) SubAssign(x *e2) *e2 {
	z.A0.SubAssign(&x.A0)
	z.A1.SubAssign(&x.A1)
	return z
}
func (z *e2) Double(x *e2) *e2 {
	z.A0.Double(&x.A0)
	z.A1.Double(&x.A1)
	return z
}
func (z *e2) Mul(x, y *e2) *e2 {
	var ac, bd, cplusd, aplusbcplusd fp.Element
	ac.Mul(&x.A0, &y.A0)             
	bd.Mul(&x.A1, &y.A1)             
	cplusd.Add(&y.A0, &y.A1)         
	aplusbcplusd.Add(&x.A0, &x.A1)   
	aplusbcplusd.MulAssign(&cplusd)  
	z.A1.Add(&ac, &bd)               
	z.A1.Sub(&aplusbcplusd, &z.A1)   
	z.A0.Sub(&ac, &bd)               
	return z
}
func (z *e2) MulAssign(x *e2) *e2 {
	var ac, bd, cplusd, aplusbcplusd fp.Element
	ac.Mul(&z.A0, &x.A0)             
	bd.Mul(&z.A1, &x.A1)             
	cplusd.Add(&x.A0, &x.A1)         
	aplusbcplusd.Add(&z.A0, &z.A1)   
	aplusbcplusd.MulAssign(&cplusd)  
	z.A1.Add(&ac, &bd)               
	z.A1.Sub(&aplusbcplusd, &z.A1)   
	z.A0.Sub(&ac, &bd)               
	return z
}