Skip to content

Commit 9ebc781

Browse files
authored
Add is_finite methods for various ring types (#1842)
Also add missing (but documented) `characteristic` method for `FreeAssociativeAlgebra`
1 parent 5170909 commit 9ebc781

File tree

9 files changed

+41
-7
lines changed

9 files changed

+41
-7
lines changed

src/FreeAssociativeAlgebra.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ function is_exact_type(a::Type{S}) where {T <: RingElement, S <: FreeAssociative
2020
return is_exact_type(T)
2121
end
2222

23+
characteristic(R::FreeAssociativeAlgebra) = characteristic(base_ring(R))
24+
25+
is_finite(R::FreeAssociativeAlgebra) = is_trivial(base_ring(R)) || (nvars(R) == 0 && is_finite(base_ring(R)))
26+
2327
###############################################################################
2428
#
2529
# String IO

src/LaurentMPoly.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44
#
55
###############################################################################
66

7+
###############################################################################
8+
#
9+
# Data type and parent object methods
10+
#
11+
###############################################################################
12+
13+
characteristic(R::LaurentMPolyRing) = characteristic(base_ring(R))
14+
15+
is_finite(R::LaurentMPolyRing) = is_trivial(base_ring(R)) || (nvars(R) == 0 && is_finite(base_ring(R)))
16+
717
###############################################################################
818
#
919
# String I/O

src/LaurentPoly.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44
#
55
###############################################################################
66

7+
###############################################################################
8+
#
9+
# Data type and parent object methods
10+
#
11+
###############################################################################
12+
13+
characteristic(R::LaurentPolyRing) = characteristic(base_ring(R))
14+
15+
is_finite(R::LaurentPolyRing) = is_trivial(R)
16+
717
###############################################################################
818
#
919
# laurent_polynomial_ring constructor

src/MPoly.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,10 @@ function var_index(x::MPolyRingElem{T}) where {T <: RingElement}
138138
return index
139139
end
140140

141-
function characteristic(a::MPolyRing{T}) where T <: RingElement
142-
return characteristic(base_ring(a))
143-
end
141+
characteristic(R::MPolyRing) = characteristic(base_ring(R))
142+
143+
is_finite(R::MPolyRing) = is_trivial(base_ring(R)) || (nvars(R) == 0 && is_finite(base_ring(R)))
144+
144145

145146
###############################################################################
146147
#

src/MatRing.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,12 @@ end
6666

6767

6868
function characteristic(a::MatRing)
69-
iszero(a.n) && return 1
69+
iszero(nrows(a)) && return 1
7070
return characteristic(base_ring(a))
7171
end
7272

73+
is_finite(R::MatRing) = iszero(nrows(a)) || is_finite(base_ring(R))
74+
7375
###############################################################################
7476
#
7577
# Similar and zero

src/NCPoly.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ number_of_variables(a::NCPolyRing) = 1
102102

103103
characteristic(a::NCPolyRing) = characteristic(base_ring(a))
104104

105+
is_finite(a::NCPolyRing) = is_trivial(a)
106+
105107
###############################################################################
106108
#
107109
# Basic manipulation

src/Poly.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ number_of_variables(a::PolyRing) = 1
4949

5050
characteristic(a::PolyRing) = characteristic(base_ring(a))
5151

52+
is_finite(a::PolyRing) = is_trivial(a)
53+
5254
Base.copy(a::PolyRingElem) = deepcopy(a)
5355

5456
###############################################################################

src/Rings.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,9 @@ is_perfect(F::Field) = characteristic(F) == 0 || F isa FinField ||
207207

208208
is_finite(F::FinField) = true
209209

210-
is_finite(F::Field) = characteristic(F) != 0 && throw(NotImplementedError(:is_finite, F))
210+
function is_finite(R::NCRing)
211+
c = characteristic(R)
212+
c == 0 && return false
213+
c == 1 && return true
214+
throw(NotImplementedError(:is_finite, R))
215+
end

src/generic/LaurentMPoly.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ number_of_variables(R::LaurentMPolyWrapRing) = number_of_variables(R.mpolyring)
2929

3030
number_of_generators(R::LaurentMPolyWrapRing) = number_of_variables(R.mpolyring)
3131

32-
characteristic(R::LaurentMPolyWrapRing) = characteristic(R.mpolyring)
33-
3432
###############################################################################
3533
#
3634
# Basic manipulation

0 commit comments

Comments
 (0)