<h3>5 <span class="Heading">Crossed products and their elements</span></h3>
<p>The package <strong class="pkg">Wedderga</strong> provides functions to construct crossed products over a group with coefficients in an associative ring with identity, and with the multiplication determined by a given action and twisting (see <a href="chap9.html#X7FB21779832CE1CB"><span class="RefLink">9.6</span></a> for definitions). This can be done using the function <code class="func">CrossedProduct</code> (<a href="chap5.html#X797F31EF7B51A4DF"><span class="RefLink">5.1-1</span></a>).</p>
<p>Note that this function does not check the associativity conditions, so in fact it is the NC-version of itself, and its output will be always assumed to be associative. For all crossed products that appear in <strong class="pkg">Wedderga</strong> algorithms the associativity follows from theoretical arguments, so the usage of the NC-method in the package is safe. If the user will try to construct a crossed product with his own action and twisting, he/she should check the associativity conditions himself/herself to make sure that the result is correct.</p>
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ CrossedProduct</code>( <var class="Arg">R</var>, <var class="Arg">G</var>, <var class="Arg">act</var>, <var class="Arg">twist</var> )</td><td class="tdright">( attribute )</td></tr></table></div>
<p>Returns: Ring in the category <code class="code">IsCrossedProduct</code>.</p>
<p>The input should be formed by:</p>
<ul>
<li><p>an associative ring <var class="Arg">R</var>,</p>
</li>
<li><p>a group <var class="Arg">G</var>,</p>
</li>
<li><p>a function <var class="Arg">act(RG,g)</var> of two arguments: the crossed product <var class="Arg">RG</var> and an element <var class="Arg">g</var> in <span class="SimpleMath">G</span>. It must return a mapping from <var class="Arg">R</var> to <var class="Arg">R</var> which can be applied via the "\^" operation, and</p>
</li>
<li><p>a function <var class="Arg">twist(RG,g,h)</var> of three arguments: the crossed product <varclass="Arg">RG</var> and a pair of elements of <var class="Arg">G</var>. It must return an invertible element of <var class="Arg">R</var>.</p>
</li>
</ul>
<p>Returns the crossed product of <var class="Arg">G</var> over the ring <var class="Arg">R</var> with action <var class="Arg">act</var> and twisting <var class="Arg">twist</var>.</p>
<p>The resulting crossed product belongs to the category <code class="code">IsCrossedProduct</code>, which is defined as a subcategory of <code class="code">IsFLMLORWithOne</code>.</p>
<p>Let <span class="SimpleMath">n</span> be a positive integer and <span class="SimpleMath">ξ_n</span> an <span class="SimpleMath">n</span>-th complex primitive root of unity. The natural action of the group of units of <span class="SimpleMath">ℤ_n</span>, the ring of integers modulo <span class="SimpleMath">n</span>, on <span class="SimpleMath">ℚ (ξ_n)</span> can be defined as follows:</p>
<p>In the following example one constructs the Hamiltonian quaternion algebra over the rationals as a crossed product of the group of units of the cyclic group of order 2 over <span class="SimpleMath">ℚ (i)=GaussianRationals</span>. One realizes the cyclic group of order 2 as the group of units of <span class="SimpleMath">ℤ / 4 ℤ</span> and one uses the natural isomorphism <span class="SimpleMath">ℤ / 4 ℤ → Gal( ℚ (i)/ ℚ )</span> to describe the action.</p>
<p>The following example shows how to construct the Hamiltonian quaternion algebra over the rationals using the rationals as coefficient ring and the Klein group as the underlying group.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">C2 := CyclicGroup(2);;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">G := DirectProduct(C2,C2);</span>
<pc group of size 4 with 2 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">act := function(RG,a)</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return IdentityMapping( LeftActingDomain(RG));</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;</span>
function( RG, a ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">twist := function( RG, g , h )</span>
<span class="GAPprompt">></span> <span class="GAPinput">local one,g1,g2,h1,h2,G;</span>
<span class="GAPprompt">></span> <span class="GAPinput">G := UnderlyingMagma( RG );</span>
<span class="GAPprompt">></span> <span class="GAPinput">one := One( C2 );</span>
<span class="GAPprompt">></span> <span class="GAPinput">g1 := Image( Projection(G,1), g );</span>
<span class="GAPprompt">></span> <span class="GAPinput">g2 := Image( Projection(G,2), g );</span>
<span class="GAPprompt">></span> <span class="GAPinput">h1 := Image( Projection(G,1), h );</span>
<span class="GAPprompt">></span> <span class="GAPinput">h2 := Image( Projection(G,2), h );</span>
<span class="GAPprompt">></span> <span class="GAPinput">if g = One( G ) or h = One( G ) then return 1;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif IsOne(g1) and not IsOne(g2) and not IsOne(h1) and not IsOne(h2)</span>
<span class="GAPprompt">></span> <span class="GAPinput"> then return 1;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif not IsOne(g1) and IsOne(g2) and IsOne(h1) and not IsOne(h2)</span>
<span class="GAPprompt">></span> <span class="GAPinput"> then return 1;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif not IsOne(g1) and not IsOne(g2) and not IsOne(h1) and IsOne(h2)</span>
<span class="GAPprompt">></span> <span class="GAPinput"> then return 1;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else return -1;</span>
<span class="GAPprompt">></span> <span class="GAPinput">fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;</span>
function( RG, g, h ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">HQ := CrossedProduct( Rationals, G, act, twist );</span>
<crossed product over Rationals of a group of size 4>
</pre></div>
<p>Changing the rationals by the integers as coefficient ring one can construct the Hamiltonian quaternion ring.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">HZ := CrossedProduct( Integers, G, act, twist );</span>
<crossed product over Integers of a group of size 4>
<span class="GAPprompt">gap></span> <span class="GAPinput">i := GeneratorsOfGroup(G)[1]^Embedding(G,HZ); </span>
(f1)*(1)
<span class="GAPprompt">gap></span> <span class="GAPinput">j := GeneratorsOfGroup(G)[2]^Embedding(G,HZ);</span>
(f2)*(1)
<span class="GAPprompt">gap></span> <span class="GAPinput">i^2;</span>
(<identity> of ...)*(-1)
<span class="GAPprompt">gap></span> <span class="GAPinput">j^2; </span>
(<identity> of ...)*(-1)
<span class="GAPprompt">gap></span> <span class="GAPinput">i*j+j*i; </span>
<zero> of ...
</pre></div>
<p>One can extract the arguments used for the construction of the crossed product using the following attributes:</p>
<p>* <code class="code">LeftActingDomain</code> for the coefficient ring.</p>
<p>* <code class="code">UnderlyingMagma</code> for the underlying group.</p>
<p>* <code class="code">ActionForCrossedProduct</code> for the action.</p>
<p>* <code class="code">TwistingForCrossedProduct</code> for the twisting.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">LeftActingDomain(HZ);</span>
Integers
<span class="GAPprompt">gap></span> <span class="GAPinput">G:=UnderlyingMagma(HZ);</span>
<pc group of size 4 with 2 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">ac := ActionForCrossedProduct(HZ);</span>
function( RG, a ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">List( G , x -> ac( HZ, x ) );</span>
[ IdentityMapping( Integers ), IdentityMapping( Integers ),
IdentityMapping( Integers ), IdentityMapping( Integers ) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">tw := TwistingForCrossedProduct( HZ );</span>
function( RG, g, h ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">List( G, x -> List( G , y -> tw( HZ, x, y ) ) );</span>
[ [ 1, 1, 1, 1 ], [ 1, -1, -1, 1 ], [ 1, 1, -1, -1 ], [ 1, -1, 1, -1 ] ]
</pre></div>
<p>Some more examples of crossed products arise from the <em>Wedderburn decomposition</em> (<a href="chap9.html#X84BB4A6081EAE905"><span class="RefLink">9.3</span></a>) of group algebras.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">G := SmallGroup(32,50);</span>
<pc group of size 32 with 5 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">A := SimpleAlgebraByCharacter( GroupRing(Rationals,G), Irr(G)[17]) ;</span>
( <crossed product with center Rationals over GaussianRationals of a group of \
size 2>^[ 2, 2 ] )
<span class="GAPprompt">gap></span> <span class="GAPinput">SimpleAlgebraByCharacterInfo( GroupRing(Rationals,G), Irr(G)[17]) ;</span>
[ 2, Rationals, 4, [ 2, 3, 2 ] ]
<span class="GAPprompt">gap></span> <span class="GAPinput">B := LeftActingDomain(A);</span>
<crossed product with center Rationals over GaussianRationals of a group of si\
ze 2>
<span class="GAPprompt">gap></span> <span class="GAPinput">L := LeftActingDomain(B);</span>
GaussianRationals
<span class="GAPprompt">gap></span> <span class="GAPinput">H := UnderlyingMagma( B );</span>
<group of size 2 with 2 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">Elements(H);</span>
[ ZmodnZObj( 1, 4 ), ZmodnZObj( 3, 4 ) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">i := E(4) * One(H)^Embedding(H,B);</span>
(ZmodnZObj( 1, 4 ))*(E(4))
<span class="GAPprompt">gap></span> <span class="GAPinput">j := ZmodnZObj(3,4)^Embedding(H,B);</span>
(ZmodnZObj( 3, 4 ))*(1)
<span class="GAPprompt">gap></span> <span class="GAPinput">i^2;</span>
(ZmodnZObj( 1, 4 ))*(-1)
<span class="GAPprompt">gap></span> <span class="GAPinput">j^2;</span>
(ZmodnZObj( 1, 4 ))*(-1)
<span class="GAPprompt">gap></span> <span class="GAPinput">i*j+j*i;</span>
<zero> of ...
<span class="GAPprompt">gap></span> <span class="GAPinput">ac := ActionForCrossedProduct( B );</span>
function( RG, a ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">tw := TwistingForCrossedProduct( B );</span>
function( RG, a, b ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">List( H , x -> ac( B, x ) );</span>
[ IdentityMapping( GaussianRationals ), ANFAutomorphism( GaussianRationals,
3 ) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">List( H , x -> List( H , y -> tw( B, x, y ) ) );</span>
[ [ 1, 1 ], [ 1, -1 ] ]
</pre></div>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">QG:=GroupRing( Rationals, SmallGroup(24,3) );;</span>
<span class="GAPprompt">gap></span> <span class="GAPinput">WedderburnDecomposition(QG);</span>
[ Rationals, CF(3), ( Rationals^[ 3, 3 ] ),
<crossed product with center Rationals over GaussianRationals of a group of \
size 2>, <crossed product with center CF(3) over AsField( CF(3), CF(
12) ) of a group of size 2> ]
<span class="GAPprompt">gap></span> <span class="GAPinput">R:=WedderburnDecomposition( QG )[4];</span>
<crossed product with center Rationals over GaussianRationals of a group of si\
ze 2>
<span class="GAPprompt">gap></span> <span class="GAPinput">IsCrossedProduct(R);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsAlgebra(R);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsRing(R); </span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">LeftActingDomain( R );</span>
GaussianRationals
<span class="GAPprompt">gap></span> <span class="GAPinput">AsList( UnderlyingMagma( R ) );</span>
[ ZmodnZObj( 1, 4 ), ZmodnZObj( 3, 4 ) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">Print( ActionForCrossedProduct( R ) ); Print("\n");</span>
function ( RG, a )
local cond, redu;
cond := OperationRecord( RG ).cond;
redu := OperationRecord( RG ).redu;
return
ANFAutomorphism( CF( cond ), Int( PreImagesRepresentativeNC( redu, a ) ) );
end
<span class="GAPprompt">gap></span> <span class="GAPinput">Print( TwistingForCrossedProduct( R ) ); Print("\n"); </span>
function ( RG, a, b )
local orderroot, cocycle;
orderroot := OperationRecord( RG ).orderroot;
cocycle := OperationRecord( RG ).cocycle;
return E( orderroot ) ^ Int( cocycle( a, b ) );
end
<span class="GAPprompt">gap></span> <span class="GAPinput">IsAssociative(R);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">IsFinite(R); </span>
false
<span class="GAPprompt">gap></span> <span class="GAPinput">IsFiniteDimensional(R);</span>
true
<span class="GAPprompt">gap></span> <span class="GAPinput">AsList(Basis(R));</span>
[ (ZmodnZObj( 1, 4 ))*(1), (ZmodnZObj( 3, 4 ))*(1) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">GeneratorsOfLeftOperatorRingWithOne(R);</span>
[ (ZmodnZObj( 1, 4 ))*(1), (ZmodnZObj( 3, 4 ))*(1) ]
<span class="GAPprompt">gap></span> <span class="GAPinput">One(R);</span>
(ZmodnZObj( 1, 4 ))*(1)
<span class="GAPprompt">gap></span> <span class="GAPinput">Zero(R);</span>
<zero> of ...
<span class="GAPprompt">gap></span> <span class="GAPinput">Characteristic(R);</span>
0
<span class="GAPprompt">gap></span> <span class="GAPinput">CenterOfCrossedProduct(R);</span>
Rationals
</pre></div>
<p>The next example shows how one can use <code class="func">CrossedProduct</code> to produce generalized quaternion algebras. Note that one can construct quaternion algebras using the <strongclass="pkg">GAP</strong> function <code class="code">QuaternionAlgebra</code>.</p>
<div class="example"><pre>
<span class="GAPprompt">gap></span> <span class="GAPinput">Quat := function(R,a,b)</span>
<span class="GAPprompt">></span> <span class="GAPinput">local G,act,twist;</span>
<span class="GAPprompt">></span> <span class="GAPinput">if not(a in R and b in R and a <> Zero(R) and b <> Zero(R) ) then</span>
<span class="GAPprompt">></span> <span class="GAPinput">Error("<a> and <b> must be non zero elements of <R>!!!");</span>
<span class="GAPprompt">></span> <span class="GAPinput">fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput">G := SmallGroup(4,2);</span>
<span class="GAPprompt">></span> <span class="GAPinput">act := function(RG,a)</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return IdentityMapping( LeftActingDomain(RG));</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;</span>
<span class="GAPprompt">></span> <span class="GAPinput">twist := function( RG, g , h )</span>
<span class="GAPprompt">></span> <span class="GAPinput">local one,g1,g2;</span>
<span class="GAPprompt">></span> <span class="GAPinput">one := One(G);</span>
<span class="GAPprompt">></span> <span class="GAPinput">g1 := G.1;</span>
<span class="GAPprompt">></span> <span class="GAPinput">g2 := G.2;</span>
<span class="GAPprompt">></span> <span class="GAPinput">if g = one or h = one then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return One(R);</span>
<span class="GAPprompt">></span> <span class="GAPinput">elif g = g1 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if h = g2 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return One(R);</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return a;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput">elif g = g2 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if h = g1 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return -One(R);</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif h=g2 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return b;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return -b;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput">else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> if h = g1 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return -b;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> elif h=g2 then</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return b;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> else</span>
<span class="GAPprompt">></span> <span class="GAPinput"> return -a*b;</span>
<span class="GAPprompt">></span> <span class="GAPinput"> fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput">fi;</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;</span>
<span class="GAPprompt">></span> <span class="GAPinput">return CrossedProduct(R,G,act,twist);</span>
<span class="GAPprompt">></span> <span class="GAPinput">end;</span>
function( R, a, b ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">HQ := Quat(Rationals,2,3);</span>
<crossed product over Rationals of a group of size 4>
<span class="GAPprompt">gap></span> <span class="GAPinput">G := UnderlyingMagma(HQ);</span>
<pc group of size 4 with 2 generators>
<span class="GAPprompt">gap></span> <span class="GAPinput">tw := TwistingForCrossedProduct( HQ );</span>
function( RG, g, h ) ... end
<span class="GAPprompt">gap></span> <span class="GAPinput">List( G, x -> List( G, y -> tw( HQ, x, y ) ) );</span>
[ [ 1, 1, 1, 1 ], [ 1, 3, -1, -3 ], [ 1, 1, 2, 2 ], [ 1, 3, -3, -6 ] ]
<div class="func"><table class="func" width="100%"><tr><td class="tdleft"><code class="func">‣ ElementOfCrossedProduct</code>( <var class="Arg">Fam</var>, <var class="Arg">zerocoeff</var>, <var class="Arg">coeffs</var>, <var class="Arg">elts</var> )</td><td class="tdright">( property )</td></tr></table></div>
<p>Returns the element <span class="SimpleMath">m_1*c_1 + ... + m_n*c_n</span> of a crossed product, where <var class="Arg">elts</var> <span class="SimpleMath">= [ m_1, m_2, ..., m_n ]</span> is a list of magma elements, <var class="Arg">coeffs</var> <span class="SimpleMath">= [ c_1, c_2, ..., c_n ]</span> is a list of coefficients. The output belongs to the crossed product whose elements lie in the family <var class="Arg">Fam</var>. The second argument <var class="Arg">zerocoeff</var> must be the zero element of the coefficient ring containing coefficients <span class="SimpleMath">c_i</span>, and will be stored in the attribute <code class="code">ZeroCoefficient</code> of the crossed product element.</p>
<p>The output will be in the category <code class="code">IsElementOfCrossedProduct</code>, which is a subcategory of <code class="code">IsRingElementWithInverse</code>. It will have the presentation <code class="code">IsCrossedProductObjDefaultRep</code>.</p>
<p>Similarly to magma rings, one can obtain the list of coefficients and elements with <code class="code">CoefficientsAndMagmaElements</code> .</p>
<p>Also note from the example below and several other examples in this chapter that instead of <code class="code">ElementOfCrossedProduct</code> one can use <code class="code">Embedding</code> to embed elements of the coefficient ring and of the underlying magma into the crossed product.</p>
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.