Skip to content

Commit ad6732d

Browse files
authored
Merge pull request #648 from Nemocas/rf/randmake
follow the Random API via RandomExtensions.make
2 parents 84e8a0a + 0e9c7d4 commit ad6732d

36 files changed

+461
-97
lines changed

Project.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
name = "AbstractAlgebra"
22
uuid = "c3fe647b-3220-5bb0-a1ea-a7954cac585d"
3-
version = "0.10.0"
3+
version = "0.11.0"
44

55
[deps]
66
InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
77
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
88
Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a"
99
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
10+
RandomExtensions = "fb686558-2515-59ef-acaa-46db3789a887"
1011
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
1112
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
1213

1314
[compat]
15+
RandomExtensions = "0.4.2"
1416
julia = "1"

src/AbstractAlgebra.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ import Base: Array, abs, acos, acosh, adjoint, asin, asinh, atan, atanh, bin,
9999
typed_hcat, typed_vcat, vcat, xor, zero, zeros,
100100
+, -, *, ==, ^, &, |, <<, >>, ~, <=, >=, <, >, //, /, !=
101101

102-
using Random: Random, AbstractRNG
102+
using Random: Random, AbstractRNG, SamplerTrivial
103+
using RandomExtensions: RandomExtensions, make, Make2
103104

104105
export elem_type, parent_type
105106

src/Generic.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import LinearAlgebra: lu, lu!, tr
77

88
using Markdown, Random, InteractiveUtils
99

10+
using Random: SamplerTrivial, GLOBAL_RNG
11+
using RandomExtensions: RandomExtensions, make, Make, Make2, Make3, Make4
12+
1013
import Base: Array, abs, asin, asinh, atan, atanh, axes, bin, checkbounds, cmp, conj,
1114
convert, copy, cos, cosh, dec, deepcopy, deepcopy_internal,
1215
exponent, gcd, gcdx, getindex, hash, hcat, hex, intersect,

src/generic/Fraction.jl

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -968,17 +968,33 @@ end
968968
#
969969
###############################################################################
970970

971-
function rand(rng::AbstractRNG, S::AbstractAlgebra.FracField, v...)
971+
RandomExtensions.maketype(R::AbstractAlgebra.FracField, _) = elem_type(R)
972+
973+
function RandomExtensions.make(S::AbstractAlgebra.FracField, vs...)
972974
R = base_ring(S)
973-
n = rand(rng, R, v...)
975+
if length(vs) == 1 && elem_type(R) == Random.gentype(vs[1])
976+
RandomExtensions.Make(S, vs[1]) # forward to default Make constructor
977+
else
978+
make(S, make(R, vs...))
979+
end
980+
end
981+
982+
function rand(rng::AbstractRNG,
983+
sp::SamplerTrivial{<:Make2{<:RingElement, <:AbstractAlgebra.FracField}})
984+
S, v = sp[][1:end]
985+
R = base_ring(S)
986+
n = rand(rng, v)
974987
d = R()
975988
while iszero(d)
976-
d = rand(rng, R, v...)
989+
d = rand(rng, v)
977990
end
978991
return S(n, d)
979992
end
980993

981-
rand(S::AbstractAlgebra.FracField, v...) = rand(Random.GLOBAL_RNG, S, v...)
994+
rand(rng::AbstractRNG, S::AbstractAlgebra.FracField, v...) =
995+
rand(rng, make(S, v...))
996+
997+
rand(S::AbstractAlgebra.FracField, v...) = rand(GLOBAL_RNG, S, v...)
982998

983999
###############################################################################
9841000
#

src/generic/LaurentPoly.jl

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -241,14 +241,31 @@ end
241241
#
242242
###############################################################################
243243

244-
function rand(rng::AbstractRNG, S::LaurentPolyWrapRing, degrees_range, v...)
245-
m = minimum(degrees_range)
246-
degrees_range = degrees_range .- m
247-
LaurentPolyWrap(rand(rng, S.polyring, degrees_range, v...), m)
244+
RandomExtensions.maketype(S::LaurentPolyWrapRing, _, _) = elem_type(S)
245+
246+
function RandomExtensions.make(S::LaurentPolyWrapRing, v1, vs...)
247+
R = S.polyring
248+
if length(vs) == 1 && vs[1] isa Integer && elem_type(R) == Random.gentype(v1)
249+
Make(S, v1, vs[1]) # forward to default Make constructor
250+
else
251+
degrees_range = v1
252+
m = minimum(degrees_range)
253+
degrees_range = degrees_range .- m
254+
make(S, make(R, degrees_range, vs...), m)
255+
end
248256
end
249257

258+
function rand(rng::AbstractRNG,
259+
sp::SamplerTrivial{<:Make3{<:LaurentPolyWrap, <:LaurentPolyWrapRing}})
260+
v, m = sp[][2:end]
261+
LaurentPolyWrap(rand(rng, v), m)
262+
end
263+
264+
rand(rng::AbstractRNG, S::LaurentPolyWrapRing, degrees_range, v...) =
265+
rand(rng, make(S, degrees_range, v...))
266+
250267
rand(S::LaurentPolyWrapRing, degrees_range, v...) =
251-
rand(Random.GLOBAL_RNG, S, degrees_range, v...)
268+
rand(GLOBAL_RNG, S, degrees_range, v...)
252269

253270

254271
###############################################################################

src/generic/LaurentSeries.jl

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,29 +1484,39 @@ end
14841484
#
14851485
###############################################################################
14861486

1487-
function rand(rng::AbstractRNG, S::LaurentSeriesRing, val_range::UnitRange{Int}, v...)
1487+
const LaurentSeriesRingOrField = Union{LaurentSeriesRing,LaurentSeriesField}
1488+
1489+
RandomExtensions.maketype(S::LaurentSeriesRingOrField, ::UnitRange{Int}, _) = elem_type(S)
1490+
1491+
function RandomExtensions.make(S::LaurentSeriesRingOrField, val_range::UnitRange{Int}, vs...)
14881492
R = base_ring(S)
1489-
f = S()
1490-
x = gen(S)
1491-
for i = 0:S.prec_max - 1
1492-
f += rand(rng, R, v...)*x^i
1493+
if length(vs) == 1 && elem_type(R) == Random.gentype(vs[1])
1494+
Make(S, val_range, vs[1]) # forward to default Make constructor
1495+
else
1496+
make(S, val_range, make(R, vs...))
14931497
end
1494-
return shift_left(f, rand(rng, val_range))
14951498
end
14961499

1497-
function rand(rng::AbstractRNG, S::LaurentSeriesField, val_range::UnitRange{Int}, v...)
1500+
function rand(rng::AbstractRNG,
1501+
sp::SamplerTrivial{<:Make3{<:RingElement,
1502+
<:LaurentSeriesRingOrField,
1503+
UnitRange{Int}}})
1504+
S, val_range, v = sp[][1:end]
14981505
R = base_ring(S)
14991506
f = S()
15001507
x = gen(S)
15011508
for i = 0:S.prec_max - 1
1502-
f += rand(rng, R, v...)*x^i
1509+
f += rand(rng, v)*x^i
15031510
end
15041511
return shift_left(f, rand(rng, val_range))
15051512
end
15061513

1507-
function rand(S::Union{LaurentSeriesRing,LaurentSeriesField}, val_range, v...)
1508-
rand(Random.GLOBAL_RNG, S, val_range, v...)
1509-
end
1514+
rand(rng::AbstractRNG, S::LaurentSeriesRingOrField, val_range::UnitRange{Int}, v...) =
1515+
rand(rng, make(S, val_range, v...))
1516+
1517+
rand(S::LaurentSeriesRingOrField, val_range, v...) =
1518+
rand(GLOBAL_RNG, S, val_range, v...)
1519+
15101520

15111521
###############################################################################
15121522
#

src/generic/MPoly.jl

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4682,8 +4682,21 @@ function rand_ordering(rng::AbstractRNG=Random.GLOBAL_RNG)
46824682
end
46834683
end
46844684

4685-
function rand(rng::AbstractRNG, S::AbstractAlgebra.MPolyRing,
4686-
term_range::UnitRange{Int}, exp_bound::UnitRange{Int}, v...)
4685+
RandomExtensions.maketype(S::AbstractAlgebra.MPolyRing, _, _, _) = elem_type(S)
4686+
4687+
function RandomExtensions.make(S::AbstractAlgebra.MPolyRing, term_range::UnitRange{Int},
4688+
exp_bound::UnitRange{Int}, vs...)
4689+
R = base_ring(S)
4690+
if length(vs) == 1 && elem_type(R) == Random.gentype(vs[1])
4691+
Make(S, term_range, exp_bound, vs[1])
4692+
else
4693+
make(S, term_range, exp_bound, make(R, vs...))
4694+
end
4695+
end
4696+
4697+
function rand(rng::AbstractRNG, sp::SamplerTrivial{<:Make4{
4698+
<:RingElement,<:AbstractAlgebra.MPolyRing,UnitRange{Int},UnitRange{Int}}})
4699+
S, term_range, exp_bound, v = sp[][1:end]
46874700
f = S()
46884701
g = gens(S)
46894702
R = base_ring(S)
@@ -4692,14 +4705,19 @@ function rand(rng::AbstractRNG, S::AbstractAlgebra.MPolyRing,
46924705
for j = 1:length(g)
46934706
term *= g[j]^rand(rng, exp_bound)
46944707
end
4695-
term *= rand(rng, R, v...)
4708+
term *= rand(rng, v)
46964709
f += term
46974710
end
46984711
return f
46994712
end
47004713

4714+
function rand(rng::AbstractRNG, S::AbstractAlgebra.MPolyRing,
4715+
term_range::UnitRange{Int}, exp_bound::UnitRange{Int}, v...)
4716+
rand(rng, make(S, term_range, exp_bound, v...))
4717+
end
4718+
47014719
function rand(S::AbstractAlgebra.MPolyRing, term_range, exp_bound, v...)
4702-
rand(Random.GLOBAL_RNG, S, term_range, exp_bound, v...)
4720+
rand(GLOBAL_RNG, S, term_range, exp_bound, v...)
47034721
end
47044722

47054723
###############################################################################

src/generic/Matrix.jl

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5070,17 +5070,34 @@ Base.map(f, a::MatrixElem) = map_entries(f, a)
50705070
#
50715071
###############################################################################
50725072

5073-
function rand(rng::AbstractRNG, S::AbstractAlgebra.MatSpace, v...)
5073+
RandomExtensions.maketype(S::AbstractAlgebra.MatSpace, _) = elem_type(S)
5074+
5075+
function RandomExtensions.make(S::AbstractAlgebra.MatSpace, vs...)
5076+
R = base_ring(S)
5077+
if length(vs) == 1 && elem_type(R) == Random.gentype(vs[1])
5078+
Make(S, vs[1]) # forward to default Make constructor
5079+
else
5080+
make(S, make(R, vs...))
5081+
end
5082+
end
5083+
5084+
5085+
function rand(rng::AbstractRNG,
5086+
sp::SamplerTrivial{<:Make2{<:MatSpaceElem,
5087+
<:AbstractAlgebra.MatSpace}})
5088+
S, v = sp[][1:end]
50745089
M = S()
50755090
R = base_ring(S)
50765091
for i = 1:nrows(M)
50775092
for j = 1:ncols(M)
5078-
M[i, j] = rand(rng, R, v...)
5093+
M[i, j] = rand(rng, v)
50795094
end
50805095
end
50815096
return M
50825097
end
50835098

5099+
rand(rng::AbstractRNG, S::AbstractAlgebra.MatSpace, v...) = rand(rng, make(S, v...))
5100+
50845101
rand(S::AbstractAlgebra.MatSpace, v...) = rand(Random.GLOBAL_RNG, S, v...)
50855102

50865103
function randmat_triu(rng::AbstractRNG, S::AbstractAlgebra.MatSpace, v...)

src/generic/MatrixAlgebra.jl

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,18 +344,35 @@ end
344344
#
345345
###############################################################################
346346

347-
function rand(rng::AbstractRNG, S::AbstractAlgebra.MatAlgebra, v...)
347+
348+
RandomExtensions.maketype(S::AbstractAlgebra.MatAlgebra, _) = elem_type(S)
349+
350+
function RandomExtensions.make(S::AbstractAlgebra.MatAlgebra, vs...)
351+
R = base_ring(S)
352+
if length(vs) == 1 && elem_type(R) == Random.gentype(vs[1])
353+
Make(S, vs[1]) # forward to default Make constructor
354+
else
355+
make(S, make(R, vs...))
356+
end
357+
end
358+
359+
function rand(rng::AbstractRNG,
360+
sp::SamplerTrivial{<:Make2{<:AbstractAlgebra.MatAlgElem,
361+
<:AbstractAlgebra.MatAlgebra}})
362+
S, v = sp[][1:end]
348363
M = S()
349364
n = degree(M)
350365
R = base_ring(S)
351366
for i = 1:n
352367
for j = 1:n
353-
M[i, j] = rand(rng, R, v...)
368+
M[i, j] = rand(rng, v)
354369
end
355370
end
356371
return M
357372
end
358373

374+
rand(rng::AbstractRNG, S::AbstractAlgebra.MatAlgebra, v...) = rand(rng, make(S, v...))
375+
359376
rand(S::AbstractAlgebra.MatAlgebra, v...) = rand(Random.GLOBAL_RNG, S, v...)
360377

361378
function randmat_triu(rng::AbstractRNG, S::AbstractAlgebra.MatAlgebra, v...)

src/generic/Module.jl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,10 +337,26 @@ end
337337
#
338338
###############################################################################
339339

340-
function rand(rng::AbstractRNG, M::AbstractAlgebra.FPModule{T}, vals...) where T <: RingElement
340+
RandomExtensions.maketype(M::AbstractAlgebra.FPModule, _) = elem_type(M)
341+
342+
function RandomExtensions.make(M::AbstractAlgebra.FPModule, vs...)
341343
R = base_ring(M)
342-
v = [rand(rng, R, vals...) for i in 1:ngens(M)]
343-
return M(v)
344+
if length(vs) == 1 && elem_type(R) == Random.gentype(vs[1])
345+
Make(M, vs[1]) # forward to default Make constructor
346+
else
347+
make(M, make(R, vs...))
348+
end
349+
end
350+
351+
function rand(rng::AbstractRNG,
352+
sp::SamplerTrivial{<:Make2{
353+
<:AbstractAlgebra.FPModuleElem, <:AbstractAlgebra.FPModule}})
354+
M, vals = sp[][1:end]
355+
M(rand(rng, vals, ngens(M)))
356+
end
357+
358+
function rand(rng::AbstractRNG, M::AbstractAlgebra.FPModule{T}, vals...) where T <: RingElement
359+
rand(rng, make(M, vals...))
344360
end
345361

346362
rand(M::AbstractAlgebra.FPModule, vals...) = rand(Random.GLOBAL_RNG, M, vals...)

src/generic/NCPoly.jl

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -694,19 +694,35 @@ end
694694
#
695695
###############################################################################
696696

697-
function rand(rng::AbstractRNG, S::AbstractAlgebra.NCPolyRing, deg_range::UnitRange{Int}, v...)
697+
RandomExtensions.maketype(S::AbstractAlgebra.NCPolyRing, dr::UnitRange{Int}, _) = elem_type(S)
698+
699+
function RandomExtensions.make(S::AbstractAlgebra.NCPolyRing, deg_range::UnitRange{Int}, vs...)
700+
R = base_ring(S)
701+
if length(vs) == 1 && elem_type(R) == Random.gentype(vs[1])
702+
Make(S, deg_range, vs[1]) # forward to default Make constructor
703+
else
704+
make(S, deg_range, make(R, vs...))
705+
end
706+
end
707+
708+
function rand(rng::AbstractRNG,
709+
sp::SamplerTrivial{<:Make3{<:AbstractAlgebra.NCPolyElem,
710+
<:AbstractAlgebra.NCPolyRing,
711+
UnitRange{Int}}})
712+
S, deg_range, v = sp[][1:end]
698713
R = base_ring(S)
699714
f = S()
700715
x = gen(S)
701716
for i = 0:rand(rng, deg_range)
702-
f += rand(rng, R, v...)*x^i
717+
f += rand(rng, v)*x^i
703718
end
704719
return f
705720
end
706721

707-
function rand(S::AbstractAlgebra.NCPolyRing, deg_range, v...)
708-
rand(Random.GLOBAL_RNG, S, deg_range, v...)
709-
end
722+
rand(rng::AbstractRNG, S::AbstractAlgebra.NCPolyRing, deg_range::UnitRange{Int}, v...) =
723+
rand(rng, make(S, deg_range, v...))
724+
725+
rand(S::AbstractAlgebra.NCPolyRing, deg_range, v...) = rand(Random.GLOBAL_RNG, S, deg_range, v...)
710726

711727
###############################################################################
712728
#

src/generic/Poly.jl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,7 +1281,7 @@ function pseudodivrem(f::AbstractAlgebra.PolyElem{T}, g::AbstractAlgebra.PolyEle
12811281
s = b^k
12821282
return q*s, f*s
12831283
end
1284-
1284+
12851285
################################################################################
12861286
#
12871287
# Remove and valuation
@@ -2743,16 +2743,32 @@ end
27432743
#
27442744
###############################################################################
27452745

2746-
function rand(rng::AbstractRNG, S::AbstractAlgebra.PolyRing, deg_range::UnitRange{Int}, v...)
2746+
RandomExtensions.maketype(S::AbstractAlgebra.PolyRing, dr::UnitRange{Int}, _) = elem_type(S)
2747+
2748+
function RandomExtensions.make(S::AbstractAlgebra.PolyRing, deg_range::UnitRange{Int}, vs...)
2749+
R = base_ring(S)
2750+
if length(vs) == 1 && elem_type(R) == Random.gentype(vs[1])
2751+
Make(S, deg_range, vs[1]) # forward to default Make constructor
2752+
else
2753+
make(S, deg_range, make(R, vs...))
2754+
end
2755+
end
2756+
2757+
# define rand for make(S, deg_range, v)
2758+
function rand(rng::AbstractRNG, sp::SamplerTrivial{<:Make3{<:RingElement,<:AbstractAlgebra.PolyRing,UnitRange{Int}}})
2759+
S, deg_range, v = sp[][1:end]
27472760
R = base_ring(S)
27482761
f = S()
27492762
x = gen(S)
27502763
for i = 0:rand(rng, deg_range)
2751-
f += rand(rng, R, v...)*x^i
2764+
f += rand(rng, v)*x^i
27522765
end
27532766
return f
27542767
end
27552768

2769+
rand(rng::AbstractRNG, S::AbstractAlgebra.PolyRing, deg_range::UnitRange{Int}, v...) =
2770+
rand(rng, make(S, deg_range, v...))
2771+
27562772
rand(S::AbstractAlgebra.PolyRing, deg_range, v...) = rand(Random.GLOBAL_RNG, S, deg_range, v...)
27572773

27582774
###############################################################################

0 commit comments

Comments
 (0)