diff --git a/src/Fraction.jl b/src/Fraction.jl index 05e5a41f5d..8440cc2513 100644 --- a/src/Fraction.jl +++ b/src/Fraction.jl @@ -823,6 +823,7 @@ that it will always be returned by a call to the constructor when the same base ring $R$ is supplied. """ function fraction_field(R::Ring; cached::Bool=true) + @req !is_trivial(R) "Zero rings are currently not supported as coefficient ring." return Generic.fraction_field(R; cached=cached) end diff --git a/src/MPoly.jl b/src/MPoly.jl index 0af4ced8f7..7942ac86b2 100644 --- a/src/MPoly.jl +++ b/src/MPoly.jl @@ -1508,5 +1508,7 @@ true Like [`polynomial_ring(R::Ring, s::Vector{Symbol})`](@ref) but return only the multivariate polynomial ring. """ -polynomial_ring_only(R::T, s::Vector{Symbol}; internal_ordering::Symbol=:lex, cached::Bool=true) where T<:Ring = - mpoly_ring_type(T)(R, s, internal_ordering, cached) +function polynomial_ring_only(R::T, s::Vector{Symbol}; internal_ordering::Symbol=:lex, cached::Bool=true) where T<:Ring + @req !is_trivial(R) "Zero rings are currently not supported as coefficient ring." + return mpoly_ring_type(T)(R, s, internal_ordering, cached) +end diff --git a/src/NCPoly.jl b/src/NCPoly.jl index 0559efaafb..ded12acb62 100644 --- a/src/NCPoly.jl +++ b/src/NCPoly.jl @@ -764,8 +764,10 @@ end Like [`polynomial_ring(R::NCRing, s::Symbol)`](@ref) but return only the polynomial ring. """ -polynomial_ring_only(R::T, s::Symbol; cached::Bool=true) where T<:NCRing = - dense_poly_ring_type(T)(R, s, cached) +function polynomial_ring_only(R::T, s::Symbol; cached::Bool=true) where T<:NCRing + @req !is_trivial(R) "Zero rings are currently not supported as coefficient ring." + return dense_poly_ring_type(T)(R, s, cached) +end # Simplified constructor diff --git a/src/Residue.jl b/src/Residue.jl index 89126cb566..8247fba0c0 100644 --- a/src/Residue.jl +++ b/src/Residue.jl @@ -450,6 +450,7 @@ to the constructor with the same base ring $R$ and element $a$. A modulus of zero is not supported and throws an exception. """ function residue_ring(R::Ring, a::RingElement; cached::Bool = true) + @req !is_trivial(R) "Zero rings are currently not supported as base ring." # Modulus of zero cannot be supported. E.g. A C library could not be expected to # do matrices over Z/0 using a Z/nZ type. The former is multiprecision, the latter not. iszero(a) && throw(DomainError(a, "Modulus must be nonzero")) @@ -459,6 +460,7 @@ function residue_ring(R::Ring, a::RingElement; cached::Bool = true) end function residue_ring(R::PolyRing, a::RingElement; cached::Bool = true) + @req !is_trivial(R) "Zero rings are currently not supported as base ring." iszero(a) && throw(DomainError(a, "Modulus must be nonzero")) !is_unit(leading_coefficient(a)) && throw(DomainError(a, "Non-invertible leading coefficient")) T = elem_type(R) diff --git a/src/ResidueField.jl b/src/ResidueField.jl index 0bea998023..aa473655f2 100644 --- a/src/ResidueField.jl +++ b/src/ResidueField.jl @@ -490,6 +490,7 @@ residue ring parent object is cached and returned for any subsequent calls to the constructor with the same base ring $R$ and element $a$. """ function residue_field(R::Ring, a::RingElement; cached::Bool = true) + @req !is_trivial(R) "Zero rings are currently not supported as base ring." iszero(a) && throw(DivideError()) T = elem_type(R) S = EuclideanRingResidueField{T}(R(a), cached) diff --git a/src/generic/Misc/Localization.jl b/src/generic/Misc/Localization.jl index 490f768b67..92e75e17e9 100644 --- a/src/generic/Misc/Localization.jl +++ b/src/generic/Misc/Localization.jl @@ -113,6 +113,8 @@ base_ring(L::LocalizedEuclideanRing) = L.base_ring::base_ring_type(L) parent(a::LocalizedEuclideanRingElem) = a.parent +characteristic(::LocalizedEuclideanRing) = characteristic(base_ring(L)) + ############################################################################### # # Basic manipulation