#################################### # # families and types: # ####################################
# a new type:
BindGlobal( "TheTypeHomalgExternalRingObjectInMacaulay2",
NewType( TheFamilyOfHomalgRings,
IsHomalgExternalRingObjectInMacaulay2Rep ) );
# a new type:
BindGlobal( "TheTypeHomalgExternalRingInMacaulay2",
NewType( TheFamilyOfHomalgRings,
IsHomalgExternalRingInMacaulay2Rep ) );
#################################### # # global functions: # ####################################
## will be automatically invoked in homalgSendBlocking once stream.active_ring is set; ## so there is no need to invoke it explicitly for a ring which can never be ## created as the first ring in the stream!
InstallGlobalFunction( _Macaulay2_SetRing, function( R )
local stream;
stream := homalgStream( R );
## since _Macaulay2_SetRing might be called from homalgSendBlocking, ## we first set the new active ring to avoid infinite loops:
stream.active_ring := R;
homalgSendBlocking( [ "use ", R ], "need_command", "initialize" );
end );
##
InstallGlobalFunction( _Macaulay2_SetInvolution, function( R )
local RP;
RP := homalgTable( R );
if IsBound( RP!.SetInvolution ) then
RP!.SetInvolution( R ); fi;
end );
##
BindGlobal( "Macaulay2Macros",
rec(
IsIdentityMatrix := "\n\
IsIdentityMatrix = M -> (\n\
local r, R;\n\
r = (numgens target M)-1;\n\
R = ring M;\n\ all(toList(0..numgens(source(M))-1), i->toList(set((entries M_i)_{0..i-1, i+1..r})) == {0_R} and entries (M^{i})_{i} == {{1_R}})\n\
);\n\n",
IsDiagonalMatrix := "\n\
IsDiagonalMatrix = M -> (\n\
local r, R;\n\
r = (numgens target M)-1;\n\
R = ring M;\n\ all(toList(0..numgens(source(M))-1), i->toList(set((entries M_i)_{0..i-1, i+1..r})) == {0_R})\n\
);\n\n",
ZeroRows := "\n\
ZeroRows = M -> (\n\
local R;\n\
R = ring M;\n\
concatenate({\"[\"} | between(\",\", apply(\n\
select(toList(1..(numgens target M)), i->toList(set(flatten entries M^{i-1})) == {0_R}),\n\
toString)) | {\"]\"})\n\
);\n\n",
ZeroColumns := "\n\
ZeroColumns = M -> (\n\
local R;\n\
R = ring M;\n\
concatenate({\"[\"} | between(\",\", apply(\n\
select(toList(1..(numgens source M)), i->toList(set(entries M_(i-1))) == {0_R}),\n\
toString)) | {\"]\"})\n\
);\n\n",
GetColumnIndependentUnitPositions := "\n\
GetColumnIndependentUnitPositions = (M, l) -> (\n\
local p,r,rest;\n\
rest = reverse toList(0..(numgens source M)-1);\n\
concatenate({\"[\"} | between(\",\",\n\ for j in toList(0..(numgens target M)-1) list (\n\
r = flatten entries M^{j};\n\
p = for i in rest list ( if not isUnit(r#i) then continue; rest = select(rest, k->zero(r#k)); break {concatenate({\"[\", toString(j+1), \",\", toString(i+1), \"]\"})});\n\ if p == {} then continue;\n\
p#0\n\
)) | {\"]\"})\n\
);\n\n",
GetRowIndependentUnitPositions := "\n\
GetRowIndependentUnitPositions = (M, l) -> (\n\
local c,p,rest;\n\
rest = reverse toList(0..(numgens target M)-1);\n\
concatenate({\"[\"} | between(\",\",\n\ for j in toList(0..(numgens source M)-1) list (\n\
c = entries M_j;\n\
p = for i in rest list ( if not isUnit(c#i) then continue; rest = select(rest, k->zero(c#k)); break {concatenate({\"[\", toString(j+1), \",\", toString(i+1), \"]\"})});\n\ if p == {} then continue;\n\
p#0\n\
)) | {\"]\"})\n\
);\n\n",
GetUnitPosition := "\n\
GetUnitPosition = (M, l) -> (\n\
local i,p,rest;\n\
rest = toList(1..(numgens source M)) - set(l);\n\
i = 0;\n\ for r in entries(M) list (\n\
i = i+1;\n\
p = for j in rest list ( if not isUnit(r#(j-1)) then continue; break {i, j} );\n\ if p == {} then continue p;\n\
return concatenate between(\",\", apply(p, toString))\n\
);\n\
\"fail\"\n\
);\n\n",
PositionOfFirstNonZeroEntryPerRow := "\n\
PositionOfFirstNonZeroEntryPerRow = M -> ( local n,p;\n\
n = numgens(source M)-1;\n\
concatenate between(\",\", apply(\n\ for r in entries(M) list (\n\
p = for j in toList(0..n) list ( if zero(r#j) then continue; break {j+1} );\n\ if p == {} then0else p#0\n\
), toString))\n\
)\n\n",
PositionOfFirstNonZeroEntryPerColumn := "\n\
PositionOfFirstNonZeroEntryPerColumn = M -> ( local n,p;\n\
n = numgens(target M)-1;\n\
concatenate between(\",\", apply(\n\ for r in entries(transpose M) list (\n\
p = for j in toList(0..n) list ( if zero(r#j) then continue; break {j+1} );\n\ if p == {} then0else p#0\n\
), toString))\n\
)\n\n",
GetCleanRowsPositions := "\n\
GetCleanRowsPositions = (M, l) -> (\n\
local R;\n\
R = ring M;\n\
concatenate between(\",\", apply(\n\ for i in toList(0..(numgens target M)-1) list ( if not any((flatten entries M^{i})_l, k->k == 1_R) then continue; i+1 ),\n\
toString))\n\
);\n\n",
if nargs > 0 and IsInt( arg[1] ) and arg[1] <> 0then
l := 2; ## characteristic:
c := AbsInt( arg[1] );
R := [ "ZZ / ", c ]; else if nargs > 0 and arg[1] = 0then
l := 2; else
l := 1; fi; ## characteristic:
c := 0;
R := [ "ZZ" ]; fi;
if not ( IsZero( c ) or IsPrime( c ) ) then
Error( "the ring Z/", c, "Z (", c, " non-prime) is not yet supported for Macaulay2!\nUse the generic residue class ring constructor '/' provided by homalg after defining the ambient ring (over the integers)\nfor help type: ?homalg: constructor for residue class rings\n" ); fi;
R := Concatenation( [ R, IsPrincipalIdealRing ], arg{[ l .. nargs ]} );
R := CallFuncList( RingForHomalgInMacaulay2, R );
SetIsResidueClassRingOfTheIntegers( R, true );
SetRingProperties( R, c );
return R;
end );
##
InstallMethod( HomalgRingOfIntegersInUnderlyingCAS, "for an integer and homalg ring in Macaulay2",
[ IsInt, IsHomalgExternalRingInMacaulay2Rep ],
HomalgRingOfIntegersInMacaulay2 );
##
InstallGlobalFunction( HomalgFieldOfRationalsInMacaulay2, function( arg )
local R;
R := "QQ";
R := Concatenation( [ R ], [ IsPrincipalIdealRing ], arg );
R := CallFuncList( RingForHomalgInMacaulay2, R );
SetIsRationalsForHomalg( R, true );
SetRingProperties( R, 0 );
return R;
end );
##
InstallMethod( HomalgFieldOfRationalsInUnderlyingCAS, "for a homalg ring in Macaulay2",
[ IsHomalgExternalRingInMacaulay2Rep ],
HomalgFieldOfRationalsInMacaulay2 );
##
InstallMethod( FieldOfFractions, "for homalg rings in Macaulay2",
[ IsHomalgExternalRingInMacaulay2Rep and IsIntegersForHomalg ],
function( R, indets )
local ar, r, var, nr_var, properties, ext_obj, S, l, RP;
ar := _PrepareInputForPolynomialRing( R, indets );
r := ar[1];
var := ar[2]; ## all indeterminates, relative and base
nr_var := ar[3]; ## the number of relative indeterminates
properties := ar[4];
## create the new ring if HasIndeterminatesOfPolynomialRing( R ) then
ext_obj := homalgSendBlocking( [ "(coefficientRing ", R, ")[", var, "]" ], TheTypeHomalgExternalRingObjectInMacaulay2, properties, "CreateHomalgRing" ); else
ext_obj := homalgSendBlocking( [ R, "[", var, "]" ], TheTypeHomalgExternalRingObjectInMacaulay2, properties, "CreateHomalgRing" ); fi;
S := CreateHomalgExternalRing( ext_obj, TheTypeHomalgExternalRingInMacaulay2 );
var := List( var, a -> HomalgExternalRingElement( a, S ) );
Perform( var, Name );
SetIsFreePolynomialRing( S, true );
if HasIndeterminatesOfPolynomialRing( R ) and IndeterminatesOfPolynomialRing( R ) <> [ ] then
l := Length( var );
SetRelativeIndeterminatesOfPolynomialRing( S, var{[ l - nr_var + 1 .. l ]} );
SetBaseRing( S, R ); fi;
## create the new ring if HasIndeterminatesOfPolynomialRing( R ) then
ext_obj := homalgSendBlocking( Concatenation( [ "(coefficientRing ", R, ")[", var, der, ",WeylAlgebra => {" ], [ JoinStringsWithSeparator( ListN( var, der, function(i, j) return Concatenation( i, "=>", j ); end ) ) ], [ "}]" ] ), TheTypeHomalgExternalRingObjectInMacaulay2, "CreateHomalgRing" ); else
ext_obj := homalgSendBlocking( Concatenation( [ R, "[", var, der, ",WeylAlgebra => {" ], [ JoinStringsWithSeparator( ListN( var, der, function(i, j) return Concatenation( i, "=>", j ); end ) ) ], [ "}]" ] ), TheTypeHomalgExternalRingObjectInMacaulay2, "CreateHomalgRing" ); fi;
S := CreateHomalgExternalRing( ext_obj, TheTypeHomalgExternalRingInMacaulay2 );
der := List( der, a -> HomalgExternalRingElement( a, S ) );
Perform( der, Name );
SetIsWeylRing( S, true );
SetBaseRing( S, R );
SetRingProperties( S, R, der );
RP := homalgTable( S );
RP!.SetInvolution := function( R )
homalgSendBlocking( [ "\nInvolution = M -> ( local R,T; R = ring M; T = Dtransposition M; transpose map(R^(numgens target T), R^(numgens source T), T) )\n\n" ], "need_command", R, "define" ); # forget degrees! end;
function( R, Coeff, Base, indets )
local ar, var, anti, comm, ext_obj, S, RP;
ar := _PrepareInputForExteriorRing( R, Base, indets );
var := ar[3];
anti := ar[4];
comm := ar[5];
## create the new ring if HasIndeterminatesOfPolynomialRing( Base ) then # create the new ring in one go in order to ensure standard grading
ext_obj := homalgSendBlocking( [ Coeff, "[", comm, anti, ",SkewCommutative => {", [ Length( comm )..( Length( comm ) + Length( anti ) - 1 ) ], "}]" ], TheTypeHomalgExternalRingObjectInMacaulay2, "CreateHomalgRing" ); else
ext_obj := homalgSendBlocking( [ Coeff, "[", anti, ",SkewCommutative => true]" ], TheTypeHomalgExternalRingObjectInMacaulay2, "CreateHomalgRing" ); fi;
S := CreateHomalgExternalRing( ext_obj, TheTypeHomalgExternalRingInMacaulay2 );
anti := List( anti , a -> HomalgExternalRingElement( a, S ) );
Perform( anti, Name );
comm := List( comm , a -> HomalgExternalRingElement( a, S ) );
Perform( comm, Name );
SetIsExteriorRing( S, true );
SetBaseRing( S, Base );
SetRingProperties( S, R, anti );
RP := homalgTable( S );
RP!.SetInvolution := function( R )
homalgSendBlocking( [ "\nInvolution = M -> ( local R; R = ring M; transpose map(R^(numgens target M), R^(numgens source M), apply(entries M, r->apply(r, c->sum apply(terms c, a->(-1)^(binomial(sum degree(a), 2)) * a)))) )\n\n" ], "need_command", R, "define" ); end;
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 und die Messung sind noch experimentell.