#LEZIONE 3: Sessione GAP

# Group Actions (Cfr. HOWTO GAP)

g:=SymmetricGroup(3);

Orbit(g,1,OnPoints);

Orbit(g,[1,2],OnSets);

Orbit(g,[1,2],OnTuples);

Orbit(g,[1,1],OnTuples);

Stabilizer(g,2,OnPoints);

Orbits(g,Cartesian([1..3],[1..3]),OnTuples);

Size(last);

g:=SymmetricGroup(5);

Orbits(g,[[1,2]],OnSets);

#Funzioni di insiemi

Intersection([1,3],[2,3]);

Intersection([1,3],[2,4]);

#Definiamo una funzione

bool:=function(x,y)
return Intersection(x,y)=[];
end;

bool([1,2],[3,4]);

bool([1,2],[1,4]);

#Il package Grape

LoadPackage("Grape");

#Costruire un grafo con la funzione Graph  dall'azione di un gruppo e da una funzione booleana sulle coppie di vertici. (Manuale Grape) 

Petersen:=Graph(SymmetricGroup(5),[[1,2]],OnSets,function(x,y) return Intersection(x,y)=[];end);

#Costruire un grafo con la funzione Graph  da una matrice di adiacenza. (Manuale Grape) 


A:=[
[0, 1, 0, 0, 1, 1, 0, 0, 0, 0], 
[1, 0, 1, 0, 0, 0, 1, 0, 0, 0], 
[0, 1, 0, 1, 0, 0, 0, 1, 0, 0], 
[0, 0, 1, 0, 1, 0, 0, 0, 1, 0], 
[1, 0, 0, 1, 0, 0, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 1, 0, 0, 1], 
[0, 1, 0, 0, 0, 1, 0, 1, 0, 0], 
[0, 0, 1, 0, 0, 0, 1, 0, 1, 0], 
[0, 0, 0, 1, 0, 0, 0, 1, 0, 1], 
[0, 0, 0, 0, 1, 1, 0, 0, 1, 0]
];


Petersen2:= Graph( Group(()), [1..10], OnPoints,
function(x,y) return A[x][y]=1; 
end, true );

B:=[[0, 0, 1, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 1, 0, 0, 0], [1, 
  0, 0, 0, 1, 0, 0, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 
  1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1, 0, 0, 1], [0, 1, 0, 
  0, 0, 1, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0, 1, 0], [0, 0, 0, 1, 
  0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 1, 1, 0, 0, 1, 0]];
  
Petersen3:= Graph( Group(()), [1..10], OnPoints,
function(x,y) return B[x][y]=1; 
end, true );

#Esploriamo i grafi in Gap con le funzioni del cap. 3 del manuale di Grape

Girth(Petersen2);

Girth(Petersen3);

#Testiamo un isomorfimo tra grafi (Manuale Grape, cap. 8)

IsIsomorphicGraph(Petersen,Petersen3);

#Costruiamo un isomorfismo tra grafi isomorfi

GraphIsomorphism(Petersen,Petersen3);

#Calcoliamo la matrice di adiacenza di un grafo

Pet:=CollapsedAdjacencyMat(Group(()),Petersen);

Pet3:=CollapsedAdjacencyMat(Group(()),Petersen3);

perm:=GraphIsomorphism(Petersen,Petersen3);

#Verifichiamo che l'simorfismo trasforma una matrice di adiacenza nell'altra

PPP:=PermutationMat(perm,10);

Pet3=Inverse(PPP)*Pet*PPP;