GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
############################################################################# ## ## AffineToricVariety.gi ToricVarieties package Sebastian Gutsche ## ## Copyright 2011 Lehrstuhl B für Mathematik, RWTH Aachen ## ## The Category of affine toric Varieties ## ############################################################################# ################################# ## ## Representations ## ################################# DeclareRepresentation( "IsAffineSheafRep", IsAffineToricVariety and IsSheafRep, [ "Sheaf" ] ); DeclareRepresentation( "IsAffineCombinatoricalRep", IsAffineToricVariety and IsCombinatoricalRep, [ ] ); DeclareRepresentation( "IsConeRep", IsAffineCombinatoricalRep and IsFanRep, [ ] ); ################################## ## ## Family and Type ## ################################## BindGlobal( "TheTypeConeToricVariety", NewType( TheFamilyOfToricVarietes, IsConeRep ) ); ################################## ## ## Properties ## ################################## ## InstallMethod( IsSmooth, " for convex varieties", [ IsConeRep ], function( variety ) return IsSmooth( ConeOfVariety( variety ) ); end ); ## InstallMethod( IsNormalVariety, "IsConeRep", [ IsConeRep ], function( variety ) return IsPointed( ConeOfVariety( variety ) ); end ); ################################## ## ## Attributes ## ################################## ## InstallMethod( ConeOfVariety, "for affine varieties", [ IsToricVariety and IsAffine ], function( variety ) local factors, cones_of_factors; factors := IsProductOf( variety ); if Length( factors ) > 1 then cones_of_factors := List( factors, ConeOfVariety ); return Product( cones_of_factors ); fi; if HasFanOfVariety( variety ) then return MaximalCones( FanOfVariety( variety ) )[ 1 ]; fi; TryNextMethod(); end ); InstallMethod( CoordinateRing, " for affine convex varieties", [ IsConeRep ], function( variety ) local factors, coordinate_ring; if Length( IsProductOf( variety ) ) > 1 then factors := IsProductOf( variety ); if ForAll( factors, HasCoordinateRing ) then coordinate_ring := Product( List( factors, CoordinateRing ) ); return coordinate_ring; fi; fi; Error( "no indeterminates given\n"); end ); ## InstallMethod( CoordinateRing, " for affine convex varities", [ IsConeRep, IsString ], function( variety, str ) return CoordinateRing( variety, [ str ] ); end ); ##This method requires the ToricIdeals package InstallMethod( CoordinateRing, " for affine convex varieties", [ IsToricVariety and IsAffine and HasConeOfVariety, IsList ], function( variety, variables ) local factors, hilbert_basis, n, indeterminates, variables_string, coordinate_ring, relations, i, k, j, a, b; if Length( IsProductOf( variety ) ) > 1 then factors := IsProductOf( variety ); if ForAll( factors, HasCoordinateRing ) then coordinate_ring := Product( List( factors, CoordinateRing ) ); SetCoordinateRing( variety, coordinate_ring ); return coordinate_ring; fi; fi; hilbert_basis := HilbertBasis( DualCone( ConeOfVariety( variety ) ) ); n := Length( hilbert_basis ); if Length( variables ) = 1 then variables := List( [ 1 .. n ], i -> JoinStringsWithSeparator( [ variables[ 1 ], i ], "_" ) ); fi; if not Length( variables ) = n then Error( "not the correct number of variables given\n" ); fi; variables_string := JoinStringsWithSeparator( variables, "," ); coordinate_ring := DefaultFieldForToricVarieties() * variables_string; relations := HomalgMatrix( hilbert_basis, HOMALG_MATRICES.ZZ ); relations := HomalgMap( relations, "free", "free" ); relations := GeneratingElements( KernelSubobject( relations ) ); Apply( relations, UnderlyingListOfRingElements ); if IsPackageMarkedForLoading( "ToricIdeals", ">=2011.01.01" ) then relations := GensetForToricIdeal( relations ); else relations := GeneratingSetOfToricIdealGivenByHilbertBasis( relations ); fi; if Length( relations ) > 0 then k := Length( relations ); for i in [ 1 .. k ] do a := "1"; b := "1"; for j in [ 1 .. n ] do if relations[ i ][ j ] < 0 then b := JoinStringsWithSeparator( [ b , JoinStringsWithSeparator( [ variables[ j ], String( - relations[ i ][ j ] ) ], "^" ) ], "*" ); elif relations[ i ][ j ] > 0 then a := JoinStringsWithSeparator( [ a, JoinStringsWithSeparator( [ variables[ j ], String( relations[ i ][ j ] ) ], "^" ) ], "*" ); fi; od; relations[ i ] := JoinStringsWithSeparator( [ a, b ], "-" ); relations[ i ] := HomalgRingElement( relations[ i ], coordinate_ring ); od; coordinate_ring := coordinate_ring / relations; fi; SetCoordinateRing( variety, coordinate_ring ); return coordinate_ring; end ); ## InstallMethod( ListOfVariablesOfCoordinateRing, "for toric varieties with cox rings", [ IsAffineToricVariety ], function( variety ) local coord_ring, variable_list, string_list, i; if not HasCoordinateRing( variety ) then Error( "no cox ring has no variables\n" ); fi; coord_ring := CoordinateRing( variety ); variable_list := Indeterminates( coord_ring ); string_list := [ ]; for i in variable_list do Add( string_list, String( i ) ); od; return string_list; end ); InstallMethod( MorphismFromCoordinateRingToCoordinateRingOfTorus, " for affine varieties", [ IsToricVariety and IsAffine and HasCoordinateRing and HasCoordinateRingOfTorus ], function( variety ) local torus_coord_ring, coord_ring, ring_map, image_list; torus_coord_ring := CoordinateRingOfTorus( variety ); coord_ring := CoordinateRing( variety ); image_list := HilbertBasis( DualCone( ConeOfVariety( variety ) ) ); image_list := List( image_list, i -> CharacterToRationalFunction( i, variety ) ); ring_map := RingMap( image_list, coord_ring, torus_coord_ring ); SetIsMorphism( ring_map, true ); SetIsMonomorphism( ring_map, true ); return ring_map; end ); ## InstallMethod( CartierTorusInvariantDivisorGroup, "for affine toric varieties", [ IsToricVariety and HasNoTorusfactor and IsAffine ], function( variety ) return ImageSubobject( MapFromCharacterToPrincipalDivisor( variety ) ); end ); ## InstallMethod( FanOfVariety, "for affine toric varieties", [ IsToricVariety and HasConeOfVariety ], function( variety ) if IsNormalVariety( variety ) then return ConeOfVariety( variety ); else Error( "variety is not normal\n" ); fi; TryNextMethod(); end ); ## InstallMethod( CartierTorusInvariantDivisorGroup, "for affine varieties", [ IsToricVariety and IsAffine ], 1, function( variety ) return ImageSubobject( MapFromCharacterToPrincipalDivisor( variety ) ); end ); ################################## ## ## Methods ## ################################## ## InstallMethod( \*, " for affine varieties", [ IsConeRep, IsConeRep ], function( variety1, variety2 ) local variety; variety := ToricVariety( ConeOfVariety( variety1 ) * ConeOfVariety( variety2 ) ); SetIsProductOf( variety, Flat( [ IsProductOf( variety1 ), IsProductOf( variety2 ) ] ) ); return variety; end ); ## InstallMethod( Cone, "for affine varieties", [ IsToricVariety and IsAffine ], function( variety ) return ConeOfVariety( variety ); end ); ################################## ## ## Constructors ## ################################## ## InstallMethod( ToricVariety, " for cones", [ IsCone ], function( cone ) local variety, cover; variety := rec( WeilDivisors := WeakPointerObj( [ ] ) ); ObjectifyWithAttributes( variety, TheTypeConeToricVariety, IsAffine, true, IsProjective, false, IsComplete, false, ## IsNormalVariety, true, ConeOfVariety, cone ## FanOfVariety, cone ); cover := ToricSubvariety( variety, variety ); SetAffineOpenCovering( variety, [ cover ] ); return variety; end );