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.
Library | Element type | Parent type |
---|---|---|
Singular | n_transExt | Singular.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.FunctionField
— MethodFunctionField(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$.
In case the user does not want to specify a transcendence basis the following constructor can be used.
Singular.FunctionField
— MethodFunctionField(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$.
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
Base.numerator
— Methodnumerator(x::n_transExt)
Return the numerator of $x$.
Base.denominator
— Methoddenominator(x::n_transExt)
Return the denominator of $x$.
Singular.transcendence_degree
— Methodtranscendence_degree(F::N_FField)
Return the transcendence degree of the given function field.
Singular.transcendence_basis
— Methodbasis(F::N_FField)
Return the transcendence basis of the given function field.
Singular.n_transExt_to_spoly
— Methodn_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.
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