Some algorithms require a quadratic nonresidue in a given
field. The first time a quadratic nonresidue is requested, one
is generated at random, using the same source of random bits as
other PBC random functions. [Which reminds me, should I get rid
of the nqr field and instead have
it as part of the data field in
struct field_s?]
In fieldquadratic.c, a
quadratic field extension is constructed with a square root of
this randomly generated quadratic nonresidue in the base field.
Thus for a nondeterminstic source of random bits, the same
field may be constructed differently on different runs.
To construct the same field the same way every time, one
must record the quadratic nonresidue generated from one run,
and call field_set_nqr() every
time this particular construction of a quadratic field
extension is desired. Another use for this function is to save
time by setting the quadratic nonresidue to some precomputed
value.
Similarly, for higher degree extensions, a random irreducible polynomial may be chosen to construct it, but this must be recorded if the same construction is later required.
This happens behind the scenes in PBC.