# Function fields

Function fields are implemented via the Singular n_transExt type for prime fields of any characteristic.

The associated function field is represented by a parent object which can be constructed by a call to the FunctionField constructor.

The types of the parent objects and elements of the associated function fields are given in the following table according to the library providing them.

LibraryElement typeParent type
Singularn_transExtSingular.N_FField

All function field element types belong directly to the abstract type FieldElem and all the parent object types belong to the abstract type Field.

## Function field functionality

Singular.jl function fields provide all the functionality for fields described by AbstractAlgebra.jl.

https://nemocas.github.io/AbstractAlgebra.jl/latest/field

Below, we describe the functionality that is specific to Singular function field and not already listed at the given link.

### Constructors

The following constructors are available to create function fields and their elements.

Singular.FunctionFieldMethod
FunctionField(F::Singular.Field, S::AbstractVector{<:VarName})

Return a tuple $K, a$ consisting of a function field $K$ over the field $F$ with transcendence basis stored in the array $S$.

source

In case the user does not want to specify a transcendence basis the following constructor can be used.

Singular.FunctionFieldMethod
FunctionField(F::Singular.Field, n::Int)

Return a tuple $K, a$ consisting of a function field $K$ over the field $F$ with transcendence degree $n$ and transcendence basis $a1, ..., an$.

source

Given a function field $F$, we also have the following coercions in addition to the standard ones expected.

F(n::ZZRingElem)

Coerce a Flint integer value into the field.

Examples

julia> F1, (a, b, c) = FunctionField(QQ, ["a", "b", "c"])
(Function Field over Rational Field with transcendence basis n_transExt[a, b, c], n_transExt[a, b, c])

julia> x1 = a*b + c
a*b + c

julia> F2, (a1, a2, a3) = FunctionField(Fp(5), 3)
(Function Field over Finite Field of Characteristic 5 with transcendence basis n_transExt[a1, a2, a3], n_transExt[a1, a2, a3])

julia> x2 = a1^5 + a2*a3^4
a1^5 + a2*a3^4

### Basic manipulation

Singular.n_transExt_to_spolyMethod
n_transExt_to_spoly(x::n_transExt; parent::PolyRing)

Return the numerator of x as a polynomial in a polynomial ring with at least as many variables as the transcendence degree of parent(x). If a ring parent is given to the function, it will be the parent ring of the output.

source

Examples

julia> F1, (a, b, c) = FunctionField(QQ, ["a", "b", "c"])
(Function Field over Rational Field with transcendence basis n_transExt[a, b, c], n_transExt[a, b, c])

julia> x = F1(5)*a
5*a

julia> y = a^2 *b+a*b+b^2
a^2*b + a*b + b^2

julia> is_unit(x)
true

julia> char = characteristic(F1)
0

julia> d = transcendence_degree(F1)
3

julia> S, = polynomial_ring(QQ, ["a", "b", "c"])
(Singular Polynomial Ring (QQ),(a,b,c),(dp(3),C), spoly{n_Q}[a, b, c])

julia> p = n_transExt_to_spoly(y, parent_ring = S)
a^2*b + a*b + b^2

julia> F2, = FunctionField(Fp(7), 4)
(Function Field over Finite Field of Characteristic 7 with transcendence basis n_transExt[a1, a2, a3, a4], n_transExt[a1, a2, a3, a4])

julia> B = transcendence_basis(F2)
4-element Vector{n_transExt}:
a1
a2
a3
a4