{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Subgroup Lattice" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a draft version of the Subgroup Lattice module, inspired by the XGAP version, and implements few features. At the moment is possible to explore the lattice by right clicking a node and explore its properties, and by generating all subgroups lattice.\n", "\n", "This notebook has been developed by Manuel Martins for the francy package, and has been copied from https://github.com/gap-packages/francy/tree/master/notebooks. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 1, "metadata": { "text/plain": "" }, "output_type": "execute_result" } ], "source": [ "LoadPackage(\"PackageManager\");" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#I Package already installed at target location\n", "#I Target directory /Users/alexk/.gap/pkg/subgroup-lattice exists and is non-empty\n" ] }, { "data": { "text/plain": [ "false" ] }, "execution_count": 2, "metadata": { "text/plain": "" }, "output_type": "execute_result" } ], "source": [ "InstallPackage(\"https://github.com/mcmartins/subgroup-lattice.git\");" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 3, "metadata": { "text/plain": "" }, "output_type": "execute_result" } ], "source": [ "LoadPackage(\"subgrouplattice\");" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": { "text/plain": "" }, "output_type": "execute_result" }, { "data": { "application/vnd.francy+json": "{\"version\" : \"1.2.4\",\"mime\" : \"application\\/vnd.francy+json\",\"canvas\" : {\"width\" : 800,\"id\" : \"F1\",\"height\" : 600,\"title\" : \"GraphicSubgroupLattice\",\"zoomToFit\" : true,\"texTypesetting\" : false,\"menus\" : {\"F43\" : {\"id\" : \"F43\",\"title\" : \"Subgroup Lattice\",\"callback\" : {},\"menus\" : {\"F45\" : {\"id\" : \"F45\",\"title\" : \"All Subgroups\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F44\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f1, f2, f3, f4 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}}}}},\"graph\" : {\"type\" : \"directed\",\"id\" : \"F3\",\"simulation\" : true,\"collapsed\" : true,\"nodes\" : {\"F4\" : {\"x\" : 0,\"y\" : 0,\"type\" : \"diamond\",\"id\" : \"F4\",\"size\" : 10,\"title\" : \"G\",\"layer\" : -4,\"parent\" : \"\",\"color\" : \"\",\"selected\" : true,\"menus\" : {\"F6\" : {\"id\" : \"F6\",\"title\" : \"Size\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F5\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F8\" : {\"id\" : \"F8\",\"title\" : \"IsAbelian\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F7\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F10\" : {\"id\" : \"F10\",\"title\" : \"IsCyclic\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F9\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F12\" : {\"id\" : \"F12\",\"title\" : \"IsNilpotent\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F11\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F14\" : {\"id\" : \"F14\",\"title\" : \"IsNormal\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F13\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\",\"Group( [ f1, f2, f3, f4 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F16\" : {\"id\" : \"F16\",\"title\" : \"IsPerfect\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F15\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F18\" : {\"id\" : \"F18\",\"title\" : \"IsSimple\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F17\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F20\" : {\"id\" : \"F20\",\"title\" : \"IsSolvable\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F19\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F22\" : {\"id\" : \"F22\",\"title\" : \"Isomorphism\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F21\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( [ f4, f3, f1, f2 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}}},\"messages\" : {},\"callbacks\" : {}},\"F23\" : {\"x\" : 0,\"y\" : 0,\"type\" : \"diamond\",\"id\" : \"F23\",\"size\" : 10,\"title\" : \"1\",\"layer\" : 0,\"parent\" : \"\",\"color\" : \"\",\"menus\" : {\"F25\" : {\"id\" : \"F25\",\"title\" : \"Size\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F24\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F27\" : {\"id\" : \"F27\",\"title\" : \"IsAbelian\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F26\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F29\" : {\"id\" : \"F29\",\"title\" : \"IsCyclic\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F28\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F31\" : {\"id\" : \"F31\",\"title\" : \"IsNilpotent\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F30\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F33\" : {\"id\" : \"F33\",\"title\" : \"IsNormal\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F32\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\",\"Group( [ f1, f2, f3, f4 ] )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F35\" : {\"id\" : \"F35\",\"title\" : \"IsPerfect\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F34\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F37\" : {\"id\" : \"F37\",\"title\" : \"IsSimple\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F36\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F39\" : {\"id\" : \"F39\",\"title\" : \"IsSolvable\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F38\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\"],\"requiredArgs\" : {}},\"menus\" : {}},\"F41\" : {\"id\" : \"F41\",\"title\" : \"Isomorphism\",\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F40\",\"trigger\" : \"click\",\"knownArgs\" : [\"\",\"Group( of ... )\"],\"requiredArgs\" : {}},\"menus\" : {}}},\"messages\" : {},\"callbacks\" : {}}},\"links\" : {\"F42\" : {\"id\" : \"F42\",\"source\" : \"F23\",\"length\" : 0,\"weight\" : 0,\"target\" : \"F4\",\"color\" : \"\",\"invisible\" : false}}},\"messages\" : {\"F2\" : {\"type\" : \"default\",\"id\" : \"F2\",\"text\" : \"There are 5 levels in this Group.\",\"title\" : \"\"}},\"latticeType\" : {\"menus\" : [\"rec( func := function ( poset, G ) local L, cls, len, sz, graphHasse, max, rep, z, t, i, j, k, nodes, last, knownArgs, m, cb; L := LatticeSubgroups( G ); cls := ConjugacyClassesSubgroups( L ); len := [ ]; sz := [ ]; for i in cls do Add( len, Size( i ) ); AddSet( sz, Size( Representative( i ) ) ); od; graphHasse := poset!.graph; graphHasse!.nodes := rec( ); graphHasse!.links := rec( ); nodes := [ ]; sz := Reversed( sz ); for i in [ 1 .. Length( cls ) ] do nodes[i] := [ ]; for j in [ 1 .. len[i] ] do if len[i] = 1 then nodes[i][j] := Shape( ShapeType.DIAMOND, String( i ) ); else nodes[i][j] := Shape( ShapeType.CIRCLE, String( i ) ); fi; SetLayer( nodes[i][j], - Size( Representative( cls[i] ) ) ); for m in poset!.latticeType.contextMenus do knownArgs := [ poset, Representative( cls[i] ) ]; if m.group = true then Add( knownArgs, G ); fi; cb := Callback( m.func, knownArgs ); Add( nodes[i][j], Menu( m.name, cb ) ); od; if i = Length( cls ) and j = len[i] then SetTitle( nodes[i][j], \\\"G\\\" ); fi; Add( graphHasse, nodes[i][j] ); od; od; last := rec( o := 0, n := 0 ); for i in [ 1 .. Length( cls ) ] do for j in [ 1 .. len[i] ] do if Layer( nodes[i][j] ) <> last.o then last.o := Layer( nodes[i][j] ); last.n := last.n - 2; fi; SetLayer( nodes[i][j], last.n ); od; od; max := MaximalSubgroupsLattice( L ); for i in [ 1 .. Length( cls ) ] do for j in max[i] do rep := ClassElementLattice( cls[i], 1 ); for k in [ 1 .. len[i] ] do if k = 1 then z := j[2]; else t := cls[i]!.normalizerTransversal[k]; z := ClassElementLattice( cls[j[1]], 1 ); z := cls[j[1]]!.normalizerTransversal[j[2]] * t; z := PositionCanonical( cls[j[1]]!.normalizerTransversal, z ); fi; Add( graphHasse, Link( nodes[j[1]][z], nodes[i][k] ) ); od; od; od; return Draw( poset ); end, group := true, multiple := false, name := \\\"All Subgroups\\\" )\"],\"contextMenus\" : [\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Size\\\", String( Size( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := false, name := \\\"Size\\\" )\",\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Is commutative?\\\", String( IsCommutative( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := false, name := \\\"IsAbelian\\\" )\",\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Is cyclic?\\\", String( IsCyclic( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := false, name := \\\"IsCyclic\\\" )\",\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Is NilpotentGroup?\\\", String( IsNilpotentGroup( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := false, name := \\\"IsNilpotent\\\" )\",\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Is normal?\\\", String( IsNormal( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := true, name := \\\"IsNormal\\\" )\",\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Is perfect group?\\\", String( IsPerfectGroup( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := false, name := \\\"IsPerfect\\\" )\",\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Is simple group?\\\", String( IsSimpleGroup( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := false, name := \\\"IsSimple\\\" )\",\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Is solvable group?\\\", String( IsSolvableGroup( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := false, name := \\\"IsSolvable\\\" )\",\"rec( func := function ( poset, n ) local message; message := FrancyMessage( FrancyMessageType.INFO, \\\"Isomorphism\\\", String( IdGroup( n ) ) ); Add( poset, message ); return Draw( poset ); end, group := false, name := \\\"Isomorphism\\\" )\"],\"knowsLevels\" : true,\"trivial\" : true,\"hasse\" : true,\"canCompare\" : true}}}" }, "execution_count": 5, "metadata": { "application/vnd.francy+json": {} }, "output_type": "execute_result" } ], "source": [ "G := DihedralGroup(16);\n", "GraphicSubgroupLattice(G);" ] } ], "metadata": { "kernelspec": { "display_name": "GAP 4", "language": "gap", "name": "gap-4" }, "language_info": { "codemirror_mode": "gap", "file_extension": ".g", "mimetype": "text/x-gap", "name": "GAP 4", "nbconvert_exporter": "", "pygments_lexer": "gap", "version": "4.10.2" } }, "nbformat": 4, "nbformat_minor": 2 }