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############################################################################# ## ## GradedRingTools.gi GradedRingForHomalg package ## ## Copyright 2010, Mohamed Barakat, University of Kaiserslautern ## Markus Lange-Hegermann, RWTH-Aachen University ## ## Implementations for graded rings. ## ############################################################################# #################################### # # global variables: # #################################### ## InstallValue( CommonHomalgTableForGradedRingsTools, rec( IsZero := a -> IsZero( UnderlyingNonGradedRingElement( a ) ), IsOne := a -> IsZero( UnderlyingNonGradedRingElement( a ) ), Minus := function( a, b ) ## there is really nothing we can/want say about the degree of the difference return GradedRingElement( UnderlyingNonGradedRingElement( a ) - UnderlyingNonGradedRingElement( b ), HomalgRing( a ) ); end, DivideByUnit := function( a, b ) if HasDegreeOfRingElement( a ) and HasDegreeOfRingElement( b ) then return GradedRingElement( UnderlyingNonGradedRingElement( a ) / UnderlyingNonGradedRingElement( b ), DegreeOfRingElement( a ) - DegreeOfRingElement( b ), HomalgRing( a ) ); else return GradedRingElement( UnderlyingNonGradedRingElement( a ) / UnderlyingNonGradedRingElement( b ), HomalgRing( a ) ); fi; end, IsUnit := function( R, a ) return IsUnit( UnderlyingNonGradedRing( R ), UnderlyingNonGradedRingElement( a ) ); end, Sum := function( a, b ) ## there is really nothing we can/want say about the degree of the sum return GradedRingElement( UnderlyingNonGradedRingElement( a ) + UnderlyingNonGradedRingElement( b ), HomalgRing( a ) ); end, Product := function( a, b ) if HasDegreeOfRingElement( a ) and HasDegreeOfRingElement( b ) then return GradedRingElement( UnderlyingNonGradedRingElement( a ) * UnderlyingNonGradedRingElement( b ), DegreeOfRingElement( a ) + DegreeOfRingElement( b ), HomalgRing( a ) ); else return GradedRingElement( UnderlyingNonGradedRingElement( a ) * UnderlyingNonGradedRingElement( b ), HomalgRing( a ) ); fi; end, ShallowCopy := C -> ShallowCopy( Eval( C ) ), InitialMatrix := function( C ) return HomalgInitialMatrix( NrRows( C ), NrColumns( C ), UnderlyingNonGradedRing( C ) ); end, InitialIdentityMatrix := function( C ) return HomalgInitialIdentityMatrix( NrRows( C ), UnderlyingNonGradedRing( HomalgRing( C ) ) ); end, ZeroMatrix := function( C ) return HomalgZeroMatrix( NrRows( C ), NrColumns( C ), UnderlyingNonGradedRing( HomalgRing( C ) ) ); end, IdentityMatrix := function( C ) return HomalgIdentityMatrix( NrRows( C ), UnderlyingNonGradedRing( HomalgRing( C ) ) ); end, AreEqualMatrices := function( A, B ) return UnderlyingMatrixOverNonGradedRing( A ) = UnderlyingMatrixOverNonGradedRing( B ); end, Involution := function( M ) return Involution( UnderlyingMatrixOverNonGradedRing( M ) ); end, CertainRows := function( M, plist ) return CertainRows( UnderlyingMatrixOverNonGradedRing( M ), plist ); end, CertainColumns := function( M, plist ) return CertainColumns( UnderlyingMatrixOverNonGradedRing( M ), plist ); end, UnionOfRows := function( A, B ) return UnionOfRows( UnderlyingMatrixOverNonGradedRing( A ), UnderlyingMatrixOverNonGradedRing( B ) ); end, UnionOfColumns := function( A, B ) return UnionOfColumns( UnderlyingMatrixOverNonGradedRing( A ), UnderlyingMatrixOverNonGradedRing( B ) ); end, DiagMat := function( e ) return DiagMat( List( e, UnderlyingMatrixOverNonGradedRing ) ); end, KroneckerMat := function( A, B ) return KroneckerMat( UnderlyingMatrixOverNonGradedRing( A ), UnderlyingMatrixOverNonGradedRing( B ) ); end, MulMat := function( a, A ) return UnderlyingNonGradedRingElement( a ) * UnderlyingMatrixOverNonGradedRing( A ); end, MulMatRight := function( A, a ) return UnderlyingMatrixOverNonGradedRing( A ) * UnderlyingNonGradedRingElement( a ); end, AddMat := function( A, B ) return UnderlyingMatrixOverNonGradedRing( A ) + UnderlyingMatrixOverNonGradedRing( B ); end, SubMat := function( A, B ) return UnderlyingMatrixOverNonGradedRing( A ) - UnderlyingMatrixOverNonGradedRing( B ); end, Compose := function( A, B ) return UnderlyingMatrixOverNonGradedRing( A ) * UnderlyingMatrixOverNonGradedRing( B ); end, NrRows := C -> NrRows( UnderlyingMatrixOverNonGradedRing( C ) ), NrColumns := C -> NrColumns( UnderlyingMatrixOverNonGradedRing( C ) ), IsZeroMatrix := M -> IsZero( UnderlyingMatrixOverNonGradedRing( M ) ), IsIdentityMatrix := M -> IsOne( UnderlyingMatrixOverNonGradedRing( M ) ), IsDiagonalMatrix := M -> IsDiagonalMatrix( UnderlyingMatrixOverNonGradedRing( M ) ), ZeroRows := C -> ZeroRows( UnderlyingMatrixOverNonGradedRing( C ) ), ZeroColumns := C -> ZeroColumns( UnderlyingMatrixOverNonGradedRing( C ) ), GetColumnIndependentUnitPositions := function( M, pos_list ) local pos; pos := GetColumnIndependentUnitPositions( UnderlyingMatrixOverNonGradedRing( M ), pos_list ); if pos <> [ ] then SetIsZero( M, false ); fi; return pos; end, GetRowIndependentUnitPositions := function( M, pos_list ) local pos; pos := GetRowIndependentUnitPositions( UnderlyingMatrixOverNonGradedRing( M ), pos_list ); if pos <> [ ] then SetIsZero( M, false ); fi; return pos; end, PositionOfFirstNonZeroEntryPerRow := function( M ) return PositionOfFirstNonZeroEntryPerRow( UnderlyingMatrixOverNonGradedRing( M ) ); end, PositionOfFirstNonZeroEntryPerColumn := function( M ) return PositionOfFirstNonZeroEntryPerColumn( UnderlyingMatrixOverNonGradedRing( M ) ); end, GetUnitPosition := function( M, pos_list ) return GetUnitPosition( UnderlyingMatrixOverNonGradedRing( M ), pos_list ); end, DivideEntryByUnit := function( M, i, j, u ) DivideEntryByUnit( UnderlyingMatrixOverNonGradedRing( M ), i, j, UnderlyingNonGradedRingElement( u ) ); end, CopyRowToIdentityMatrix := function( M, i, L, j ) local l; l := List( L, function( a ) if IsHomalgMatrixOverGradedRingRep( a ) then return UnderlyingMatrixOverNonGradedRing( a ); else return a; fi; end ); CopyRowToIdentityMatrix( UnderlyingMatrixOverNonGradedRing( M ), i, l, j ); end, CopyColumnToIdentityMatrix := function( M, j, L, i ) return CopyColumnToIdentityMatrix( UnderlyingMatrixOverNonGradedRing( M ), j, UnderlyingMatrixOverNonGradedRing( L ), i ); end, SetColumnToZero := function( M, i, j ) return SetColumnToZero( UnderlyingMatrixOverNonGradedRing( M ), i, j ); end, GetCleanRowsPositions := function( M, clean_columns ) return GetCleanRowsPositions( UnderlyingMatrixOverNonGradedRing( M ), clean_columns ); end, Diff := function( D, N ) return MatrixOverGradedRing( Diff( UnderlyingMatrixOverNonGradedRing( D ), UnderlyingMatrixOverNonGradedRing( N ) ), HomalgRing( D ) ); end, Eliminate := function( rel, indets, S ) local R, mat; R := UnderlyingNonGradedRing( S ); if IsHomalgMatrix( rel ) then mat := Eliminate( UnderlyingMatrixOverNonGradedRing( rel ), List( indets, UnderlyingNonGradedRingElement ) ); else mat := Eliminate( List( rel, UnderlyingNonGradedRingElement ), List( indets, UnderlyingNonGradedRingElement ) ); fi; return EntriesOfHomalgMatrix( mat ); end, Determinant := function( M ) local det; det := Determinant( UnderlyingMatrixOverNonGradedRing( M ) ); return det / HomalgRing( M ); end, Pullback := function( phi, M ) local S, T; if not IsBound( phi!.UnderlyingRingMap ) then S := UnderlyingNonGradedRing( Source( phi ) ); T := UnderlyingNonGradedRing( Range( phi ) ); phi!.UnderlyingRingMap := RingMap( ImagesOfRingMap( phi ), S, T ); fi; M := UnderlyingMatrixOverNonGradedRing( M ); return Pullback( phi!.UnderlyingRingMap, M ); end, ) );