func NewFp2(name string, p interface{}) Field {
	base := NewFp(name, p).(fp)
	f := fp2{base: base, name: name}
	f.precmp()
	return f
}
NewFp2 creates a quadratic extension field Z/pZ[x] with irreducible polynomial x^2=-1 and given p as an int, uint, *big.Int or string.
package field
import (
	"fmt"
	"io"
	"math/big"
)
type fp2Elt [2]fpElt
func (e fp2Elt) String() string         { return fmt.Sprintf("\na: %v\nb: %v", e[0], e[1]) }
func (e fp2Elt) Copy() Elt              { return &fp2Elt{*(e[0].Copy().(*fpElt)), *(e[1].Copy().(*fpElt))} }
func (e fp2Elt) Polynomial() []*big.Int { return append(e[0].Polynomial(), e[1].Polynomial()...) }
type fp2 struct {
	hasSqrt
	base fp
	name string
}