Constructing mathematical objects in Nemo
Constructing objects in Julia
In Julia, one constructs objects of a given type by calling a type constructor. This is simply a function with the same name as the type itself. For example, to construct a BigInt
object in Julia, we simply call the BigInt
constructor:
n = BigInt("1234567898765434567898765434567876543456787654567890")
Julia also uses constructors to convert between types. For example, to convert an Int
to a BigInt
:
m = BigInt(123)
How we construct objects in Nemo
As we explained in the previous section, Julia types don't contain enough information to properly model the ring of integers modulo for a multiprecision modulus . Instead of using types to construct objects, we use special objects that we refer to as parent objects. They behave a lot like Julia types.
Consider the following simple example, to create a Flint multiprecision integer:
n = ZZ("12345678765456787654567890987654567898765678909876567890")
Here ZZ
is not a Julia type, but a callable object. However, for most purposes one can think of such a parent object ZZ
as though it were a type.
Constructing parent objects
For more complicated groups, rings, fields, etc., one first needs to construct the parent object before one can use it to construct element objects.
Nemo provides a set of functions for constructing such parent objects. For example, to create a parent object for polynomials over the integers, we use the PolynomialRing
parent object constructor.
R, x = PolynomialRing(ZZ, "x")
f = x^3 + 3x + 1
g = R(12)
In this example, R
is the parent object and we use it to convert the Int
value to an element of the polynomial ring .
List of parent object constructors
For convenience, we provide a list of all the parent object constructors in Nemo and explain what domains they represent.
Mathematics | Nemo constructor |
---|---|
R = ZZ | |
R = QQ | |
R, a = FiniteField(p, n, "a") | |
R = ResidueRing(ZZ, n) | |
S, x = PolynomialRing(R, "x") | |
(to precision ) | S, x = PowerSeriesRing(R, n, "x") |
S = FractionField(R) | |
S = ResidueRing(R, f) | |
S = MatrixSpace(R, m, n) | |
S, a = NumberField(f, "a") | |
S = MaximalOrder(K) | |
ideal of | I = Ideal(O, gens, ...) |