Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 8 additions & 15 deletions gap/field.gi
Original file line number Diff line number Diff line change
Expand Up @@ -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 );

Expand Down Expand Up @@ -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 );
Expand All @@ -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);

#############################################################################
##
Expand Down
26 changes: 22 additions & 4 deletions gap/oscar.gi
Original file line number Diff line number Diff line change
Expand Up @@ -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 ) );

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right now this just shifted code around (and even duplicated it, once for OSCAR and once for PARI). The real idea here is that instead of asking OSCAR for coordinates in one basis and then we convert it here, instead we can directly get the desired coords from OSCAR.

But I've not yet done it.


# 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);
Expand All @@ -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)
Expand Down
20 changes: 16 additions & 4 deletions gap/pari.gi
Original file line number Diff line number Diff line change
Expand Up @@ -89,26 +89,30 @@
#F MaximalOrderDescriptionPari( F )
##
BindGlobal("MaximalOrderDescriptionPari", function( F )
local input, result;
local input, T, eqn, b;

if IsPrimeField(F) then return [1]; fi;

# initialize list of input strings with the defining polynomial
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);

#############################################################################
##
#F UnitGroupDescriptionPari( F )
##
BindGlobal("UnitGroupDescriptionPari", function( F )
local input, result;
local input, result, eqn;

if IsPrimeField( F ) then return [-1]; fi;

Expand All @@ -118,6 +122,14 @@
# execute PARI/GP
result := ProcessPariGP(Concatenation(input), "units.gp");

# convert to GAP
eqn := EquationOrderBasis(F);
if result = [-1] then
result := [-1*eqn[1]];

Check warning on line 128 in gap/pari.gi

View check run for this annotation

Codecov / codecov/patch

gap/pari.gi#L128

Added line #L128 was not covered by tests
else
result := List( result, x -> LinearCombination( eqn, x ) );
fi;

# return result
return result;
end);
Expand Down