diff --git a/src/Module.jl b/src/Module.jl index ed21c70b2a..d63651fe36 100644 --- a/src/Module.jl +++ b/src/Module.jl @@ -26,6 +26,30 @@ function check_parent(M::FPModule{T}, N::FPModule{T}) where T <: RingElement end is_finite(M::FPModule{<:FinFieldElem}) = true +is_finitely_generated(M::FPModule) = true +is_finitely_generated(M::Module) = isfinite(ngens(M)) || throw(NotImplementedError(:is_finitely_generated, M)) + +@doc raw""" + is_noetherian(M::Module) + +Check if the module $M$ is Noetherian. + +# Examples +```jldoctest +julia> R, x = polynomial_ring(ZZ, [:x]); + +julia> M = free_module(R, 2) +Free module of rank 2 over R + +julia> is_noetherian(M) +true +``` +""" +function is_noetherian(M::Module) + is_finitely_generated(M) || return false + is_noetherian(base_ring(M)) && return true + throw(NotImplementedError(:is_noetherian, M)) +end function is_sub_with_data(M::FPModule{T}, N::FPModule{T}) where T <: RingElement fl = is_submodule(N, M) diff --git a/src/Rings.jl b/src/Rings.jl index 23211d4282..b6b2041243 100644 --- a/src/Rings.jl +++ b/src/Rings.jl @@ -265,7 +265,6 @@ is_noetherian(::Integers) = true is_noetherian(R::Union{PolyRing, MPolyRing, LaurentPolyRing, LaurentMPolyRing}) = is_noetherian(coefficient_ring(R)) is_noetherian(R::Union{MSeriesRing, SeriesRing}) = is_noetherian(base_ring(R)) is_noetherian(R::ResidueRing) = is_noetherian(base_ring(R)) || throw(NotImplementedError(:is_noetherian, R)) -is_noetherian(M::Module) = is_noetherian(base_ring(M)) || throw(NotImplementedError(:is_noetherian, M)) @doc raw""" krull_dim(R::Ring) diff --git a/src/exports.jl b/src/exports.jl index 47d19e871d..29a982286d 100644 --- a/src/exports.jl +++ b/src/exports.jl @@ -301,6 +301,7 @@ export is_even export is_exact_type export is_finite export is_finite_order +export is_finitely_generated export is_free export is_gen export is_hermitian