mirror of
https://github.com/kalmarek/GroupRings.jl.git
synced 2025-01-01 11:45:28 +01:00
add utilities for very low-level manipulation
This commit is contained in:
parent
9261df96ec
commit
37f9763fc3
46
src/misc.jl
46
src/misc.jl
@ -74,5 +74,51 @@ function star(X::GroupRingElem{T}) where T
|
|||||||
return GroupRingElem(sparsevec(nzind, X.coeffs.nzval, X.coeffs.n), RG)
|
return GroupRingElem(sparsevec(nzind, X.coeffs.nzval, X.coeffs.n), RG)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# Utilities
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
LinearAlgebra.norm(X::GroupRingElem, p::Int=2) = norm(X.coeffs, p)
|
LinearAlgebra.norm(X::GroupRingElem, p::Int=2) = norm(X.coeffs, p)
|
||||||
|
|
||||||
|
function _dealias(res::GroupRingElem, x::GroupRingElem, y::GroupRingElem)
|
||||||
|
@assert size(res) == size(x) == size(y)
|
||||||
|
if res.coeffs === x.coeffs || res.coeffs === y.coeffs
|
||||||
|
res = similar(res)
|
||||||
|
end
|
||||||
|
return res
|
||||||
|
end
|
||||||
|
|
||||||
|
function _promote(X::GroupRingElem{S}, Y::GroupRingElem{T}) where {S,T}
|
||||||
|
# TT = Core.Compiler.returntype(+, (T, S))
|
||||||
|
TT = AbstractAlgebra.promote_type(S,T)
|
||||||
|
# we do if else on TT to decide the parent of the result
|
||||||
|
if TT == S
|
||||||
|
result = similar(X)
|
||||||
|
elseif TT == T
|
||||||
|
result = similar(Y)
|
||||||
|
else
|
||||||
|
# we try to come up with parent; this will work for Julia numeric types
|
||||||
|
R = parent(first(X)+first(Y))
|
||||||
|
RG = change_base_ring(parent(X), R)
|
||||||
|
result = GroupRingElem(similar(X.coeffs, TT), RG)
|
||||||
|
@warn "Promoting group ring elements with different base rings!\nThe result has coefficients in $(R) of type $(eltype(result))."
|
||||||
|
end
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
multiplicative_id(G::Group) = G()
|
||||||
|
multiplicative_id(R::NCRing) = one(R)
|
||||||
|
|
||||||
|
function _identity_idx(RG::GroupRing)
|
||||||
|
hasbasis(RG) && return RG[multiplicative_id(RG.group)]
|
||||||
|
@warn "Group ring has no basis attached. Assuming identity is at index 1"
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
|
||||||
|
function _coerce_scalar(RG::GroupRing, c)
|
||||||
|
val = base_ring(RG)(c)
|
||||||
|
return GroupRingElem(sparsevec([_identity_idx(RG)], [val], length(RG)), RG, check=false)
|
||||||
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user