Para dar una respuesta en la que utiliza el software de código abierto se puede hacer esto en la BRECHA.
En primer lugar, la BRECHA de código basado en el de la respuesta por @Travis. Se ve muy similar.
gap> sumOfOrders := G -> Sum(List(G,Order));
function( G ) ... end
gap> sumOfOrdersList := n -> SortedList(List(AllSmallGroups(n),sumOfOrders));
function( n ) ... end
gap> List([1..16],sumOfOrdersList);
[ [ 1 ], [ 3 ], [ 7 ], [ 7, 11 ], [ 21 ], [ 13, 21 ], [ 43 ],
[ 15, 19, 23, 27, 43 ], [ 25, 61 ], [ 31, 63 ], [ 111 ],
[ 31, 33, 45, 49, 77 ], [ 157 ], [ 57, 129 ], [ 147 ],
[ 31, 39, 47, 47, 47, 55, 55, 55, 59, 67, 75, 87, 87, 171 ] ]
Se puede ver que la última lista contiene 47 tres veces. Ahora vamos a buscar los tres grupos:
gap> l:=AllSmallGroups(16,g->sumOfOrders(g)=47);
[ <pc group of size 16 with 4 generators>,
<pc group of size 16 with 4 generators>,
<pc group of size 16 with 4 generators> ]
y obtener su Id:
gap> List(l,IdGroup);
[ [ 16, 3 ], [ 16, 10 ], [ 16, 13 ] ]
Alguna noción acerca de su estructura puede ser obtenida por StructureDescription
(que sin embargo no define el grupo de isomorfismo - ver aquí):
gap> List(l,StructureDescription);
[ "(C4 x C2) : C2", "C4 x C2 x C2", "(C4 x C2) : C2" ]
Si me gustaría ser menos suerte y no logran encontrar un ejemplo con una rápida exploración, probablemente escribir algo de código para más sistemático de búsqueda, que se vería el código de abajo, siguiendo las directrices de "Pequeños grupos de búsqueda" en la BRECHA de Software de Carpintería de la lección:
TestOneOrder:=function(n)
# find the smallest example among the groups of order n
local s,i,m,d,x;
# Calculate lists of sums of element orders.
# Avoid using AllSmallGroups(n) which potentially may be very large
s := List([1..NrSmallGroups(n)],i->Sum(List(SmallGroup(n,i),Order)));
if Length(Set(s))=NrSmallGroups(n) then
# Sum of element orders uniquely defines each group
return fail;
else
# There are duplicates - find them first
d := Filtered( Collected(s), x -> x[2] > 1 );
# Find the minimal possible value of the sum of element orders
m := Minimum( List( d, x-> x[1] ) );
# Find positions of m in the list
# Return the list of group IDs
return List( Positions(s,m), x -> [n,x] );
fi;
end;
FindSmallestPair:=function(n)
# check all groups of order up to n
local i, res;
for i in [1..n] do
# \r at the end of the print returns to the beginning of the line
Print("Checking groups of order ", i, "\r");
res := TestOneOrder(i);
if res<>fail then
# print new line before displaying the output
Print("\n");
return res;
fi;
od;
return fail;
end;
La lectura de este código en la BRECHA, se podría obtener el mismo resultado como el siguiente:
gap> FindSmallestPair(20);
Checking groups of order 16
[ [ 16, 3 ], [ 16, 10 ], [ 16, 13 ] ]