Skip to content

Commit e460676

Browse files
committed
similar...
1 parent 1a92bf0 commit e460676

File tree

2 files changed

+23
-66
lines changed

2 files changed

+23
-66
lines changed

src/Ideal.jl

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ function ideal(xs::AbstractVector{T}; kw...) where T<:NCRingElement
7070
return ideal(parent(xs[1]), xs; kw...)
7171
end
7272

73+
function Base.similar(I::T, xs::Vector) where {T <: Ideal}
74+
R = base_ring(I)
75+
@assert T === ideal_type(R)
76+
return ideal(R, xs)
77+
end
78+
7379
###############################################################################
7480
#
7581
# Basic predicates
@@ -78,10 +84,15 @@ end
7884

7985
iszero(I::Ideal) = all(iszero, gens(I))
8086

81-
function is_subset(I::T, J::T) where {T <: Ideal}
87+
@doc raw"""
88+
Base.issubset(I::T, J::T) where {T <: Ideal}
89+
90+
Return `true` if the ideal `I` is a subset of the ideal `J`.
91+
"""
92+
function Base.issubset(I::T, J::T) where {T <: Ideal}
8293
I === J && return true
8394
check_base_ring(I, J)
84-
return all(x in J for x in gens(I))
95+
return all(in(J), gens(I))
8596
end
8697

8798
###############################################################################
@@ -107,12 +118,12 @@ end
107118

108119
function Base.:+(I::T, J::T) where {T <: Ideal}
109120
check_base_ring(I, J)
110-
return ideal(base_ring(I), vcat(gens(I), gens(J)))
121+
return similar(I, vcat(gens(I), gens(J)))
111122
end
112123

113124
function Base.:*(I::T, J::T) where {T <: Ideal}
114125
check_base_ring(I, J)
115-
return ideal(base_ring(I), [x*y for x in gens(I) for y in gens(J)])
126+
return similar(I, [x*y for x in gens(I) for y in gens(J)])
116127
end
117128

118129
###############################################################################
@@ -130,19 +141,17 @@ function *(x::RingElement, R::Ring)
130141
end
131142

132143
function *(I::Ideal{T}, p::T) where T <: RingElement
133-
R = base_ring(I)
134-
iszero(p) && return ideal(R, T[])
135-
return ideal(R, [v*p for v in gens(I)])
144+
iszero(p) && return similar(I, T[])
145+
return similar(I, [v*p for v in gens(I)])
136146
end
137147

138148
function *(p::T, I::Ideal{T}) where T <: RingElement
139149
return I*p
140150
end
141151

142152
function *(I::Ideal{T}, p::S) where {S <: RingElement, T <: RingElement}
143-
R = base_ring(I)
144-
iszero(p*one(R)) && return ideal(R, T[])
145-
return ideal(R, [v*p for v in gens(I)])
153+
iszero(p*one(R)) && return similar(I, T[])
154+
return similar(I, [v*p for v in gens(I)])
146155
end
147156

148157
function *(p::S, I::Ideal{T}) where {S <: RingElement, T <: RingElement}

src/generic/Ideal.jl

Lines changed: 4 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2098,33 +2098,14 @@ end
20982098

20992099
###############################################################################
21002100
#
2101-
# Comparison
2102-
#
2103-
###############################################################################
2104-
2105-
function ==(I::Ideal{T}, J::Ideal{T}) where T <: RingElement
2106-
return gens(I) == gens(J)
2107-
end
2108-
2109-
###############################################################################
2110-
#
2111-
# Containment
2101+
# Membership
21122102
#
21132103
###############################################################################
21142104

21152105
function Base.in(v::T, I::Ideal{T}) where T <: RingElement
21162106
return is_zero(normal_form(v, I))
21172107
end
21182108

2119-
@doc raw"""
2120-
Base.issubset(I::Ideal{T}, J::Ideal{T}) where T <: RingElement
2121-
2122-
Return `true` if the ideal `I` is a subset of the ideal `J`.
2123-
"""
2124-
function Base.issubset(I::Ideal{T}, J::Ideal{T}) where T <: RingElement
2125-
return all(in(J), gens(I))
2126-
end
2127-
21282109
###############################################################################
21292110
#
21302111
# Intersection
@@ -2208,41 +2189,6 @@ function intersect(I::Ideal{T}, J::Ideal{T}) where {U <: RingElement, T <: Abstr
22082189
return Ideal(S, GInt)
22092190
end
22102191

2211-
###############################################################################
2212-
#
2213-
# Ad hoc binary operations
2214-
#
2215-
###############################################################################
2216-
2217-
function *(I::Ideal{T}, p::T) where T <: RingElement
2218-
R = base_ring(I)
2219-
G = gens(I)
2220-
if iszero(p)
2221-
return Ideal(R, T[])
2222-
end
2223-
p = divexact(p, canonical_unit(p))
2224-
return Ideal(R, [v*p for v in G])
2225-
end
2226-
2227-
function *(p::T, I::Ideal{T}) where T <: RingElement
2228-
return I*p
2229-
end
2230-
2231-
function *(I::Ideal{T}, p::S) where {S <: RingElement, T <: RingElement}
2232-
R = base_ring(I)
2233-
G = gens(I)
2234-
if iszero(p*one(R))
2235-
return Ideal(R, T[])
2236-
end
2237-
V = [v*p for v in G]
2238-
V = [divexact(v, canonical_unit(v)) for v in V]
2239-
return Ideal(R, V)
2240-
end
2241-
2242-
function *(p::S, I::Ideal{T}) where {S <: RingElement, T <: RingElement}
2243-
return I*p
2244-
end
2245-
22462192
###############################################################################
22472193
#
22482194
# Ideal reduction in Euclidean domain
@@ -2294,7 +2240,9 @@ function Ideal(R::Ring, v::T, vs::T...) where T <: RingElement
22942240
end
22952241

22962242
Ideal(R::Ring) = Ideal(R, elem_type(R)[])
2297-
Ideal(R::Ring, V::Vector{Any}) = Ideal(R, elem_type(R)[R(v) for v in V])
2243+
Ideal(R::Ring, V::Vector) = Ideal(R, elem_type(R)[R(v) for v in V])
2244+
2245+
Base.similar(I::Ideal, V::Vector) = Ideal(base_ring(I), V)
22982246

22992247
###############################################################################
23002248
#

0 commit comments

Comments
 (0)