PropertyT.jl/AutGroups.jl

68 lines
1.9 KiB
Julia
Raw Normal View History

module AutGroups
using Groups
using Permutations
2017-01-21 17:19:08 +01:00
import Base: inv, ^
2017-01-21 17:17:45 +01:00
import Groups: IdSymbol, change_pow, GWord, ==, hash, reduce!
2017-01-21 17:19:08 +01:00
export AutSymbol, AutWord, GWord
export rmul_AutSymbol, lmul_AutSymbol, flip_AutSymbol, symmetric_AutSymbol
immutable AutSymbol <: GSymbol
gen::String
pow::Int
ex::Expr
end
2017-01-21 17:17:45 +01:00
(==)(s::AutSymbol, t::AutSymbol) = s.gen == t.gen && s.pow == t.pow
hash(s::AutSymbol, h::UInt) = hash(s.gen, hash(s.pow, hash(:AutSymbol, h)))
IDSymbol(::Type{AutSymbol}) = AutSymbol("(id)", 0, :(IDAutomorphism(N)))
change_pow(s::AutSymbol, n::Int) = reduce(AutSymbol(s.gen, n, s.ex))
function inv(f::AutSymbol)
symbol = f.ex.args[1]
if symbol ==
return change_pow(f, f.pow % 2)
elseif symbol == :σ
perm = invperm(f.ex.args[2])
gen = string('σ', [Char(8320 + i) for i in perm]...)
return AutSymbol(gen, f.pow, :(σ($perm)))
elseif symbol == :(ϱ) || symbol ==
return AutSymbol(f.gen, -f.pow, f.ex)
elseif symbol == :IDAutomorphism
return f
else
throw(ArgumentError("Don't know how to invert $f (of type $symbol)"))
end
end
function rmul_AutSymbol(i,j, pow::Int=1)
gen = string('ϱ',Char(8320+i), Char(8320+j)...)
return AutSymbol(gen, pow, :(ϱ($i,$j)))
end
function lmul_AutSymbol(i,j, pow::Int=1)
gen = string('λ',Char(8320+i), Char(8320+j)...)
return AutSymbol(gen, pow, :(λ($i,$j)))
end
function flip_AutSymbol(j, pow::Int=1)
gen = string('ɛ', Char(8320 + j))
return AutSymbol(gen, pow%2, :(ɛ($j)))
end
function symmetric_AutSymbol(perm::Vector{Int}, pow::Int=1)
perm = Permutation(perm)
ord = order(perm)
pow = pow % ord
perm = perm^pow
gen = string('σ', [Char(8320 + i) for i in array(perm)]...)
return AutSymbol(gen, 1, :(σ($(array(perm)))))
end
typealias AutWord GWord{AutSymbol}
end #end of module AutGroups