2019-10-30 23:58:10 +01:00
|
|
|
|
isopposite(σ::Generic.Perm, τ::Generic.Perm, i=1, j=2) =
|
2019-06-30 13:19:24 +02:00
|
|
|
|
σ[i] ≠ τ[i] && σ[i] ≠ τ[j] &&
|
|
|
|
|
σ[j] ≠ τ[i] && σ[j] ≠ τ[j]
|
|
|
|
|
|
2019-10-30 23:58:10 +01:00
|
|
|
|
isadjacent(σ::Generic.Perm, τ::Generic.Perm, i=1, j=2) =
|
2019-06-30 13:19:24 +02:00
|
|
|
|
(σ[i] == τ[i] && σ[j] ≠ τ[j]) || # first equal, second differ
|
2020-04-19 21:37:09 +02:00
|
|
|
|
(σ[j] == τ[j] && σ[i] ≠ τ[i]) || # second equal, first differ
|
2019-06-30 13:19:24 +02:00
|
|
|
|
(σ[i] == τ[j] && σ[j] ≠ τ[i]) || # first σ equal to second τ
|
|
|
|
|
(σ[j] == τ[i] && σ[i] ≠ τ[j]) # second σ equal to first τ
|
|
|
|
|
|
|
|
|
|
Base.div(X::GroupRingElem, x::Number) = parent(X)(X.coeffs.÷x)
|
|
|
|
|
|
|
|
|
|
function Sq(RG::GroupRing, N::Integer)
|
|
|
|
|
S₂ = generating_set(RG.group, 2)
|
|
|
|
|
ℤ = Int64
|
|
|
|
|
Δ₂ = length(S₂)*one(RG, ℤ) - RG(S₂, ℤ);
|
|
|
|
|
|
2020-06-23 16:15:01 +02:00
|
|
|
|
Alt_N = [g for g in SymmetricGroup(N) if parity(g) == 0]
|
2019-06-30 13:19:24 +02:00
|
|
|
|
|
|
|
|
|
sq = RG()
|
|
|
|
|
for σ in Alt_N
|
2020-10-10 12:55:02 +02:00
|
|
|
|
GroupRings.addeq!(sq, *(Δ₂^σ, Δ₂^σ, false))
|
2019-06-30 13:19:24 +02:00
|
|
|
|
end
|
|
|
|
|
return sq÷factorial(N-2)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Adj(RG::GroupRing, N::Integer)
|
|
|
|
|
S₂ = generating_set(RG.group, 2)
|
|
|
|
|
ℤ = Int64
|
|
|
|
|
Δ₂ = length(S₂)*one(RG, ℤ) - RG(S₂, ℤ);
|
|
|
|
|
|
2020-06-23 16:15:01 +02:00
|
|
|
|
Alt_N = [g for g in SymmetricGroup(N) if parity(g) == 0]
|
2020-10-10 12:55:02 +02:00
|
|
|
|
Δ₂s = Dict(σ=>Δ₂^σ for σ in Alt_N)
|
2019-06-30 13:19:24 +02:00
|
|
|
|
adj = RG()
|
|
|
|
|
|
|
|
|
|
for σ in Alt_N
|
|
|
|
|
for τ in Alt_N
|
|
|
|
|
if isadjacent(σ, τ)
|
|
|
|
|
GroupRings.addeq!(adj, *(Δ₂s[σ], Δ₂s[τ], false))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return adj÷factorial(N-2)^2
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Op(RG::GroupRing, N::Integer)
|
|
|
|
|
if N < 4
|
|
|
|
|
return RG()
|
|
|
|
|
end
|
|
|
|
|
S₂ = generating_set(RG.group, 2)
|
|
|
|
|
ℤ = Int64
|
|
|
|
|
Δ₂ = length(S₂)*one(RG, ℤ) - RG(S₂, ℤ);
|
|
|
|
|
|
2020-06-23 16:15:01 +02:00
|
|
|
|
Alt_N = [g for g in SymmetricGroup(N) if parity(g) == 0]
|
2020-10-10 12:55:02 +02:00
|
|
|
|
Δ₂s = Dict(σ=>Δ₂^σ for σ in Alt_N)
|
2019-06-30 13:19:24 +02:00
|
|
|
|
op = RG()
|
|
|
|
|
|
|
|
|
|
for σ in Alt_N
|
|
|
|
|
for τ in Alt_N
|
|
|
|
|
if isopposite(σ, τ)
|
|
|
|
|
GroupRings.addeq!(op, *(Δ₂s[σ], Δ₂s[τ], false))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return op÷factorial(N-2)^2
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for Elt in [:Sq, :Adj, :Op]
|
|
|
|
|
@eval begin
|
|
|
|
|
$Elt(RG::GroupRing{AutGroup{N}}) where N = $Elt(RG, N)
|
2019-07-01 01:37:33 +02:00
|
|
|
|
$Elt(RG::GroupRing{<:MatAlgebra}) = $Elt(RG, nrows(RG.group))
|
2019-06-30 13:19:24 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function SqAdjOp(RG::GroupRing, N::Integer)
|
|
|
|
|
S₂ = generating_set(RG.group, 2)
|
|
|
|
|
ℤ = Int64
|
|
|
|
|
Δ₂ = length(S₂)*one(RG, ℤ) - RG(S₂, ℤ);
|
|
|
|
|
|
2020-06-23 16:15:01 +02:00
|
|
|
|
Alt_N = [σ for σ in SymmetricGroup(N) if parity(σ) == 0]
|
2019-06-30 13:19:24 +02:00
|
|
|
|
sq, adj, op = RG(), RG(), RG()
|
|
|
|
|
|
2020-10-17 02:13:59 +02:00
|
|
|
|
Δ₂s = Dict(σ=>Δ₂^σ for σ in Alt_N)
|
2019-06-30 13:19:24 +02:00
|
|
|
|
|
|
|
|
|
for σ in Alt_N
|
|
|
|
|
GroupRings.addeq!(sq, *(Δ₂s[σ], Δ₂s[σ], false))
|
|
|
|
|
for τ in Alt_N
|
|
|
|
|
if isopposite(σ, τ)
|
|
|
|
|
GroupRings.addeq!(op, *(Δ₂s[σ], Δ₂s[τ], false))
|
|
|
|
|
elseif isadjacent(σ, τ)
|
|
|
|
|
GroupRings.addeq!(adj, *(Δ₂s[σ], Δ₂s[τ], false))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
k = factorial(N-2)
|
|
|
|
|
return sq÷k, adj÷k^2, op÷k^2
|
|
|
|
|
end
|