Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
| Download
GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
Project: cocalc-sagemath-dev-slelievre
Views: 418346############################################################################# ## #W adjoint.gi The CIRCLE package Alexander Konovalov ## Panagiotis Soules ## ## This file contains implementations related with ## adoint semigroups and adjoint groups. ## ############################################################################# ############################################################################# ## #M IsUnit( <R>, <circle_obj> ) ## InstallMethod( IsUnit, "for a circle object in the given ring", [ IsRing, IsDefaultCircleObject ], function( R, a ) return IsUnit( R, One( a![1] ) + a![1] ); end ); ############################################################################# ## #M IsUnit( <circle_obj> ) ## InstallOtherMethod( IsUnit, "for a circle object in the default ring", [ IsDefaultCircleObject ], a -> IsUnit( One( a![1] ) + a![1] ) ); ############################################################################# ## #M IsCircleUnit( <R>,<obj> ) ## InstallMethod( IsCircleUnit, "for a ring element in the given ring", [ IsRing, IsRingElement ], function( R, a ) return IsUnit( R, One( a ) + a ); end ); ############################################################################# ## #M IsCircleUnit( <obj> ) ## InstallOtherMethod( IsCircleUnit, "for a ring element in the default ring", [ IsRingElement ], a -> IsUnit( One( a ) + a ) ); ############################################################################# ## #M AdjointSemigroup( <R> ) ## ## Let R be an associative ring, not necessarily with a unit element. The ## set of all elements of R forms a monoid with neutral element 0 from R ## under the operation r * s = r + s + rs for all r and s of R. This monoid ## is called the adjoint semigroup of R and is denoted R^ad. ## InstallMethod(AdjointSemigroup, "for a ring", [ IsRing ], function( R ) local S; if not IsFinite( R ) then Error("Adjoint semigroups for infinite rings are not implemented yet !!!"); fi; if not IsAssociative( R ) then # To enforce the associativity test for rings of the form # Ring( [ ZmodnZObj( 2, 8 ) ] ); Error("The ring <R> is non-associative !!!"); fi; if IsRingWithOne(R) then Print("\nWARNING: usage of AdjointSemigroup for associative ring <R> with one!!! \n", "The adjoint semigroup is isomorphic to the multiplicative semigroup! \n\n"); fi; # Enumeration of R must be feasible to do this: S := Monoid( List( R, CircleObject ) ); SetIsFinite( S, IsFinite( R ) ); SetUnderlyingRing( S, R ); return S; end ); ############################################################################# ## #M AdjointGroup( <R> ) ## ## Let R be an associative ring, not necessarily with a unit element. The ## set of all elements of R forms a monoid with neutral element 0 from R ## under the operation r * s = r + s + rs for all r and s of R. This monoid ## is called the adjoint semigroup of R and is denoted R^ad. The group of ## all invertible elements of this monoid is called the adjoint group of R ## and is denoted by R^*. ## ## If R is a radical algebra, that all its elements form a group with ## respect to the circle multiplication x*y = x + y + xy. Therefore ## its adjoint group coincides with R elementwise. We use this condition ## to determine whether the chosen set of generators is enough to generate ## the adjoint group. Note that the set of generators of the returned ## group is not required to be a generating set of minimal possible order. ## ## (I tested also the loop over all elements of R instead of the random ## selection. In my examples this was less efficient. But whether it is ## better to avoid randomness in the general method ???). ## ## If R has a unity 1, then 1+R^ad coincides with the multiplicative ## semigroup R^mult of R, and the map r -> 1+r with r in R is an isomorphism ## from R^ad onto R^mult. Similarly, 1+R^* coincides with the unit group of ## R, which we denote U(R), and the map r -> 1+r with r in R is an ## isomorphism from R^* onto U(R). ## ## If R is not a radical, then we compute all circle units of R, and then ## form a group of circle units, using the approach similar to the case of ## a radical algebra (this will work only for rings for which enummeration ## of all elements is feasible) ## InstallMethod(AdjointGroup, "for a ring", [ IsRing ], function( R ) local CircleUnits, G, h, h1, H; if not IsFinite( R ) then Error("Adjoint groups for infinite rings are not implemented yet !!!"); fi; if IsRingWithOne(R) then Print("\nWARNING: usage of AdjointGroup for associative ring <R> with one!!! \n", "In this case the adjoint group is isomorphic to the unit group \n", "Units(<R>), which possibly may be computed faster!!! \n\n"); fi; if IsAlgebra( R ) and R = RadicalOfAlgebra( R ) then Info( InfoCircle, 1, "Circle : <R> is a radical algebra, all elements are circle units"); CircleUnits := R; else Info( InfoCircle, 1, "Circle : <R> is not a radical algebra, computing circle units ..."); CircleUnits := [ ]; for h in R do h1 := CircleObject( h )^-1; if h1 <> fail then if UnderlyingRingElement( h1 ) in R then Add( CircleUnits, h ); fi; fi; od; fi; Info( InfoCircle, 1, "Circle : searching generators for adjoint group ..."); repeat h := Random( CircleUnits ); until h <> Zero( R ); G := Group( CircleObject( h ) ); while Size( G ) < Size( CircleUnits ) do h := Random( CircleUnits ); if h <> Zero( R ) then H := ClosureGroup( G, CircleObject( h ) ); if Size( G ) < Size( H ) then G := H; fi; fi; od; SetUnderlyingRing( G, R ); return G; end ); ############################################################################# ## #E ##