diff --git a/gap/field.gi b/gap/field.gi index d1801d7..52ea9c8 100644 --- a/gap/field.gi +++ b/gap/field.gi @@ -75,21 +75,20 @@ end ); ## InstallMethod(MaximalOrderBasis, "for number field", true,[IsNumberField], 0, function( F ) - local e, T, b, B; + local e, Tb, B; if DegreeOverPrimeField(F)=1 then return EquationOrderBasis(F); fi; e := EquationOrderBasis(F); - T := AL_FUNCS.MaximalOrderDescription(F); - b := List( T, x -> LinearCombination( e, x ) ); + Tb := AL_FUNCS.MaximalOrderDescription(F); B := Objectify(NewType(FamilyObj(F), IsFiniteBasisDefault and IsRelativeBasisDefaultRep), rec()); SetUnderlyingLeftModule( B, F ); - SetBasisVectors( B, b ); + SetBasisVectors( B, Tb[2] ); B!.basis := e; - B!.basechangeMatrix := Immutable( T^-1 ); + B!.basechangeMatrix := Immutable( Tb[1]^-1 ); return B; end ); @@ -140,17 +139,12 @@ BindGlobal( "AddUnitGroupOfNumberField", function( F, units ) end ); BindGlobal( "UnitGroupOfNumberField", function( F ) - local eqn, uni, gen, G, r, H, nat; + local uni, G; # determine generators - eqn := EquationOrderBasis(F); uni := AL_FUNCS.UnitGroupDescription(F); - if uni=[-1] then - G:=GroupByGenerators([-1*eqn[1]]); - else - gen := List( uni, x -> LinearCombination( eqn, x ) ); - G := GroupByGenerators(gen); - fi; + G := GroupByGenerators(uni); + # add info SetIsUnitGroup( G, true ); SetFieldOfUnitGroup( G, F ); @@ -161,8 +155,7 @@ BindGlobal( "UnitGroupOfNumberField", function( F ) end ); InstallMethod( UnitGroup, "for number field", true, -[IsNumberField], 0, function( F ) return -UnitGroupOfNumberField( F ); end); +[IsNumberField], UnitGroupOfNumberField); ############################################################################# ## diff --git a/gap/oscar.gi b/gap/oscar.gi index 1a13a9f..ce58e21 100644 --- a/gap/oscar.gi +++ b/gap/oscar.gi @@ -24,17 +24,24 @@ BindGlobal("_OscarField", function(F) end); BindGlobal("MaximalOrderDescriptionOscar", function(F) - local K, O, basis; + local K, O, basis, T, eqn, b; K := _OscarField(F); O := Oscar.maximal_order(K); basis := Julia.map(Oscar.coordinates,Oscar.basis(O,K)); - return JuliaToGAP(IsList, basis, true); + T := JuliaToGAP(IsList, basis, true); + + # convert to GAP + eqn := EquationOrderBasis(F); + b := List( T, x -> LinearCombination( eqn, x ) ); + + # return result + return [T, b]; end); BindGlobal("UnitGroupDescriptionOscar", function(F) - local K, O, U_m, U, m, basis; + local K, O, U_m, U, m, basis, result, eqn; K := _OscarField(F); O := Oscar.maximal_order(K); @@ -44,7 +51,18 @@ BindGlobal("UnitGroupDescriptionOscar", function(F) basis := Julia.map(Oscar.coordinates, Julia.map(K, Julia.map(m, Oscar.gens(U)))); - return JuliaToGAP(IsList, basis, true); + result := JuliaToGAP(IsList, basis, true); + + # convert to GAP + eqn := EquationOrderBasis(F); + if result = [-1] then + result := [-1*eqn[1]]; + else + result := List( result, x -> LinearCombination( eqn, x ) ); + fi; + + # return result + return result; end); BindGlobal("ExponentsOfUnitsDescriptionWithRankOscar", function(F, elms) diff --git a/gap/pari.gi b/gap/pari.gi index dbdff6d..a0ec0f2 100644 --- a/gap/pari.gi +++ b/gap/pari.gi @@ -89,7 +89,7 @@ end); #F MaximalOrderDescriptionPari( F ) ## BindGlobal("MaximalOrderDescriptionPari", function( F ) - local input, result; + local input, T, eqn, b; if IsPrimeField(F) then return [1]; fi; @@ -97,10 +97,14 @@ BindGlobal("MaximalOrderDescriptionPari", function( F ) input := PolynomialWithNameToStringList(IntegerDefiningPolynomial(F)); # execute PARI/GP - result := ProcessPariGP(Concatenation(input), "maxord.gp"); + T := ProcessPariGP(Concatenation(input), "maxord.gp"); + + # convert to GAP + eqn := EquationOrderBasis(F); + b := List( T, x -> LinearCombination( eqn, x ) ); # return result - return result; + return [T, b]; end); ############################################################################# @@ -108,7 +112,7 @@ end); #F UnitGroupDescriptionPari( F ) ## BindGlobal("UnitGroupDescriptionPari", function( F ) - local input, result; + local input, result, eqn; if IsPrimeField( F ) then return [-1]; fi; @@ -118,6 +122,14 @@ BindGlobal("UnitGroupDescriptionPari", function( F ) # execute PARI/GP result := ProcessPariGP(Concatenation(input), "units.gp"); + # convert to GAP + eqn := EquationOrderBasis(F); + if result = [-1] then + result := [-1*eqn[1]]; + else + result := List( result, x -> LinearCombination( eqn, x ) ); + fi; + # return result return result; end);