# Normal forms

## Introduction

AlgebraicSolving allows to compute normal forms of a polynomial resp. a finite array of polynomials w.r.t. some given ideal over a finite field of characteristic smaller $2^{31}$ w.r.t. the degree reverse lexicographical monomial order.

Note: It therefore might first compute a Gröbner bases for the ideal.

## Functionality

AlgebraicSolving.normal_formMethod
normal_form(
f::T,
I::Ideal{T};
nr_thrds::Int=1,
info_level::Int=0
) where T <: MPolyRingElem

Compute the normal forms of the elements of F w.r.t. a degree reverse lexicographical Gröbner basis of I.

Note: If I has not already cached a degree reverse lexicographical Gröbner basis, then this one is first computed.

Arguments

• F::Vector{T} where T <: MPolyRingElem: elements to be reduced.
• I::Ideal{T} where T <: MPolyRingElem: ideal data to reduce with.
• nr_thrds::Int=1: number of threads for parallel linear algebra.
• info_level::Int=0: info level printout: off (0, default), summary (1), detailed (2).

Examples

julia> using AlgebraicSolving

julia> R, (x,y) = polynomial_ring(GF(101),["x","y"])
(Multivariate polynomial ring in 2 variables over GF(101), FqMPolyRingElem[x, y])

julia> I = Ideal([y*x^3+12-y, x+y])
FqMPolyRingElem[x^3*y + 100*y + 12, x + y]

julia> f = 2*x^2+7*x*y
2*x^2 + 7*x*y

julia> normal_form(f, I)
96*y^2
AlgebraicSolving.normal_formMethod
normal_form(
F::Vector{T},
I::Ideal{T};
nr_thrds::Int=1,
info_level::Int=0
) where T <: MPolyRingElem

Compute the normal forms of the elements of F w.r.t. a degree reverse lexicographical Gröbner basis of I.

Note: If I has not already cached a degree reverse lexicographical Gröbner basis, then this one is first computed.

Arguments

• F::Vector{T} where T <: MPolyRingElem: elements to be reduced.
• I::Ideal{T} where T <: MPolyRingElem: ideal data to reduce with.
• nr_thrds::Int=1: number of threads for parallel linear algebra.
• info_level::Int=0: info level printout: off (0, default), summary (1), detailed (2).

Examples

julia> using AlgebraicSolving

julia> R, (x,y) = polynomial_ring(GF(101),["x","y"])
(Multivariate polynomial ring in 2 variables over GF(101), FqMPolyRingElem[x, y])

julia> I = Ideal([y*x^3+12-y, x+y])
FqMPolyRingElem[x^3*y + 100*y + 12, x + y]

julia> F = [2*x^2+7*x*y, x+y]
2-element Vector{FqMPolyRingElem}:
2*x^2 + 7*x*y
x + y

julia> normal_form(F,I)
2-element Vector{FqMPolyRingElem}:
96*y^2
0