Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/hap/lib/Congruence/   (GAP Algebra Version 4.15.1©)  Datei vom 19.6.2025 mit Größe 14 kB image not shown  

Quelle  quadraticIntegers.gi   Sprache: Shell

 

##########################################################
##########################################################
InstallGlobalFunction(QuadraticNumberField,
function(d) 
local F;
F:=Field(Sqrt(d));
F!.bianchiInteger:=d;
Setter(IsQuadraticNumberField)(F,true);
SetName(F,Concatenation("Q(Sqrt(", String(d), "))"  ));
return F;
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallMethod(RingOfIntegers,
"Ring of integers of quadratic number fields",
[IsNumberField],
function(F)
local d,D,R;
if not IsBound(F!.bianchiInteger) then TryNextMethod(); fi;
d:=F!.bianchiInteger;

if d mod 4 =1 then D:=(1+Sqrt(d))/2; fi;
if d mod 4 =2 or d mod 4 = 3 then D:=Sqrt(d); fi;
R:=Ring(D);
R!.bianchiInteger:=d;
Setter(IsRingOfQuadraticIntegers)(R,true);
Setter(AssociatedNumberField)(R,F);
SetName(R,Concatenation("O(",Name(F),")"));

return R;
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(Norm,
"Norm of an element in a ring of quadratic integers",
[IsRingOfQuadraticIntegers,IsCyclotomic],
function(R,x)
return Norm(AssociatedNumberField(R),x);
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(Trace,
"Trace of an element in a ring of quadratic integers",
[IsRingOfQuadraticIntegers,IsObject],
function(R,x)
return Trace(AssociatedNumberField(R),x);
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(IN,
"for ring of quadratic integers",
[IsCyclotomic,IsRingOfQuadraticIntegers and IsRing],
function(x,R)
local p; 

p:=PartsOfQuadraticInteger(R,x);
if p=fail then return false; fi;

if IsInt(p[1]) and IsInt(p[2]) then return true;
else return false;
fi;

  
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallMethod(QuadraticIdeal,
"ideal in a ring of quadratic integers",
[IsRing and IsRingOfQuadraticIntegers, IsCyclotomic],
function(R,x);
return QuadraticIdeal(R,[x]);
end);
##########################################################
##########################################################



##########################################################
##########################################################
InstallOtherMethod(QuadraticIdeal,
"ideal in a ring of quadratic integers",
[IsRing and IsRingOfQuadraticIntegers, IsList],
function(R,X)
local I, D, N, g, p, q, G, A;

if IsCyclotomic(X) then
I:=TwoSidedIdeal(R,[X]);
else
I:=TwoSidedIdeal(R,X);
fi;
Setter(AssociatedRing)(I,R);
Setter(IsIdealOfQuadraticIntegers)(I,true);
Setter(IsRingOfQuadraticIntegers)(I,false);

D:=GeneratorsOfRing(AssociatedRing(I));
D:=D[1];

G:=GeneratorsOfTwoSidedIdeal(I);
A:=[];
for g in G do
p:=PartsOfQuadraticInteger(R,g);
q:=PartsOfQuadraticInteger(R,g*D);
Add(A,p); Add(A,q);
od;

N:=HermiteNormalFormIntegerMat(A); #rows are new basis of I
Setter(NormOfIdeal)(I,N[1][1]*N[2][2]);
#if R!.bianchiInteger mod 4 = 1 then D:=2*(D-(1/2)); fi;
I!.hermiteBasis:=[N,D];
SetName(I,Concatenation("ideal of norm ", String(Norm(I))," in ",Name(R)) );
return I;
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(IN,
"for ideal in a ring of quadratic integers",
[IsCyclotomic,IsIdealOfQuadraticIntegers and IsRing ],
function(x,I)
local g;

if x mod I = 0 then return true; else return false; fi;

##################This code is never used#########
#g:=GeneratorsOfTwoSidedIdeal(I)[1]; 
#if not 
#IsInt(  Norm(AssociatedRing(I),x) / Norm(I) )
#then return false; fi;
#return x*g^-1 in AssociatedRing(I);
##################################################
end);
##########################################################
##########################################################

##############################
InstallGlobalFunction(Hap_int,
function(y);
if y>0 or IsInt(y) then return Int(y);
else return Int(y)-1; fi;
end);
##############################


##########################################################
##########################################################
InstallOtherMethod(MOD,
"for a cyclotomic  and an ideal in a ring of quadratic integers",
[IsCyclotomic,IsIdealOfQuadraticIntegers and IsRing],
function(x,I)   
local g, N, D, p;

############This code is never used################
#for g in RightTransversal(I) do
#if g-x in I then return g; fi;
#od;
###################################################

##############################
#int:=function(y);
#if y>0 or IsInt(y) then return Int(y); 
#else return Int(y)-1; fi;
#end;
##############################

N:=I!.hermiteBasis[1];
D:=I!.hermiteBasis[2];

p:=PartsOfQuadraticInteger(AssociatedRing(I),x);
p:=p-Hap_int(p[1]/N[1][1])*N[1];
p:=p-Hap_int(p[2]/N[2][2])*N[2];

return p[1]+p[2]*D;

end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(InverseOp,
"Inverse of an element mod an ideal",
[IsIdealOfQuadraticIntegers,IsCyclotomic],  #NEED TO IMPROVE THIS!!!
function(I,x)
local T,y;

T:=RightTransversal(I);
for y in T do
if x*y-1 in I then return y; fi;
od;
return fail;
end);
##########################################################
##########################################################


##########################################################
##########################################################
InstallOtherMethod(Norm,
"Norm of an  ideal in a ring of quadratic integers",
[IsIdealOfQuadraticIntegers],
function(I)
local m;
return I!.NormOfIdeal;
end);
##########################################################
##########################################################


DeclareOperation("RightTransversal_alt",[IsIdealOfQuadraticIntegers]);
##########################################################
##########################################################
InstallOtherMethod(RightTransversal,
"Coset representatives of an ideal in a ring of quadratic integers",
[IsIdealOfQuadraticIntegers],
function(I)
local cosetreps,R,d,D,N,i,j;

if IsBound(I!.RightTransversal) then return I!.RightTransversal; fi;
R:=AssociatedRing(I);
d:=R!.bianchiInteger;
D:=I!.hermiteBasis[2];;
N:=I!.hermiteBasis[1];

cosetreps:=[];
for i in [0..N[1][1]-1] do
for j in [0..N[2][2]-1] do
Add(cosetreps,i+j*D);
od;od;

I!.RightTransversal:=cosetreps;
return cosetreps;
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(RightTransversal_alt,
"For test purposes only: Coset representatives of an ideal in a ring of quadratic integers",
[IsIdealOfQuadraticIntegers],
function(I)
local cosetreps,leaves,newleaves,isinsetModI,norm,R,A,H,P,g,a,b,x,y,i,j,D;

if IsBound(I!.RightTransversal) then return I!.RightTransversal; fi;

norm:=Norm(I);
if IsPrimeInt(norm) then
#   I!.RightTransversal:=[0..norm-1];
#   return I!.RightTransversal;
fi;

D:=GeneratorsOfRing(AssociatedRing(I));
D:=D[1];
g:=GeneratorsOfTwoSidedIdeal(I);
g:=g[1];
R:=AssociatedRing(I);

cosetreps:=[0];
leaves:=[0];

#################################
isinsetModI:=function(S,x)
local s;
for s in S do
if (s-x) in I then return true; fi;
od;
return false;

end;
#################################

while Size(leaves)>0 do
newleaves:=[];
for x in leaves do
y:=x+1; 
if not isinsetModI(cosetreps,y) then
Add(cosetreps,y);  
Add(newleaves,y);
fi;
y:=x+D;
if not isinsetModI(cosetreps,y) then
Add(cosetreps,y); 
Add(newleaves,y);
fi;
od;
leaves:=newleaves;
od;

I!.RightTransversal:=cosetreps;
return cosetreps;
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(Discriminant,
"Discriminant of a quadratic number field",
[IsNumberField],
function(Q);
if Q!.bianchiInteger mod 4 = 1 then return Q!.bianchiInteger;
else return 4*Q!.bianchiInteger; fi;
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(Discriminant,
"Discriminant of the quadratic number field associated to a ring of integers",
[IsRingOfQuadraticIntegers],
function(R);
return Discriminant(AssociatedNumberField(R));
end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallOtherMethod(Units,
"Units of a ring of quadratic integers",
[IsRingOfQuadraticIntegers],
1000000,#Hmm!
function(R) local d;
d:=R!.bianchiInteger;
if d>=0 then 
  Print("Not implemented for d>0.\n");
  return fail; 
fi;

if d=-1 then return [ [1,1] , [Sqrt(-1),-Sqrt(-1)] ]; fi;
if d=-3 then return [ [1,1] , [(1+Sqrt(-3))/2,(1-Sqrt(-3))/2] ]; fi;
return [[1,1]];

end);
##########################################################
##########################################################


##########################################################
##########################################################
InstallGlobalFunction(PartsOfQuadraticInteger,
function(R,x)
local q,a,b,d,r;
#This will aslo work for a non-integer.

d:=R!.bianchiInteger;

##THIS SEEMS QUICKER (BUT ISN'T!!)
#a:=RealPart(x);
#b:=ImaginaryPart(x)/Sqrt(AbsInt(d));
#if d mod 4 = 1 then a:=a-b; b:=2*b;fi;
#return [a,b];
##  March 2025



if IsCycInt(x) then
q:=Quadratic(x);

a:=q.a/q.d;
b:=q.b/q.d;


if d mod 4 = 1 then a:=a-b; b:=2*b;fi;
return [a,b];
fi;

r:=Sqrt(d);
a:=Trace(R,x)/2;
b:=(x-a)/r;

if not d mod 4 = 1 then
  return [a,b];
else
  return [a-b,2*b];
fi;


end);
##########################################################
##########################################################

##########################################################
##########################################################
InstallGlobalFunction(SL2QuadraticIntegers,
function(arg)
local X,R,S,d,gens,G;

X:=arg[1];

if IsInt(X) then
   R:=ResolutionSL2QuadraticIntegers(X,2);
   gens:=Generators(R,true);
   G:=Group(gens);
   SetName(G,Concatenation("SL(2,O(Q(",String(X),"))"));
   return G;
fi;
if IsRing(X) then
  if not IsBound(X!.associatedIdeal) then return fail; 
  else S:=X!.associatedIdeal;  S:=S!.AssociatedRing;
  fi;
  if not IsBound(S!.bianchiInteger) then return fail; 
  else d:=S!.bianchiInteger; fi;

   R:=ResolutionSL2QuadraticIntegers(d,2);
   gens:=Generators(R,true);
   G:=Group(gens*One(S));
   SetName(G,Concatenation("SL(2,", Name(X),")"));
   return G;
  
fi;
end);
##########################################################
##########################################################

######################################################################
InstallOtherMethod( Int,
    "Int for HAPSqrt",
    [ IsHapQuadraticNumber],
100000000,
function(x);
if not IsZero(x!.irrational) then return fail; fi;
return Int(x!.rational);

end);
#####################################################################

##########################################################
##########################################################
InstallOtherMethod(IN,
"for an infinite Bianchi stabilizer group",
[IsHap2x2matrix,IsBianchiAbelianGroup ],
1000000000,
function(g,G)
local x, y, c, gens, s, L, D;

if IsFinite(G) then return g in Elements(G); fi;

D:=DenominatorRat;
gens:=GeneratorsOfGroup(G);
if (g[1][1])!.bianchiInteger<>gens[1][1][1]!.bianchiInteger then
return false;
fi;

x:=[(gens[1][2][1])!.rational,(gens[1][2][1])!.irrational];
y:=[(gens[2][2][1])!.rational,(gens[2][2][1])!.irrational];
c:=[(g[2][1])!.rational,(g[2][1])!.irrational];
L:=Lcm(D(x[1]),D(x[2]),D(y[1]),D(y[2]));
s:=SolutionIntMat(L*[x,y],L*c);

if s=fail then return false;
else return g=gens[1]^s[1]*gens[2]^s[2] or -g=gens[1]^(s[1])*gens[2]^(s[2])
or g=gens[1]^-s[1]*gens[2]^-s[2] or -g=gens[1]^(-s[1])*gens[2]^(-s[2])
or g=gens[1]^s[1]*gens[2]^-s[2] or -g=gens[1]^(s[1])*gens[2]^(-s[2]) 
or g=gens[1]^-s[1]*gens[2]^s[2] or -g=gens[1]^(-s[1])*gens[2]^(s[2]);
fi;
end);
##########################################################
##########################################################



######################################################################
InstallOtherMethod( One,
    "one in 2x2 matrix group",
    [ IsHap2x2matrix],
100000000,
function(M)
local one,zero;
one:=One(M[1][1]);
zero:=Zero(M[1][1]);

return  [[one,zero],[zero,one]];


end);
#####################################################################

#####################################################################
InstallOtherMethod( InverseMutable,
    "inverse in 2x2 matrix group",
    [ IsHap2x2matrix],
10000000,
function(M) local D;
D:=Determinant(M)^-1;

return  [[D*M[2][2], -D*M[1][2]],[-D*M[2][1],D*M[1][1]]];
end);
#####################################################################

#####################################################################
InstallOtherMethod( Zero,
    "zero 2x2 matrix ",
    [ IsHap2x2matrix],
100000000,
function(M) local D;

return [[Zero(M[1][1]),Zero(M[1][2])],[Zero(M[2][1]),Zero(M[2][2])]];
end);
#####################################################################


Messung
CHZG
898910092

¤ Dauer der Verarbeitung: 0.4 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover


Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

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.