Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/src/Groups/action.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ rank_action(Omega::GSet)
is_primitive(Omega::GSet)
is_regular(Omega::GSet)
is_semiregular(Omega::GSet)
induce(Omega::GSetByElements{T, S}, phi::GAPGroupHomomorphism{U, T}) where {T<:Group, U<:Group, S}
```

## Block systems of a G-set
Expand Down
7 changes: 1 addition & 6 deletions src/Groups/GrpAb.jl
Original file line number Diff line number Diff line change
Expand Up @@ -329,12 +329,7 @@ function action_homomorphism(Omega::GSetByElements{FinGenAbGroup, S}) where S
G = codomain(phi)

# Let `G` act on `Omega` as `A` does.
phiinv = inv(phi)
actfun = action_function(Omega)
fun = function(omega::S, g::PermGroupElem)
return actfun(omega, phiinv(g))
end
OmegaG = GSetByElements(G, fun, Omega, closed = true, check = false)
OmegaG = induce(Omega, inv(phi))

# Compute the permutation action on `1:length(Omega)`
# corresponding to the action of `A` on `Omega`.
Expand Down
33 changes: 33 additions & 0 deletions src/Groups/gsets.jl
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,39 @@ end
as_gset(G::T, Omega) where T<:Union{GAPGroup,FinGenAbGroup} = as_gset(G, ^, Omega)


#############################################################################
##
## induce G-sets along homomorphisms

@doc raw"""
induce(Omega::GSetByElements{T, S}, phi::GAPGroupHomomorphism{U, T}) where {T<:Group, U<:Group, S}

Return the G-set that is obtained by inducing the G-set `Omega` along `phi`.

That means, given a ``G``-set ``\Omega`` with action function ``f: \Omega \times G \to \Omega``
and a homomorphism ``\phi: H \to G``, construct the ``H``-set ``\Omega'`` with action function
$\Omega' \times H \to \Omega', (\omega, h) \mapsto f(\omega, \phi(h))$.
"""
function induce(Omega::GSetByElements{T, S}, phi::GAPGroupHomomorphism{U, T}) where {T<:Group, U<:Group, S}
return _induce(Omega, phi)
end

# This method is not documented as we need `phi` to be a group homomorphism, but in many cases
# there is no dedicated type for this (WeylGroup, FinGenAbGroup, etc.).
# This should be restricted to group homomorphisms once we have a type for them.
function induce(Omega::GSetByElements{T, S}, phi::Map{U, T}) where {T<:Union{Group,FinGenAbGroup}, U<:Union{Group,FinGenAbGroup}, S}
return _induce(Omega, phi)
end

function _induce(Omega::GSetByElements{T, S}, phi::Map{U, T}) where {T<:Union{Group,FinGenAbGroup}, U<:Union{Group,FinGenAbGroup}, S}
@req acting_group(Omega) == codomain(phi) "acting group of Omega must be the codomain of phi"
Omega_fun = action_function(Omega)
fun = function (omega::S, g)
return Omega_fun(omega, phi(g))
end
return GSetByElements(domain(phi), fun, Omega; closed=true, check=false)
end

#############################################################################
##
## wrapper objects for elements of G-sets,
Expand Down
15 changes: 15 additions & 0 deletions test/Groups/gsets.jl
Original file line number Diff line number Diff line change
Expand Up @@ -581,3 +581,18 @@ end
@test describe(image(acthom)[1]) == "C3"
@test all(x -> permutation(o, x) == acthom(x), gens(u))
end

@testset "inducing G-sets" begin
G = symmetric_group(4)
Omega = gset(G, permuted, [[1,1,2,3]])
H = permutation_group(8, [cperm([1,3], [2,4]), cperm([1,5], [2,6], [3,7], [4,8])])
phi = hom(H, G, [cperm([1,2]), cperm([1,3], [2,4])])
Omega2 = induce(Omega, phi)
@test acting_group(Omega2) == H
@test elements(Omega2) == elements(Omega)
@test length(orbits(Omega2)) == 2
@test issetequal(length.(orbits(Omega2)), [4, 8])
stab2 = stabilizer(Omega2)[1]
@test order(stab2) == 2
@test cperm([1,3], [2,4]) in stab2
end
Loading