A Tour of NTL: Examples: Extension Rings and Fields

NTL also supports extension rings and fields over finite fields, and polynomial arithmetic over such extensions. Here is a little program that illustrates this.

#include <NTL/ZZ_pXFactoring.h> #include <NTL/ZZ_pEX.h> int main() { ZZ_p::init(to_ZZ(17)); // define GF(17) ZZ_pX P; BuildIrred(P, 10); // generate an irreducible polynomial P // of degree 10 over GF(17) ZZ_pE::init(P); // define GF(17^10) ZZ_pEX f, g, h; // declare polynomials over GF(17^10) random(f, 20); // f is a random, monic polynomial of degree 20 SetCoeff(f, 20); random(h, 20); // h is a random polynomial of degree less than 20 g = MinPolyMod(h, f); // compute the minimum polynomial of h modulo f if (g == 0) Error("oops (1)"); // check that g != 0 if (CompMod(g, h, f) != 0) // check that g(h) = 0 mod f Error("oops (2)"); }

This example illustrates building extension rings over `ZZ_p`.
One can also use `zz_p` and `GF2` as base classes;
the syntax is exactly the same.

See `ZZ_pE.txt` for the basics of the extension
ring `ZZ_pE` over `ZZ_p`.
Also see `ZZ_pEX.txt` for polynomial
arithmetic over `ZZ_pE`, and
`ZZ_pEXFactoring.txt` for factoring
routines over `ZZ_pE`.
See `vec_ZZ_pE.txt` for vectors over `ZZ_pE`,
and `mat_ZZ_pE.txt` for matrices over `ZZ_pE`.

See `lzz_pE.txt` for the basics of the extension
ring `zz_pE` over `zz_p`.
Also see `lzz_pEX.txt` for polynomial
arithmetic over `zz_pE`, and
`lzz_pEXFactoring.txt` for factoring
routines over `zz_pE`.
See `vec_lzz_pE.txt` for vectors over `zz_pE`,
and `mat_lzz_pE.txt` for matrices over `zz_pE`.

See `GF2E.txt` for the basics of the extension
ring `GF2E` over `GF2`.
Also see `GF2EX.txt` for polynomial
arithmetic over `GF2E`, and
`GF2EXFactoring.txt` for factoring
routines over `GF2E`.
See `vec_GF2E.txt` for vectors over `GF2E`,
and `mat_GF2E.txt` for matrices over `GF2E`.