{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "HTML(\"\"\"\n", "\n", "\"\"\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from IPython.core.interactiveshell import InteractiveShell\n", "InteractiveShell.ast_node_interactivity = \"all\"\n", "from IPython.core.display import Image" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Computing Modular Cohomology Rings of Finite Groups with SageMath\n", "##### Simon King (FSU Jena), 2019\n", "###### based on joint work with Graham Ellis, Bettina Eick, David Green\n", "\n", "1. History and installation\n", "2. Computing cohomology rings\n", "3. Invariants\n", "4. Induced homomorphisms, essential ideals, bar codes\n", "5. Detecting isomorphic rings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. History and installation\n", "\n", "#### Why Sagemath?\n", "\n", "Modular cohomology computations involve a variety of computational tasks, for which we use the following resources:\n", "- *Initial segments of minimal projective resolutions* of $\\mathbb F_pG$ where $G$ is a finite $p$-group: C code (David Green) using MeatAxe (Klaus Lux, Michael Ringe; or rather a fork maintained by S.K.) as back-end for linear algebra.\n", "- *Construction of special subgroups*: GAP code (David Green), SmallGroups library (Ulrich Besche, Bettina Eick, Eamann O'Brian)\n", "- *Cochains, induced maps, stable elemeint method etc.*: Cython, Python code (S.K.)\n", "- *Gröbner bases in graded-commutative rings*: Singular (Wolfram Decker, Gert-Martin Greuel, Gerhard Pfister, and Hans Schönemann)\n", "- *Poincaré series*: New implementation in SageMath (S.K.)\n", "\n", "When we started our project in 2008, SageMath was the only free open source platform providing a framework for all of the above.\n", "\n", "#### Performance\n", "\n", "We computed modular cohomology rings (for various primes) of ...\n", " - all groups of order 128 (with David Green, 2009),\n", " - the first three Janko groups,\n", " - Mathieu groups 11, 12, 22 and 23,\n", " - the McLaughlin group,\n", " - SuzukiGroup(8),\n", " - the Higman-Sims group and\n", " - the third Conway group (with David Green, Graham Ellis, 2011).\n", "\n", "Comparison: The first complete computation for all groups of order 64 (Carlson, 1997--2001) took about 8 months CPU time on SUN ULTRA 2200 (200 MHz clock speed?). With the latest version of p_group_cohomology, it takes about 7 minutes on this laptop (2.60 GHz clock speed).\n", "\n", "#### Documentation and installation\n", "\n", "The documentation and computational results can be found starting at https://users.fmi.uni-jena.de/~king/cohomology/. The current \"official\" version p_group_cohomology-3.1 can be installed in SageMath by\n", " \n", " sage -i meataxe # installs an optional package\n", " sage -b # builds some modules in the SageMath library\n", " sage -i p_group_cohomology\n", " \n", "Part of what we are presenting here is not in version 3.1 yet but will be part of version 3.2 --- see trac ticket https://trac.sagemath.org/ticket/28204" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Computing cohomology rings\n", "\n", "Let's import the interface to the cohomology package:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from pGroupCohomology import CohomologyRing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will see below that the computation of one cohomology ring may involve the computation of various other rings. And data of one ring can be huge. Therefore, those parts of the data that aren't actively used will be stored on disk in a location we call the *workspace*. There is a default location, but just for this talk I'm using a temporary folder:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "CohomologyRing.set_workspace(tmp_dir())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Data sources\n", "\n", "The package is shipped with the modular cohomology rings of all groups of order 64. This \"local source\" is shared by all users of a SageMath installation and can of course be extended.\n", "\n", "If a ring can not be found in the user's workspace nor in the local sources, a \"web source\" is accessed (unless web access is disallowed).\n", "\n", "The cohomology ring is determined either...\n", " - by the address of a group in the SmallGroups library,\n", " - by a group defined in SageMath's interface to the GAP interpreter, or\n", " - a tower of subgroups starting with a Sylow subgroup\n", "\n", "and a prime number if it isn't clear from the context. There are further options, e.g., in some of our examples we use logging:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Resolution of GF(2)[64gp158]: \n", " Differential reloaded\n", " > rk P_02 = 4\n", " Differential reloaded\n", " > rk P_03 = 4\n", " Differential reloaded\n", " > rk P_04 = 6\n", " Differential reloaded\n", " > rk P_05 = 9\n", " Differential reloaded\n", " > rk P_06 = 9\n", "H^*(SmallGroup(64,158); GF(2)): \n", " Import monomials\n", "Checking compatibility of SmallGroups library and stored cohomology ring\n" ] } ], "source": [ "H64gp158 = CohomologyRing(64, 158, options='info') # This is from the local sources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ring is loaded from disk and already is completely known:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "H^*(SmallGroup(64,158); GF(2))" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Cohomology ring of Small Group number 158 of order 64 with coefficients in GF(2)\n", "\n", "Computation complete\n", "Minimal list of generators:\n", "[c_4_4: 4-Cocycle in H^*(SmallGroup(64,158); GF(2)),\n", " c_4_5: 4-Cocycle in H^*(SmallGroup(64,158); GF(2)),\n", " a_1_0: 1-Cocycle in H^*(SmallGroup(64,158); GF(2)),\n", " a_1_1: 1-Cocycle in H^*(SmallGroup(64,158); GF(2)),\n", " a_1_2: 1-Cocycle in H^*(SmallGroup(64,158); GF(2)),\n", " a_3_2: 3-Cocycle in H^*(SmallGroup(64,158); GF(2)),\n", " a_3_3: 3-Cocycle in H^*(SmallGroup(64,158); GF(2))]\n", "Minimal list of algebraic relations:\n", "[a_1_1^2+a_1_0*a_1_1+a_1_0^2,\n", " a_1_0*a_1_2,\n", " a_1_0^3,\n", " a_1_2^3,\n", " a_1_0*a_3_2,\n", " a_1_2*a_3_3,\n", " a_1_2^2*a_3_2+a_1_0^2*a_3_3,\n", " a_3_2*a_3_3,\n", " a_3_2^2+a_1_0^2*a_1_1*a_3_3+c_4_4*a_1_2^2,\n", " a_3_3^2+c_4_5*a_1_0^2+c_4_4*a_1_0^2]\n", " \n" ] } ], "source": [ "H64gp158\n", "print H64gp158" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We download an example of order 128, showing that some groups are known under a custom name:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Accessing web\n", "Press Ctrl-c to interrupt web access.\n", "Downloading and extracting archive file\n", "Trying to read downloaded data\n", "Resolution of GF(2)[128gp934]: \n", " Differential reloaded\n", " > rk P_02 = 6\n", " Differential reloaded\n", " > rk P_03 = 10\n", " Differential reloaded\n", " > rk P_04 = 15\n", " Differential reloaded\n", " > rk P_05 = 22\n", " Differential reloaded\n", " > rk P_06 = 30\n", " Differential reloaded\n", " > rk P_07 = 38\n", " Differential reloaded\n", " > rk P_08 = 50\n", " Differential reloaded\n", " > rk P_09 = 66\n", " Differential reloaded\n", " > rk P_10 = 84\n", " Differential reloaded\n", " > rk P_11 = 104\n", " Differential reloaded\n", " > rk P_12 = 128\n", " Differential reloaded\n", " > rk P_13 = 157\n", " Differential reloaded\n", " > rk P_14 = 188\n", " Differential reloaded\n", " > rk P_15 = 220\n", " Differential reloaded\n", " > rk P_16 = 259\n", " Differential reloaded\n", " > rk P_17 = 305\n", " Differential reloaded\n", " > rk P_18 = 354\n", " Differential reloaded\n", " > rk P_19 = 406\n", " Differential reloaded\n", " > rk P_20 = 465\n", "H^*(Syl2(J2); GF(2)): \n", " Import monomials\n", "Checking compatibility of SmallGroups library and stored cohomology ring\n" ] } ], "source": [ "H128gp934 = CohomologyRing(128, 934) # this is from a remote source, provided internet works..." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "H^*(Syl2(J2); GF(2))" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Cohomology ring of Sylow 2-subgroup of Hall-Janko Group J_2 with coefficients in GF(2)\n", "\n", "Computation complete\n", "Minimal list of generators:\n", "[a_2_4: 2-Cocycle in H^*(Syl2(J2); GF(2)),\n", " a_2_5: 2-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_4_14: 4-Cocycle in H^*(Syl2(J2); GF(2)),\n", " c_8_49: 8-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_10_83: 10-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_1_0: 1-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_1_1: 1-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_1_2: 1-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_3_8: 3-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_3_9: 3-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_5_20: 5-Cocycle in H^*(Syl2(J2); GF(2)),\n", " b_5_21: 5-Cocycle in H^*(Syl2(J2); GF(2))]\n", "Minimal list of algebraic relations:\n", "[b_1_0*b_1_1,\n", " b_1_0*b_1_2,\n", " a_2_4*b_1_1,\n", " a_2_5*b_1_2,\n", " a_2_5*b_1_1+a_2_4*b_1_2,\n", " a_2_5^2+a_2_4*a_2_5+a_2_4^2,\n", " b_1_0*b_3_8+a_2_4^2,\n", " b_1_0*b_3_9+a_2_5^2,\n", " a_2_4*b_3_8,\n", " a_2_5*b_3_9,\n", " a_2_5*b_3_8+a_2_4*b_3_9,\n", " b_4_14*b_1_0+a_2_4*b_1_0^3+a_2_4*a_2_5*b_1_0,\n", " b_3_9^2+b_1_2*b_5_20+b_1_1*b_1_2^2*b_3_8+b_1_1^2*b_1_2*b_3_9+b_1_1^3*b_3_8+b_4_14*b_1_2^2+b_4_14*b_1_1^2+a_2_5*b_4_14+a_2_4*a_2_5*b_1_0^2+a_2_4^2*a_2_5,\n", " b_1_0*b_5_20+a_2_4*b_1_0^4+a_2_4^2*b_1_0^2,\n", " b_1_2*b_5_21+b_1_2^3*b_3_9+b_1_2^3*b_3_8+b_1_1*b_5_20+b_1_1*b_1_2^2*b_3_9+b_1_1*b_1_2^2*b_3_8+b_1_1^2*b_1_2*b_3_9,\n", " b_1_0*b_5_21+a_2_4*a_2_5*b_1_0^2+a_2_4^2*b_1_0^2+a_2_4^2*a_2_5,\n", " b_3_8^2+b_1_1*b_5_21+b_1_1*b_1_2^2*b_3_9+b_1_1*b_1_2^2*b_3_8+b_1_1^2*b_1_2*b_3_9+b_4_14*b_1_2^2+a_2_4*b_4_14+a_2_4^2*b_1_0^2+a_2_4^2*a_2_5,\n", " a_2_5*b_5_20+a_2_4*b_4_14*b_1_2+a_2_4*a_2_5*b_1_0^3+a_2_4^2*a_2_5*b_1_0,\n", " a_2_5*b_5_21+a_2_4*b_5_20+a_2_4*b_4_14*b_1_2+a_2_4^2*b_1_0^3,\n", " a_2_4*b_5_21+a_2_4*b_4_14*b_1_2+a_2_4^2*a_2_5*b_1_0,\n", " b_5_20^2+b_1_2^2*b_3_8*b_5_20+b_1_1*b_1_2*b_3_8*b_5_20+b_1_1*b_1_2^3*b_3_8*b_3_9+b_1_1*b_1_2^4*b_5_20+b_1_1^2*b_1_2^2*b_3_8*b_3_9+b_1_1^2*b_1_2^3*b_5_20+b_1_1^2*b_1_2^5*b_3_9+b_1_1^2*b_1_2^5*b_3_8+b_1_1^3*b_1_2^4*b_3_9+b_1_1^4*b_1_2*b_5_20+b_1_1^4*b_1_2^3*b_3_9+b_1_1^4*b_1_2^3*b_3_8+b_1_1^5*b_1_2^2*b_3_8+b_4_14*b_1_2*b_5_20+b_4_14*b_1_2^3*b_3_8+b_4_14*b_1_2^6+b_4_14*b_1_1*b_1_2^2*b_3_9+b_4_14*b_1_1*b_1_2^2*b_3_8+b_4_14*b_1_1^3*b_1_2^3+b_4_14^2*b_1_2^2+a_2_5*b_4_14^2+a_2_4^2*b_1_0^6+a_2_4^2*a_2_5*b_1_0^4+c_8_49*b_1_2^2,\n", " b_5_20*b_5_21+b_1_2^2*b_3_9*b_5_20+b_1_2^2*b_3_8*b_5_20+b_1_1*b_1_2*b_3_9*b_5_20+b_1_1^2*b_3_9*b_5_20+b_1_1^2*b_3_8*b_5_20+b_1_1^2*b_1_2^2*b_3_8*b_3_9+b_1_1^2*b_1_2^3*b_5_20+b_1_1^3*b_1_2*b_3_8*b_3_9+b_1_1^3*b_1_2^2*b_5_20+b_1_1^3*b_1_2^4*b_3_9+b_1_1^3*b_1_2^4*b_3_8+b_1_1^4*b_1_2^3*b_3_9+b_1_1^5*b_5_20+b_1_1^5*b_1_2^2*b_3_9+b_1_1^5*b_1_2^2*b_3_8+b_1_1^6*b_1_2*b_3_8+b_4_14*b_1_1*b_5_20+b_4_14*b_1_1*b_1_2^2*b_3_8+b_4_14*b_1_1*b_1_2^5+b_4_14*b_1_1^2*b_1_2*b_3_9+b_4_14*b_1_1^2*b_1_2*b_3_8+b_4_14*b_1_1^4*b_1_2^2+b_4_14^2*b_1_1*b_1_2+a_2_5*b_4_14^2+a_2_4*b_4_14^2+c_8_49*b_1_1*b_1_2,\n", " b_5_21^2+b_1_2^5*b_5_20+b_1_1*b_1_2^6*b_3_8+b_1_1^2*b_3_8*b_5_21+b_1_1^2*b_3_8*b_5_20+b_1_1^2*b_1_2^2*b_3_8*b_3_9+b_1_1^2*b_1_2^5*b_3_9+b_1_1^2*b_1_2^5*b_3_8+b_1_1^3*b_1_2^2*b_5_20+b_1_1^3*b_1_2^4*b_3_9+b_1_1^4*b_1_2^3*b_3_8+b_1_1^5*b_5_21+b_1_1^5*b_5_20+b_1_1^7*b_3_9+b_4_14*b_1_1*b_5_21+b_4_14*b_1_1*b_1_2^2*b_3_9+b_4_14*b_1_1*b_1_2^2*b_3_8+b_4_14*b_1_1^2*b_1_2*b_3_9+b_4_14*b_1_1^2*b_1_2^4+b_4_14*b_1_1^3*b_3_8+b_4_14*b_1_1^3*b_1_2^3+b_4_14*b_1_1^5*b_1_2+b_4_14*b_1_1^6+b_4_14^2*b_1_1^2+a_2_4*b_4_14^2+c_8_49*b_1_1^2,\n", " b_3_8*b_3_9*b_5_20+b_1_2^3*b_3_9*b_5_20+b_1_2^6*b_5_20+b_1_1*b_1_2^2*b_3_8*b_5_20+b_1_1*b_1_2^4*b_3_8*b_3_9+b_1_1*b_1_2^5*b_5_20+b_1_1*b_1_2^7*b_3_9+b_1_1*b_1_2^7*b_3_8+b_1_1^2*b_1_2^3*b_3_8*b_3_9+b_1_1^2*b_1_2^4*b_5_20+b_1_1^2*b_1_2^6*b_3_9+b_1_1^3*b_3_9*b_5_20+b_1_1^3*b_1_2^5*b_3_9+b_1_1^3*b_1_2^5*b_3_8+b_1_1^4*b_1_2*b_3_8*b_3_9+b_1_1^5*b_1_2^3*b_3_9+b_1_1^6*b_5_20+b_1_1^6*b_1_2^2*b_3_8+b_1_1^7*b_1_2*b_3_9+b_10_83*b_1_2+b_4_14*b_1_2*b_3_8*b_3_9+b_4_14*b_1_2^2*b_5_20+b_4_14*b_1_2^4*b_3_8+b_4_14*b_1_2^7+b_4_14*b_1_1*b_1_2^3*b_3_9+b_4_14*b_1_1*b_1_2^6+b_4_14*b_1_1^2*b_5_20+b_4_14*b_1_1^2*b_1_2^2*b_3_8+b_4_14*b_1_1^3*b_1_2*b_3_9+b_4_14*b_1_1^3*b_1_2*b_3_8+b_4_14*b_1_1^3*b_1_2^4+b_4_14*b_1_1^5*b_1_2^2+b_4_14^2*b_1_1^2*b_1_2+a_2_4*b_4_14*b_5_20+c_8_49*b_1_1^2*b_1_2+a_2_4*c_8_49*b_1_2,\n", " b_10_83*b_1_0+a_2_4*a_2_5*b_1_0^7+c_8_49*b_1_0^3+a_2_4*c_8_49*b_1_0,\n", " b_3_8*b_3_9*b_5_21+b_1_2^3*b_3_8*b_5_20+b_1_1*b_1_2^2*b_3_9*b_5_20+b_1_1*b_1_2^2*b_3_8*b_5_20+b_1_1*b_1_2^5*b_5_20+b_1_1^2*b_1_2*b_3_9*b_5_20+b_1_1^2*b_1_2^3*b_3_8*b_3_9+b_1_1^2*b_1_2^4*b_5_20+b_1_1^2*b_1_2^6*b_3_9+b_1_1^2*b_1_2^6*b_3_8+b_1_1^3*b_3_9*b_5_21+b_1_1^3*b_3_9*b_5_20+b_1_1^3*b_1_2^5*b_3_9+b_1_1^3*b_1_2^5*b_3_8+b_1_1^4*b_1_2^2*b_5_20+b_1_1^5*b_3_8*b_3_9+b_1_1^5*b_1_2*b_5_20+b_1_1^5*b_1_2^3*b_3_9+b_1_1^6*b_5_20+b_1_1^6*b_1_2^2*b_3_9+b_1_1^8*b_3_8+b_10_83*b_1_1+b_4_14*b_1_2^4*b_3_9+b_4_14*b_1_2^4*b_3_8+b_4_14*b_1_1*b_3_8*b_3_9+b_4_14*b_1_1*b_1_2*b_5_20+b_4_14*b_1_1*b_1_2^3*b_3_9+b_4_14*b_1_1^2*b_5_21+b_4_14*b_1_1^2*b_1_2^2*b_3_8+b_4_14*b_1_1^3*b_1_2*b_3_9+b_4_14*b_1_1^3*b_1_2*b_3_8+b_4_14*b_1_1^6*b_1_2+b_4_14*b_1_1^7+b_4_14^2*b_1_1^3+a_2_4*b_4_14*b_5_20+c_8_49*b_1_1^3,\n", " a_2_5*b_10_83+a_2_4^2*a_2_5*b_1_0^6+a_2_5*c_8_49*b_1_0^2+a_2_4*a_2_5*c_8_49,\n", " a_2_4*b_10_83+a_2_4^2*a_2_5*b_1_0^6+a_2_4*c_8_49*b_1_0^2+a_2_4^2*c_8_49,\n", " b_1_2^5*b_3_9*b_5_20+b_1_2^5*b_3_8*b_5_20+b_1_2^8*b_5_20+b_1_1*b_1_2^7*b_5_20+b_1_1*b_1_2^9*b_3_9+b_1_1*b_1_2^9*b_3_8+b_1_1^2*b_1_2^3*b_3_8*b_5_20+b_1_1^2*b_1_2^6*b_5_20+b_1_1^2*b_1_2^8*b_3_9+b_1_1^3*b_1_2^2*b_3_9*b_5_20+b_1_1^3*b_1_2^5*b_5_20+b_1_1^3*b_1_2^7*b_3_9+b_1_1^4*b_1_2*b_3_9*b_5_20+b_1_1^4*b_1_2^3*b_3_8*b_3_9+b_1_1^4*b_1_2^6*b_3_9+b_1_1^5*b_3_9*b_5_20+b_1_1^5*b_1_2^3*b_5_20+b_1_1^5*b_1_2^5*b_3_9+b_1_1^5*b_1_2^5*b_3_8+b_1_1^6*b_1_2*b_3_8*b_3_9+b_1_1^6*b_1_2^2*b_5_20+b_1_1^6*b_1_2^4*b_3_9+b_1_1^8*b_5_21+b_1_1^8*b_1_2^2*b_3_9+b_1_1^9*b_1_2*b_3_8+b_1_1^10*b_3_8+b_10_83*b_3_8+b_10_83*b_1_2^3+b_4_14*b_1_2*b_3_9*b_5_20+b_4_14*b_1_2*b_3_8*b_5_20+b_4_14*b_1_2^3*b_3_8*b_3_9+b_4_14*b_1_2^4*b_5_20+b_4_14*b_1_2^9+b_4_14*b_1_1*b_3_8*b_5_21+b_4_14*b_1_1*b_1_2^3*b_5_20+b_4_14*b_1_1*b_1_2^5*b_3_8+b_4_14*b_1_1^2*b_1_2*b_3_8*b_3_9+b_4_14*b_1_1^3*b_3_8*b_3_9+b_4_14*b_1_1^4*b_1_2^2*b_3_8+b_4_14*b_1_1^4*b_1_2^5+b_4_14*b_1_1^5*b_1_2*b_3_9+b_4_14*b_1_1^5*b_1_2*b_3_8+b_4_14*b_1_1^6*b_3_9+b_4_14*b_1_1^6*b_3_8+b_4_14*b_1_1^6*b_1_2^3+b_4_14*b_1_1^8*b_1_2+b_4_14*b_1_1^9+b_4_14^2*b_1_2^2*b_3_9+b_4_14^2*b_1_2^5+b_4_14^2*b_1_1*b_1_2^4+b_4_14^2*b_1_1^2*b_3_9+b_4_14^2*b_1_1^2*b_3_8+b_4_14^2*b_1_1^2*b_1_2^3+b_4_14^2*b_1_1^3*b_1_2^2+c_8_49*b_1_1^2*b_3_9+c_8_49*b_1_1^2*b_3_8+c_8_49*b_1_1^2*b_1_2^3+a_2_4^2*c_8_49*b_1_0,\n", " b_1_2^5*b_3_9*b_5_20+b_1_2^5*b_3_8*b_5_20+b_1_1*b_1_2^7*b_5_20+b_1_1^2*b_1_2^3*b_3_9*b_5_20+b_1_1^2*b_1_2^3*b_3_8*b_5_20+b_1_1^2*b_1_2^5*b_3_8*b_3_9+b_1_1^2*b_1_2^8*b_3_8+b_1_1^3*b_1_2^4*b_3_8*b_3_9+b_1_1^4*b_1_2^4*b_5_20+b_1_1^4*b_1_2^6*b_3_9+b_1_1^4*b_1_2^6*b_3_8+b_1_1^6*b_1_2^4*b_3_9+b_1_1^7*b_3_8*b_3_9+b_1_1^7*b_1_2*b_5_20+b_1_1^7*b_1_2^3*b_3_9+b_1_1^8*b_5_20+b_1_1^8*b_1_2^2*b_3_9+b_1_1^8*b_1_2^2*b_3_8+b_1_1^9*b_1_2*b_3_9+b_1_1^10*b_3_9+b_10_83*b_3_9+b_10_83*b_1_1*b_1_2^2+b_10_83*b_1_1^2*b_1_2+b_4_14*b_1_2*b_3_9*b_5_20+b_4_14*b_1_2*b_3_8*b_5_20+b_4_14*b_1_2^3*b_3_8*b_3_9+b_4_14*b_1_2^4*b_5_20+b_4_14*b_1_2^6*b_3_9+b_4_14*b_1_2^9+b_4_14*b_1_1*b_3_9*b_5_21+b_4_14*b_1_1*b_3_8*b_5_21+b_4_14*b_1_1*b_1_2^3*b_5_20+b_4_14*b_1_1*b_1_2^5*b_3_9+b_4_14*b_1_1*b_1_2^5*b_3_8+b_4_14*b_1_1^2*b_1_2*b_3_8*b_3_9+b_4_14*b_1_1^2*b_1_2^2*b_5_20+b_4_14*b_1_1^3*b_1_2*b_5_20+b_4_14*b_1_1^3*b_1_2^3*b_3_8+b_4_14*b_1_1^4*b_5_21+b_4_14*b_1_1^4*b_1_2^2*b_3_9+b_4_14*b_1_1^4*b_1_2^2*b_3_8+b_4_14*b_1_1^4*b_1_2^5+b_4_14*b_1_1^5*b_1_2*b_3_8+b_4_14*b_1_1^5*b_1_2^4+b_4_14*b_1_1^6*b_3_9+b_4_14*b_1_1^6*b_1_2^3+b_4_14*b_1_1^7*b_1_2^2+b_4_14*b_1_1^8*b_1_2+b_4_14*b_1_1^9+b_4_14^2*b_1_1*b_1_2^4+b_4_14^2*b_1_1^2*b_3_9+b_4_14^2*b_1_1^2*b_3_8+b_4_14^2*b_1_1^2*b_1_2^3+b_4_14^2*b_1_1^3*b_1_2^2+b_4_14^2*b_1_1^5+a_2_4*b_4_14^2*b_3_9+c_8_49*b_1_2^2*b_3_8+c_8_49*b_1_2^5+c_8_49*b_1_1^2*b_3_9+c_8_49*b_1_1^2*b_1_2^3+c_8_49*b_1_1^4*b_1_2+c_8_49*b_1_1^5+a_2_4*c_8_49*b_3_9+a_2_4*a_2_5*c_8_49*b_1_0+a_2_4^2*c_8_49*b_1_0,\n", " b_1_1^3*b_1_2^4*b_3_8*b_5_20+b_1_1^3*b_1_2^6*b_3_8*b_3_9+b_1_1^3*b_1_2^7*b_5_20+b_1_1^4*b_1_2^3*b_3_9*b_5_20+b_1_1^4*b_1_2^3*b_3_8*b_5_20+b_1_1^4*b_1_2^6*b_5_20+b_1_1^4*b_1_2^8*b_3_9+b_1_1^5*b_1_2^7*b_3_8+b_1_1^6*b_1_2*b_3_9*b_5_20+b_1_1^6*b_1_2^4*b_5_20+b_1_1^6*b_1_2^6*b_3_8+b_1_1^7*b_3_8*b_5_21+b_1_1^7*b_1_2^2*b_3_8*b_3_9+b_1_1^7*b_1_2^3*b_5_20+b_1_1^8*b_1_2*b_3_8*b_3_9+b_1_1^8*b_1_2^2*b_5_20+b_1_1^8*b_1_2^4*b_3_9+b_1_1^9*b_1_2*b_5_20+b_1_1^9*b_1_2^3*b_3_9+b_1_1^10*b_5_21+b_1_1^10*b_1_2^2*b_3_9+b_1_1^10*b_1_2^2*b_3_8+b_1_1^11*b_1_2*b_3_9+b_1_1^11*b_1_2*b_3_8+b_10_83*b_5_21+b_10_83*b_1_2^2*b_3_9+b_10_83*b_1_2^2*b_3_8+b_10_83*b_1_1*b_1_2*b_3_9+b_10_83*b_1_1^2*b_1_2^3+b_10_83*b_1_1^3*b_1_2^2+b_10_83*b_1_1^4*b_1_2+b_4_14*b_1_1*b_1_2^2*b_3_9*b_5_20+b_4_14*b_1_1*b_1_2^2*b_3_8*b_5_20+b_4_14*b_1_1*b_1_2^7*b_3_9+b_4_14*b_1_1*b_1_2^10+b_4_14*b_1_1^2*b_1_2*b_3_9*b_5_20+b_4_14*b_1_1^2*b_1_2^3*b_3_8*b_3_9+b_4_14*b_1_1^2*b_1_2^4*b_5_20+b_4_14*b_1_1^2*b_1_2^6*b_3_9+b_4_14*b_1_1^3*b_3_9*b_5_21+b_4_14*b_1_1^3*b_3_8*b_5_21+b_4_14*b_1_1^3*b_3_8*b_5_20+b_4_14*b_1_1^3*b_1_2^5*b_3_9+b_4_14*b_1_1^3*b_1_2^5*b_3_8+b_4_14*b_1_1^4*b_1_2^2*b_5_20+b_4_14*b_1_1^4*b_1_2^4*b_3_9+b_4_14*b_1_1^4*b_1_2^4*b_3_8+b_4_14*b_1_1^4*b_1_2^7+b_4_14*b_1_1^5*b_3_8*b_3_9+b_4_14*b_1_1^5*b_1_2^3*b_3_9+b_4_14*b_1_1^5*b_1_2^6+b_4_14*b_1_1^6*b_5_20+b_4_14*b_1_1^6*b_1_2^2*b_3_9+b_4_14*b_1_1^6*b_1_2^5+b_4_14*b_1_1^7*b_1_2*b_3_9+b_4_14*b_1_1^7*b_1_2*b_3_8+b_4_14*b_1_1^7*b_1_2^4+b_4_14*b_1_1^8*b_3_9+b_4_14*b_1_1^8*b_3_8+b_4_14*b_1_1^8*b_1_2^3+b_4_14*b_1_1^10*b_1_2+b_4_14^2*b_1_1*b_3_8*b_3_9+b_4_14^2*b_1_1*b_1_2*b_5_20+b_4_14^2*b_1_1*b_1_2^3*b_3_9+b_4_14^2*b_1_1*b_1_2^3*b_3_8+b_4_14^2*b_1_1*b_1_2^6+b_4_14^2*b_1_1^2*b_1_2^2*b_3_8+b_4_14^2*b_1_1^3*b_1_2^4+b_4_14^2*b_1_1^4*b_3_8+b_4_14^2*b_1_1^4*b_1_2^3+b_4_14^2*b_1_1^5*b_1_2^2+b_4_14^2*b_1_1^6*b_1_2+b_4_14^2*b_1_1^7+b_4_14^3*b_1_1*b_1_2^2+b_4_14^3*b_1_1^3+a_2_4*b_4_14^3*b_1_2+c_8_49*b_1_1*b_3_8*b_3_9+c_8_49*b_1_1*b_1_2^3*b_3_9+c_8_49*b_1_1*b_1_2^6+c_8_49*b_1_1^2*b_5_21+c_8_49*b_1_1^2*b_1_2^2*b_3_9+c_8_49*b_1_1^2*b_1_2^2*b_3_8+c_8_49*b_1_1^3*b_1_2*b_3_9+c_8_49*b_1_1^3*b_1_2^4+c_8_49*b_1_1^4*b_1_2^3+c_8_49*b_1_1^5*b_1_2^2+c_8_49*b_1_1^6*b_1_2+b_4_14*c_8_49*b_1_1*b_1_2^2+b_4_14*c_8_49*b_1_1^3+a_2_4*a_2_5*c_8_49*b_1_0^3+a_2_4^2*c_8_49*b_1_0^3,\n", " b_1_1^2*b_1_2^5*b_3_8*b_5_20+b_1_1^2*b_1_2^7*b_3_8*b_3_9+b_1_1^3*b_1_2^4*b_3_9*b_5_20+b_1_1^3*b_1_2^6*b_3_8*b_3_9+b_1_1^3*b_1_2^9*b_3_8+b_1_1^4*b_1_2^3*b_3_8*b_5_20+b_1_1^4*b_1_2^5*b_3_8*b_3_9+b_1_1^5*b_1_2^4*b_3_8*b_3_9+b_1_1^5*b_1_2^7*b_3_9+b_1_1^6*b_1_2^3*b_3_8*b_3_9+b_1_1^6*b_1_2^4*b_5_20+b_1_1^7*b_3_9*b_5_20+b_1_1^7*b_3_8*b_5_21+b_1_1^7*b_3_8*b_5_20+b_1_1^7*b_1_2^2*b_3_8*b_3_9+b_1_1^7*b_1_2^3*b_5_20+b_1_1^7*b_1_2^5*b_3_8+b_1_1^8*b_1_2*b_3_8*b_3_9+b_1_1^8*b_1_2^4*b_3_8+b_1_1^9*b_3_8*b_3_9+b_1_1^9*b_1_2*b_5_20+b_1_1^9*b_1_2^3*b_3_9+b_1_1^9*b_1_2^3*b_3_8+b_1_1^11*b_1_2*b_3_9+b_1_1^12*b_3_9+b_1_1^12*b_3_8+b_10_83*b_5_21+b_10_83*b_5_20+b_10_83*b_1_2^2*b_3_9+b_10_83*b_1_1*b_1_2^4+b_10_83*b_1_1^2*b_3_9+b_10_83*b_1_1^2*b_3_8+b_10_83*b_1_1^2*b_1_2^3+b_10_83*b_1_1^3*b_1_2^2+b_4_14*b_1_2^3*b_3_9*b_5_20+b_4_14*b_1_2^3*b_3_8*b_5_20+b_4_14*b_1_2^8*b_3_9+b_4_14*b_1_2^11+b_4_14*b_1_1*b_1_2^2*b_3_8*b_5_20+b_4_14*b_1_1*b_1_2^4*b_3_8*b_3_9+b_4_14*b_1_1*b_1_2^5*b_5_20+b_4_14*b_1_1*b_1_2^10+b_4_14*b_1_1^2*b_1_2*b_3_9*b_5_20+b_4_14*b_1_1^2*b_1_2*b_3_8*b_5_20+b_4_14*b_1_1^2*b_1_2^3*b_3_8*b_3_9+b_4_14*b_1_1^2*b_1_2^6*b_3_9+b_4_14*b_1_1^2*b_1_2^6*b_3_8+b_4_14*b_1_1^3*b_3_9*b_5_20+b_4_14*b_1_1^3*b_3_8*b_5_21+b_4_14*b_1_1^3*b_1_2^5*b_3_9+b_4_14*b_1_1^3*b_1_2^5*b_3_8+b_4_14*b_1_1^3*b_1_2^8+b_4_14*b_1_1^4*b_1_2^4*b_3_9+b_4_14*b_1_1^4*b_1_2^4*b_3_8+b_4_14*b_1_1^5*b_1_2*b_5_20+b_4_14*b_1_1^6*b_5_21+b_4_14*b_1_1^6*b_5_20+b_4_14*b_1_1^6*b_1_2^2*b_3_9+b_4_14*b_1_1^6*b_1_2^5+b_4_14*b_1_1^7*b_1_2*b_3_9+b_4_14*b_1_1^7*b_1_2*b_3_8+b_4_14*b_1_1^8*b_3_9+b_4_14*b_1_1^8*b_1_2^3+b_4_14*b_1_1^10*b_1_2+b_4_14^2*b_1_2*b_3_8*b_3_9+b_4_14^2*b_1_2^2*b_5_20+b_4_14^2*b_1_2^4*b_3_9+b_4_14^2*b_1_2^4*b_3_8+b_4_14^2*b_1_2^7+b_4_14^2*b_1_1*b_3_8*b_3_9+b_4_14^2*b_1_1*b_1_2*b_5_20+b_4_14^2*b_1_1*b_1_2^3*b_3_9+b_4_14^2*b_1_1*b_1_2^6+b_4_14^2*b_1_1^2*b_1_2^2*b_3_9+b_4_14^2*b_1_1^2*b_1_2^2*b_3_8+b_4_14^2*b_1_1^3*b_1_2*b_3_8+b_4_14^2*b_1_1^4*b_3_8+b_4_14^2*b_1_1^5*b_1_2^2+b_4_14^2*b_1_1^6*b_1_2+b_4_14^3*b_1_2^3+b_4_14^3*b_1_1*b_1_2^2+b_4_14^3*b_1_1^2*b_1_2+b_4_14^3*b_1_1^3+a_2_4*b_4_14^2*b_5_20+a_2_4^2*a_2_5*b_1_0^9+c_8_49*b_1_2*b_3_8*b_3_9+c_8_49*b_1_2^4*b_3_9+c_8_49*b_1_2^7+c_8_49*b_1_1*b_3_8*b_3_9+c_8_49*b_1_1*b_1_2^3*b_3_9+c_8_49*b_1_1*b_1_2^6+c_8_49*b_1_1^2*b_5_21+c_8_49*b_1_1^2*b_5_20+c_8_49*b_1_1^2*b_1_2^2*b_3_9+c_8_49*b_1_1^2*b_1_2^2*b_3_8+c_8_49*b_1_1^4*b_3_8+c_8_49*b_1_1^7+b_4_14*c_8_49*b_1_2^3+b_4_14*c_8_49*b_1_1*b_1_2^2+b_4_14*c_8_49*b_1_1^2*b_1_2+b_4_14*c_8_49*b_1_1^3+a_2_4*c_8_49*b_5_20+a_2_4*c_8_49*b_1_0^5+a_2_4*b_4_14*c_8_49*b_1_2+a_2_4*a_2_5*c_8_49*b_1_0^3,\n", " b_10_83*b_1_2^2*b_3_9*b_5_20+b_10_83*b_1_2^5*b_5_20+b_10_83*b_1_1*b_1_2*b_3_8*b_5_20+b_10_83*b_1_1*b_1_2^4*b_5_20+b_10_83*b_1_1*b_1_2^6*b_3_9+b_10_83*b_1_1*b_1_2^6*b_3_8+b_10_83*b_1_1^2*b_3_8*b_5_20+b_10_83*b_1_1^2*b_1_2^3*b_5_20+b_10_83*b_1_1^2*b_1_2^5*b_3_9+b_10_83*b_1_1^2*b_1_2^5*b_3_8+b_10_83*b_1_1^3*b_1_2^4*b_3_8+b_10_83*b_1_1^4*b_1_2*b_5_20+b_10_83*b_1_1^4*b_1_2^3*b_3_9+b_10_83*b_1_1^4*b_1_2^3*b_3_8+b_10_83*b_1_1^4*b_1_2^6+b_10_83*b_1_1^5*b_5_20+b_10_83*b_1_1^5*b_1_2^2*b_3_8+b_10_83*b_1_1^5*b_1_2^5+b_10_83*b_1_1^6*b_1_2*b_3_8+b_10_83*b_1_1^6*b_1_2^4+b_10_83*b_1_1^7*b_3_8+b_10_83*b_1_1^10+b_10_83^2+b_4_14*b_1_2^10*b_3_8*b_3_9+b_4_14*b_1_1*b_1_2^12*b_3_8+b_4_14*b_1_1^2*b_1_2^8*b_3_8*b_3_9+b_4_14*b_1_1^2*b_1_2^11*b_3_9+b_4_14*b_1_1^3*b_1_2^10*b_3_8+b_4_14*b_1_1^3*b_1_2^13+b_4_14*b_1_1^4*b_1_2^6*b_3_8*b_3_9+b_4_14*b_1_1^5*b_1_2^3*b_3_8*b_5_20+b_4_14*b_1_1^6*b_1_2^2*b_3_9*b_5_20+b_4_14*b_1_1^6*b_1_2^2*b_3_8*b_5_20+b_4_14*b_1_1^6*b_1_2^5*b_5_20+b_4_14*b_1_1^6*b_1_2^7*b_3_9+b_4_14*b_1_1^6*b_1_2^7*b_3_8+b_4_14*b_1_1^7*b_1_2^3*b_3_8*b_3_9+b_4_14*b_1_1^7*b_1_2^6*b_3_9+b_4_14*b_1_1^8*b_3_9*b_5_21+b_4_14*b_1_1^8*b_3_9*b_5_20+b_4_14*b_1_1^8*b_3_8*b_5_20+b_4_14*b_1_1^8*b_1_2^2*b_3_8*b_3_9+b_4_14*b_1_1^8*b_1_2^3*b_5_20+b_4_14*b_1_1^8*b_1_2^5*b_3_9+b_4_14*b_1_1^9*b_1_2*b_3_8*b_3_9+b_4_14*b_1_1^10*b_1_2^6+b_4_14*b_1_1^11*b_5_21+b_4_14*b_1_1^11*b_1_2^2*b_3_9+b_4_14*b_1_1^11*b_1_2^2*b_3_8+b_4_14*b_1_1^11*b_1_2^5+b_4_14*b_1_1^12*b_1_2*b_3_9+b_4_14*b_1_1^12*b_1_2^4+b_4_14*b_1_1^13*b_3_9+b_4_14*b_1_1^13*b_3_8+b_4_14*b_1_1^15*b_1_2+b_4_14*b_10_83*b_1_2^3*b_3_9+b_4_14*b_10_83*b_1_2^3*b_3_8+b_4_14*b_10_83*b_1_2^6+b_4_14*b_10_83*b_1_1*b_1_2^5+b_4_14*b_10_83*b_1_1^2*b_1_2*b_3_9+b_4_14*b_10_83*b_1_1^2*b_1_2^4+b_4_14*b_10_83*b_1_1^3*b_3_8+b_4_14*b_10_83*b_1_1^3*b_1_2^3+b_4_14*b_10_83*b_1_1^5*b_1_2+b_4_14^2*b_1_2^4*b_3_9*b_5_20+b_4_14^2*b_1_2^9*b_3_9+b_4_14^2*b_1_2^12+b_4_14^2*b_1_1*b_1_2^3*b_3_9*b_5_20+b_4_14^2*b_1_1*b_1_2^3*b_3_8*b_5_20+b_4_14^2*b_1_1*b_1_2^5*b_3_8*b_3_9+b_4_14^2*b_1_1*b_1_2^6*b_5_20+b_4_14^2*b_1_1*b_1_2^8*b_3_9+b_4_14^2*b_1_1^2*b_1_2^2*b_3_9*b_5_20+b_4_14^2*b_1_1^2*b_1_2^4*b_3_8*b_3_9+b_4_14^2*b_1_1^2*b_1_2^5*b_5_20+b_4_14^2*b_1_1^2*b_1_2^7*b_3_9+b_4_14^2*b_1_1^2*b_1_2^7*b_3_8+b_4_14^2*b_1_1^3*b_1_2*b_3_9*b_5_20+b_4_14^2*b_1_1^3*b_1_2*b_3_8*b_5_20+b_4_14^2*b_1_1^3*b_1_2^6*b_3_9+b_4_14^2*b_1_1^3*b_1_2^6*b_3_8+b_4_14^2*b_1_1^4*b_3_9*b_5_20+b_4_14^2*b_1_1^4*b_1_2^2*b_3_8*b_3_9+b_4_14^2*b_1_1^5*b_1_2*b_3_8*b_3_9+b_4_14^2*b_1_1^5*b_1_2^2*b_5_20+b_4_14^2*b_1_1^5*b_1_2^4*b_3_8+b_4_14^2*b_1_1^5*b_1_2^7+b_4_14^2*b_1_1^6*b_3_8*b_3_9+b_4_14^2*b_1_1^6*b_1_2*b_5_20+b_4_14^2*b_1_1^6*b_1_2^3*b_3_9+b_4_14^2*b_1_1^6*b_1_2^3*b_3_8+b_4_14^2*b_1_1^7*b_1_2^2*b_3_9+b_4_14^2*b_1_1^7*b_1_2^2*b_3_8+b_4_14^2*b_1_1^7*b_1_2^5+b_4_14^2*b_1_1^8*b_1_2^4+b_4_14^2*b_1_1^9*b_3_8+b_4_14^2*b_1_1^9*b_1_2^3+b_4_14^2*b_1_1^11*b_1_2+b_4_14^2*b_1_1^12+b_4_14^3*b_1_2^3*b_5_20+b_4_14^3*b_1_2^5*b_3_8+b_4_14^3*b_1_2^8+b_4_14^3*b_1_1*b_1_2^4*b_3_8+b_4_14^3*b_1_1^2*b_1_2^6+b_4_14^3*b_1_1^3*b_1_2^2*b_3_8+b_4_14^3*b_1_1^3*b_1_2^5+b_4_14^3*b_1_1^4*b_1_2*b_3_8+b_4_14^3*b_1_1^4*b_1_2^4+b_4_14^3*b_1_1^5*b_3_9+b_4_14^3*b_1_1^5*b_3_8+b_4_14^3*b_1_1^5*b_1_2^3+b_4_14^3*b_1_1^7*b_1_2+b_4_14^4*b_1_1^4+c_8_49*b_1_2^4*b_3_8*b_5_20+c_8_49*b_1_2^6*b_3_8*b_3_9+c_8_49*b_1_1*b_1_2^5*b_3_8*b_3_9+c_8_49*b_1_1*b_1_2^8*b_3_8+c_8_49*b_1_1^2*b_1_2^2*b_3_9*b_5_20+c_8_49*b_1_1^2*b_1_2^2*b_3_8*b_5_20+c_8_49*b_1_1^2*b_1_2^4*b_3_8*b_3_9+c_8_49*b_1_1^2*b_1_2^7*b_3_9+c_8_49*b_1_1^3*b_1_2^3*b_3_8*b_3_9+c_8_49*b_1_1^3*b_1_2^6*b_3_9+c_8_49*b_1_1^3*b_1_2^6*b_3_8+c_8_49*b_1_1^3*b_1_2^9+c_8_49*b_1_1^4*b_3_8*b_5_21+c_8_49*b_1_1^4*b_3_8*b_5_20+c_8_49*b_1_1^4*b_1_2^8+c_8_49*b_1_1^5*b_1_2*b_3_8*b_3_9+c_8_49*b_1_1^5*b_1_2^2*b_5_20+c_8_49*b_1_1^5*b_1_2^4*b_3_9+c_8_49*b_1_1^5*b_1_2^4*b_3_8+c_8_49*b_1_1^5*b_1_2^7+c_8_49*b_1_1^6*b_1_2*b_5_20+c_8_49*b_1_1^6*b_1_2^6+c_8_49*b_1_1^7*b_5_21+c_8_49*b_1_1^7*b_1_2^2*b_3_9+c_8_49*b_1_1^7*b_1_2^2*b_3_8+c_8_49*b_1_1^7*b_1_2^5+c_8_49*b_1_1^8*b_1_2*b_3_8+c_8_49*b_1_1^9*b_3_9+c_8_49*b_1_1^10*b_1_2^2+c_8_49*b_1_1^12+b_4_14*c_8_49*b_1_2^3*b_5_20+b_4_14*c_8_49*b_1_2^5*b_3_9+b_4_14*c_8_49*b_1_2^5*b_3_8+b_4_14*c_8_49*b_1_2^8+b_4_14*c_8_49*b_1_1*b_1_2^4*b_3_9+b_4_14*c_8_49*b_1_1*b_1_2^4*b_3_8+b_4_14*c_8_49*b_1_1*b_1_2^7+b_4_14*c_8_49*b_1_1^2*b_1_2*b_5_20+b_4_14*c_8_49*b_1_1^2*b_1_2^3*b_3_9+b_4_14*c_8_49*b_1_1^2*b_1_2^3*b_3_8+b_4_14*c_8_49*b_1_1^3*b_5_21+b_4_14*c_8_49*b_1_1^3*b_1_2^2*b_3_9+b_4_14*c_8_49*b_1_1^3*b_1_2^2*b_3_8+b_4_14*c_8_49*b_1_1^4*b_1_2*b_3_9+b_4_14*c_8_49*b_1_1^5*b_3_9+b_4_14*c_8_49*b_1_1^5*b_3_8+b_4_14*c_8_49*b_1_1^6*b_1_2^2+b_4_14^2*c_8_49*b_1_2^4+c_8_49^2*b_1_1^2*b_1_2^2+c_8_49^2*b_1_1^4+c_8_49^2*b_1_0^4+a_2_4^2*c_8_49^2]\n", " \n" ] } ], "source": [ "H128gp934\n", "print H128gp934" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Modular cohomology rings can be quite complicated. Our \"worst\" example: $H^*(Sz(8),\\mathbb F_2)$, whose *minimal* ring representation is formed by 109 generators up to degree 29, and 4790 relations up to degree 58.\n", "\n", "##### Computation from scratch\n", "\n", "If the ring can not be found in the sources or if the user explicitly requests a computation from scratch, only the basic setup of the ring is computed. However, the ring structure is only computed upon request, as it may take very long in some examples:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "CohomologyRing.global_options('warn') # stop logging\n", "HE27 = CohomologyRing(27,3)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "H^*(E27; GF(3))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Cohomology ring of Extraspecial 3-group of order 27 and exponent 3 with coefficients in GF(3)\n", "\n", "Computed up to degree 0\n", "Minimal list of generators:\n", "[]\n", "Minimal list of algebraic relations:\n", "[]\n", " \n" ] } ], "source": [ "HE27 # show a brief description\n", "print HE27 # show the ring structure obtained so far" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's compute the ring structure. The ring structure will be discovered in increasing degree, based on an incremental computation of a minimal projective resolution, and eventually a completeness criterion tells that the computation can be stopped:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "HE27.make()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Behind the scenes, a minimal projective resolution is computed using software of David Green. It is based on some kind of *signed standard bases*.\n", "\n", "S.K. formulated a non-commutative version of Jean-Charles Faugère's $\\mathrm F_5$ algorithm. The $\\mathrm F_5$ signature contains more information than the Green signature. It should both be faster and yield more detailed information. **TODO:** Implement it!" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Cohomology ring of Extraspecial 3-group of order 27 and exponent 3 with coefficients in GF(3)\n", "\n", "Computation complete\n", "Minimal list of generators:\n", "[b_2_0: 2-Cocycle in H^*(E27; GF(3)),\n", " b_2_1: 2-Cocycle in H^*(E27; GF(3)),\n", " b_2_2: 2-Cocycle in H^*(E27; GF(3)),\n", " b_2_3: 2-Cocycle in H^*(E27; GF(3)),\n", " c_6_8: 6-Cocycle in H^*(E27; GF(3)),\n", " a_1_0: 1-Cocycle in H^*(E27; GF(3)),\n", " a_1_1: 1-Cocycle in H^*(E27; GF(3)),\n", " a_3_4: 3-Cocycle in H^*(E27; GF(3)),\n", " a_3_5: 3-Cocycle in H^*(E27; GF(3))]\n", "Minimal list of algebraic relations:\n", "[a_1_0*a_1_1,\n", " b_2_1*a_1_0-b_2_0*a_1_1,\n", " b_2_2*a_1_1+b_2_1*a_1_1-b_2_0*a_1_1,\n", " b_2_2*a_1_0-b_2_1*a_1_1+b_2_0*a_1_1,\n", " b_2_3*a_1_0-b_2_0*a_1_1,\n", " -b_2_1^2+b_2_0*b_2_2+b_2_0*b_2_1,\n", " -b_2_2^2+b_2_1*b_2_3+b_2_1*b_2_2-b_2_1^2,\n", " -b_2_1*b_2_2-b_2_1^2+b_2_0*b_2_3,\n", " -b_2_2^2+b_2_1*b_2_2+a_1_1*a_3_4,\n", " -b_2_1*b_2_2-b_2_1^2+b_2_0*b_2_1+a_1_0*a_3_4,\n", " -b_2_2*b_2_3+b_2_2^2+a_1_1*a_3_5,\n", " -b_2_2^2-b_2_1^2+b_2_0*b_2_1+a_1_0*a_3_5,\n", " b_2_3*a_3_4-b_2_1*a_3_4,\n", " -b_2_2*a_3_4+b_2_1*a_3_5+b_2_1*a_3_4+b_2_0*b_2_1*a_1_1-b_2_0^2*a_1_1,\n", " -b_2_1*a_3_4+b_2_0*a_3_5-b_2_0*a_3_4-b_2_0*b_2_1*a_1_1+b_2_0^2*a_1_1,\n", " b_2_2*a_3_5+b_2_0*b_2_1*a_1_1-b_2_0^2*a_1_1,\n", " a_3_4*a_3_5+b_2_0*a_1_1*a_3_5+b_2_0*a_1_0*a_3_5-b_2_0*a_1_0*a_3_4]\n", " \n" ] } ], "source": [ "print HE27" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen, the ring can be presented in degree $6$. However, the completeness of the ring structure could only been proved after computing till degree 7:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "6" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "7" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HE27.last_interesting_degree()\n", "HE27.knownDeg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Non-primepower groups\n", "\n", "For non-primepower groups, we compute the cohomology ring as a sub-ring of the cohomology ring of the Sylow $p$-subgroup determined by \"stability conditions\" associated with the double cosets of a subgroup (Cartan-Eilenberg)." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "A8 = libgap.AlternatingGroup(8)\n", "SylA8 = A8.SylowSubgroup(2).MinimalGeneratingSet().Group()\n", "HA8 = CohomologyRing(A8, prime=2, GroupName=\"A_8\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is possible to set up the stability conditions by providing a tower of subgroups starting with the Sylow $p$-subgroups.\n", "\n", "**TODO** Make it possible to compute the cohomology of a fusion system!" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "HA8_direct = CohomologyRing.from_subgroup_tower(SylA8, A8, GroupName=\"A8\", GroupDescr='AlternatingGroup(8)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How do the two computations differ? Actually the first (default) computation involves the computation of *yet another* group, namely of the normaliser of the centre of the Sylow 2-subgroup." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "H^*(SmallGroup(192,1493); GF(2))" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HA8.subgroup_cohomology()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "False" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HA8.subgroup_cohomology() is HA8.sylow_cohomology()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 192, 1493 ]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HA8.group().Normalizer(HA8.sylow_subgroup().Centre()).IdGroup()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The point is that the total number of stability conditions to be satisfied is significantly less when an intermediate subgroup is used:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "5" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(HA8._PtoPcapCPdirect) + len(HA8.subgroup_cohomology()._PtoPcapCPdirect)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "18" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(HA8_direct._PtoPcapCPdirect)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's compute the ring structure in both cases. The \"direct\" use of the stable element method is slower, because more stability conditions are involved.\n", "\n", "Again, the computation explores the ring structure in increasing degree. However, no resolution is computed. Instead, we use Singular to represent cohomology rings of subgroups and induced maps." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 8.81 s, sys: 1.76 s, total: 10.6 s\n", "Wall time: 16.1 s\n" ] } ], "source": [ "%time HA8.make()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 11.8 s, sys: 2.35 s, total: 14.1 s\n", "Wall time: 19.6 s\n" ] } ], "source": [ "%time HA8_direct.make()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to compute the mod-2 cohomology of the third Conway group (joint work with David Green and Graham Ellis, 2011), we needed to use a tower of four intermediate subgroups. This cuts down the number of stability conditions from 484,680 to 11.\n", "\n", "We computed two *different* ring presentations of the cohomology ring of $\\mathbb A_8$, but in fact we will demonstrate below that the two rings are isomorphic." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Cohomology ring of A_8 with coefficients in GF(2)\n", "\n", "Computation complete\n", "Minimal list of generators:\n", "[b_2_0: 2-Cocycle in H^*(A_8; GF(2)),\n", " c_4_1: 4-Cocycle in H^*(A_8; GF(2)),\n", " b_6_1: 6-Cocycle in H^*(A_8; GF(2)),\n", " b_6_2: 6-Cocycle in H^*(A_8; GF(2)),\n", " b_3_0: 3-Cocycle in H^*(A_8; GF(2)),\n", " b_3_1: 3-Cocycle in H^*(A_8; GF(2)),\n", " b_5_2: 5-Cocycle in H^*(A_8; GF(2)),\n", " b_7_5: 7-Cocycle in H^*(A_8; GF(2)),\n", " b_7_6: 7-Cocycle in H^*(A_8; GF(2))]\n", "Minimal list of algebraic relations:\n", "[b_3_0*b_3_1,\n", " b_3_0*b_5_2,\n", " b_2_0*b_7_5,\n", " b_2_0*b_7_6,\n", " b_6_1*b_3_0,\n", " b_6_2*b_3_0,\n", " b_3_0*b_7_5,\n", " b_3_0*b_7_6,\n", " b_3_1*b_7_5,\n", " b_3_1*b_7_6,\n", " b_5_2^2+b_2_0*b_3_1*b_5_2+b_2_0^2*b_6_2+c_4_1*b_3_1^2,\n", " b_6_1*b_6_2+b_6_1^2+b_2_0^2*b_3_1*b_5_2+b_2_0^3*b_6_2+c_4_1*b_3_1*b_5_2+b_2_0*c_4_1*b_3_1^2+b_2_0*c_4_1*b_6_2,\n", " b_5_2*b_7_5,\n", " b_5_2*b_7_6,\n", " b_6_1*b_7_6+b_6_1*b_7_5,\n", " b_6_2*b_7_5+b_6_1*b_7_5,\n", " b_7_5*b_7_6+b_7_5^2]\n", " \n" ] } ], "source": [ "print HA8" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Cohomology ring of AlternatingGroup(8) with coefficients in GF(2)\n", "\n", "Computation complete\n", "Minimal list of generators:\n", "[b_2_0: 2-Cocycle in H^*(A8; GF(2)),\n", " c_4_1: 4-Cocycle in H^*(A8; GF(2)),\n", " b_6_3: 6-Cocycle in H^*(A8; GF(2)),\n", " b_6_5: 6-Cocycle in H^*(A8; GF(2)),\n", " b_3_0: 3-Cocycle in H^*(A8; GF(2)),\n", " b_3_1: 3-Cocycle in H^*(A8; GF(2)),\n", " b_5_1: 5-Cocycle in H^*(A8; GF(2)),\n", " b_7_5: 7-Cocycle in H^*(A8; GF(2)),\n", " b_7_6: 7-Cocycle in H^*(A8; GF(2))]\n", "Minimal list of algebraic relations:\n", "[b_3_0*b_3_1,\n", " b_3_1*b_5_1,\n", " b_2_0*b_7_5,\n", " b_2_0*b_7_6,\n", " b_6_3*b_3_1+b_2_0*c_4_1*b_3_1,\n", " b_6_5*b_3_1,\n", " b_3_0*b_7_5,\n", " b_3_0*b_7_6,\n", " b_3_1*b_7_5,\n", " b_3_1*b_7_6,\n", " b_5_1^2+b_2_0*b_3_0*b_5_1+b_2_0^2*b_6_5+c_4_1*b_3_0^2,\n", " b_3_0^4+b_6_5*b_3_0^2+b_6_3*b_6_5+b_6_3^2+b_2_0^2*b_3_0*b_5_1+b_2_0^3*b_6_5+c_4_1*b_3_0*b_5_1+b_2_0*c_4_1*b_3_0^2+b_2_0^2*c_4_1^2,\n", " b_5_1*b_7_5,\n", " b_5_1*b_7_6,\n", " b_6_3*b_7_6+b_6_3*b_7_5,\n", " b_6_5*b_7_5+b_6_3*b_7_5,\n", " b_7_5*b_7_6+b_7_5^2]\n", " \n" ] } ], "source": [ "print HA8_direct" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Invariants\n", "\n", "p_group_cohomology can compute various invariants, such as Poincaré series or depth:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(t^10 - t^9 + 2*t^8 - t^6 + t^5 + t^2 + 1)/(t^13 - 3*t^12 + 4*t^11 - 4*t^10 + 3*t^9 - t^8 - t^5 + 3*t^4 - 4*t^3 + 4*t^2 - 3*t + 1)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "2" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H128gp934.poincare_series()\n", "H128gp934.depth()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$a$-invariants and \"filter degree type\" are defined in terms of the local cohomology of a cohomology ring $R$, and can be computed using \"filter regular parameters\".\n", "\n", "**Def** $a^i_{\\mathfrak m}(R) := \\max\\{m\\mid H^{i,m}_{\\mathfrak m}(R)\\not=0\\}$, where $\\mathfrak m\\subset R$ is the irrelevant ideal of $R$.\n", "\n", "Using methods of D. Benson (improved by D. Green and S.K.), one can compute elements of the cohomology ring that are guaranteed to form a filter regular sequence (idea: Elements that simultaneously restrict to powers of Dickson elements in the cohomology of maximal elementary abelian subgroups)." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['c_8_49', 'b_1_2^4+b_1_1*b_3_8+b_1_1^2*b_1_2^2+b_1_1^4+b_1_0^4+b_4_14', 'b_1_1*b_1_2^2*b_3_8+b_1_1^2*b_1_2*b_3_8+b_1_1^2*b_1_2^4+b_1_1^3*b_3_8+b_1_1^4*b_1_2^2+b_4_14*b_1_2^2+b_4_14*b_1_1*b_1_2+b_4_14*b_1_1^2', 'b_1_2']\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "[-Infinity, -Infinity, -3, -5, -4]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "[-1, -2, -3, -4, -4]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print H128gp934.filter_regular_parameters()\n", "H128gp934.a_invariants()\n", "H128gp934.filter_degree_type()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The strong form of *Benson's regularity conjecture* states that the filter degree type of $H^*(G;\\mathbb F_p)$ is always of that form. The conjecture holds,\n", " - if the Krull dimension exceeds the depths of the cohomology ring be not more that two (D. Benson, 2004), or\n", " - if $|G|<256$ (D. Green, 2008), or\n", " - if $G = SmallGroup(256,299)$ (S.K., 2019); here, $\\dim(H^*)-\\mathrm{depth}(H^*)=4$.\n", " \n", "Poincaré series is useful to compute $a$-invariants and filter degree type. However, in some of our examples, no software available in SageMath could compute the Poincaré series, and thus we eventually provided a new implementation in the SageMath library.\n", "\n", "#### Completeness criteria\n", "\n", "$H^*(G;\\mathbb F_p)$ is approximated in increasing degree $d$. Typically, one constructs elements of the ring approximation over which the *full* cohomology ring is guaranteed to be finite. For some of the criteria, these elements have to be algebraically independent or form a filter regular sequence. Then, some algebraic properties need to be verified, and then completeness is guaranteed if $d$ is large enough wrt. the deree sum of the parameters.\n", "\n", "The following criteria are used to prove that the degree-$d$ approximation actually is isomorphic to the cohomology ring:\n", " - Benson's criterion with improvements of D. Green and S.K., using the filter degree type of the ring approximation and the degree of filter regular parameters over field extensions.\n", " - Symonds' criterion, which relies on P. Symonds' proof of the weak form of Benson's regularity conjecture. This very often is the best criterion.\n", " - If $G$ is not a prime power group:\n", " - Show that there will be no generators in higher degrees (using Nakayama lemma).\n", " - Use Poincaré series to prove that all relations have been found (S.K. based on an idea of P. Symonds')." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Induced homomorphisms, essential ideals, bar codes\n", "\n", "#### Essential ideal\n", "p_group_cohomology can compute the essential ideal of a cohomology ring. This is computationally difficult, since it relies on Gröbner basis computations in elimination order. The following is one of only two known examples in which the square of the essential ideal does not vanish." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a_1_0^4,\n", "a_1_0^3*a_1_1,\n", "a_1_0^3*a_1_2,\n", "a_1_0^3*a_1_3,\n", "a_1_0^2*a_1_1^2,\n", "a_1_0^2*a_1_1*a_1_2,\n", "a_1_0^2*a_1_1*a_1_3,\n", "a_1_0^2*a_1_2*a_1_3,\n", "a_4_8*a_1_1^2+a_4_8*a_1_0*a_1_1,\n", "a_4_8*a_1_1*a_1_2+a_4_8*a_1_0*a_1_3+a_4_8*a_1_0*a_1_1,\n", "a_4_8*a_1_1*a_1_3+a_4_8*a_1_0*a_1_3+a_4_8*a_1_0^2,\n", "a_4_8*a_1_0^3,\n", "a_4_8*a_1_0^2*a_1_1,\n", "a_4_8*a_1_0^2*a_1_2,\n", "a_4_8*a_1_0^2*a_1_3,\n", "a_4_8*a_1_0*a_1_2*a_1_3,\n", "a_6_8*a_1_0^2,\n", "a_6_8*a_1_0*a_1_1,\n", "a_6_8*a_1_0*a_1_2,\n", "a_6_8*a_1_0*a_1_3,\n", "a_6_8*a_1_1^2,\n", "a_6_8*a_1_1*a_1_2,\n", "a_6_8*a_1_1*a_1_3,\n", "a_6_8*a_1_2*a_1_3,\n", "a_4_8*a_6_12+a_4_8*a_6_11+a_4_8*a_6_9+a_4_8*a_6_8,\n", "a_4_8*a_6_13+a_4_8*a_6_11+a_4_8*a_6_10+a_4_8*a_6_8,\n", "a_4_8*a_6_8*a_1_0,\n", "a_4_8*a_6_8*a_1_1,\n", "a_4_8*a_6_8*a_1_2,\n", "a_4_8*a_6_8*a_1_3,\n", "a_4_8*a_6_9*a_1_1,\n", "a_4_8*a_6_9*a_1_2,\n", "a_4_8*a_6_9*a_1_3,\n", "a_4_8*a_6_11*a_1_3\n" ] } ], "source": [ "H64gp245 = CohomologyRing(64, 245)\n", "I = H64gp245.essential_ideal()\n", "print I" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a_4_8*a_6_8*a_1_0^3*a_1_3\n" ] } ], "source": [ "print (I*I).NF('std(0)').interred()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Induced homomorphisms\n", "We create one of the essential classes and the resctriction map to one of the maximal subgroups" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "(a_1_0)**4: 4-Cocycle in H^*(Syl2(U3(4)); GF(2))" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "4-Cocycle in H^*(Syl2(U3(4)); GF(2)),\n", "represented by\n", "[1 0 0 0 0 0 0 0 0 0 0 0]\n" ] } ], "source": [ "c = H64gp245.15^4\n", "c\n", "print c" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[ 32, 32 ]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G = H64gp245.group()\n", "S0 = G.MaximalSubgroups()\n", "S0.IdGroup()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When creating an induced homomorphism, the generators of the groups must much those that are used in the cohomology ring. So, we need to choose different generators for the maximal subgroup:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "phi^*\n", "defined by\n", "[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n" ] } ], "source": [ "iso = libgap.SmallGroup(32,32).IsomorphismGroups(S0)\n", "S = libgap.Group([iso.Image(x) for x in iso.Source().GeneratorsOfGroup()])\n", "phi = S.GroupHomomorphismByImagesNC(G, S.GeneratorsOfGroup(), S.GeneratorsOfGroup())\n", "phi.SetName('phi')\n", "phi_star = H64gp245.hom(phi, CohomologyRing(32,32))\n", "print phi_star" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"As usual\", the image is only explicitly computed when requested:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "phi^*((a_1_0)**4): 4-Cocycle in H^*(SmallGroup(32,32); GF(2))" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "'0'" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c_ = phi_star(c);\n", "c_ # TODO: Fix a small bug in the LaTeX representation!\n", "c_.as_polynomial()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not all elements are mapped to zero:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "c_4_5*a_1_1*a_1_2+c_4_5*a_1_0^2+c_4_4*a_1_1*a_1_2: 6-Cocycle in H^*(SmallGroup(32,32); GF(2))" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phi_star.codomain().element_as_polynomial(phi_star(H64gp245.7))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can compute pre-images and kernels of induced homomorphisms (caveat: The result is given in Singular; better user interface?):" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "a_1_0: 1-Cocycle in H^*(SmallGroup(32,32); GF(2))" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "a_1_3+a_1_2\n", "\n", "a_1_2+a_1_1,\n", "a_1_1^2+a_1_0*a_1_3+a_1_0*a_1_1,\n", "a_1_0^2*a_1_1,\n", "a_1_0*a_1_1*a_1_3+a_1_0^3,\n", "a_1_0^4,\n", "a_1_0^3*a_1_3,\n", "a_4_9*a_1_1+a_4_8*a_1_3,\n", "a_4_9*a_1_3+a_4_8*a_1_0,\n", "a_4_8*a_1_0*a_1_1,\n", "a_4_8*a_1_0*a_1_3,\n", "a_4_8*a_1_1*a_1_3+a_4_8*a_1_0^2,\n", "a_4_8*a_1_0^3,\n", "a_6_9*a_1_3+a_6_9*a_1_1+a_6_8*a_1_0,\n", "a_6_10*a_1_3+a_6_9*a_1_1+a_6_8*a_1_3+a_6_8*a_1_1,\n", "a_6_11*a_1_3+a_6_9*a_1_1+a_6_8*a_1_3+a_6_8*a_1_1+a_6_8*a_1_0,\n", "a_6_12*a_1_3+a_6_8*a_1_1,\n", "a_6_8*a_1_0^2,\n", "a_6_8*a_1_0*a_1_1,\n", "a_6_8*a_1_0*a_1_3,\n", "a_6_8*a_1_1*a_1_3,\n", "a_4_8*a_6_10,\n", "a_4_8*a_6_11+a_4_8*a_6_9+a_4_8*a_6_8,\n", "a_4_8*a_6_12,\n", "a_4_8*a_6_13+a_4_8*a_6_9,\n", "a_4_8*a_6_14+a_4_8*a_6_9+a_4_8*a_6_8,\n", "a_4_8*a_6_15,\n", "a_4_8*a_6_8*a_1_0,\n", "a_4_8*a_6_8*a_1_1,\n", "a_4_8*a_6_8*a_1_3,\n", "a_4_8*a_6_9*a_1_1\n" ] } ], "source": [ "phi_star.codomain().3\n", "print phi_star.preimage(phi_star.codomain().3)\n", "print\n", "print phi_star.kernel()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Verify the given preimage of a_1_0:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "a_1_3+a_1_2: 1-Cocycle in H^*(Syl2(U3(4)); GF(2))" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "a_1_0: 1-Cocycle in H^*(SmallGroup(32,32); GF(2))" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pre_im = H64gp245('a_1_3+a_1_2'); pre_im\n", "phi_star.codomain().element_as_polynomial(phi_star(pre_im))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Bar codes (G. Ellis, S.K., 2010)\n", "Given a normal series, the inclusion of subgroups and the quotient maps give rise to a sequence of group homomorphisms and thus a sequence of induced homomorphisms. Therefore, the notion of *persistant cohomology* applies: One may ask how many cohomology classes are not mapped to zero when applying the maps.\n", "\n", "It turns out that some groups of the same order whose cohomology rings have the same generator degrees and the same Poincaré series may still be distinguished using the bar codes associated with the upper central series:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "H64gp158 = CohomologyRing(64,158)\n", "H64gp160 = CohomologyRing(64,160)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "True" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "False" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H64gp158.poincare_series() == H64gp160.poincare_series()\n", "B158 = H64gp158.bar_code('UpperCentralSeries')\n", "B160 = H64gp160.bar_code('UpperCentralSeries')\n", "B158 == B160\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In fact, the difference can easily be seen in degree 3: The composition of two induced homomorphisms is always zero in one example, but not in the other example." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3X9s3PV9x/GX+01j8j3OXl0gF5eQRRVQmURRQm9QCgVG79poC4RQFYaaBmmK1ukcyUrZWnTaCFJNCtqqavOhrf4DBpRqkyBZNirVpzU/NtFuHherKe5YpmakXbGzYeT74WAg3P741L9957vk+73v9z73fEiW4s997r4ff/ut/eLz+X7fn7ZyuVwWAAAAmt6Hgh4AAAAAvEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAFivXC4rn8+rXC4HPRQA8BXBDoD1CoWCOjs7VSgUgh4KAPhqVdADAAAAsFmhIGWz0sSE1NUlJRJSNOrPsQh2AAAAPiiVpHRaGhyUpqbm2l1X2rtX6u+XIhFvj9lW5qYTAJbL5/Pq7OzU5OSkOjo6gh4OgBZQKkl33inlctKFC0tfdxxp2zbp6FFvwx332AEAAHgsna4c6iTTnsuZfl5ixg6A9ZixA9BIhYIUiy1cfq3EdaXxcenyy705NjN2AAAAHspmawt1kuk3NOTdsQl2AKyVyWTU09OjeDwe9FAAtJCJCX/7V0OwA2CtVCql0dFRDQ8PBz0UAC2kq8vf/tUQ7AAAADyUSJh752rhulIy6d2xCXYAAAAeikZNnTrHqd7PcUw/rx6ckHgqFkAL4KlYAI1GHTsAAABLRCImtPX2Ll2WdV3T7nWok5ixA9ACmLEDEKRi0ZQ0mdkrNpn0dvl1PoIdAOsR7AC0CpZiAQAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACyxKugBAAAA2KxQkLLZuXIniYTZncIPBDsAAAAflEpSOi0NDkpTU3Ptrmu2Euvvp0AxANSNOnYAGo0txQAAACyRTlcOdZJpz+VMPy8xYwfAeszYAWikQkGKxRYuv1biutL4uHdbjDFjBwAA4KFstrZQJ5l+Q0PeHZtgB8BamUxGPT09isfjQQ8FQAuZmPC3fzUEOwDWSqVSGh0d1fDwcNBDAdBCurr87V8NwQ4AAMBDiYS5d64Wrislk94dm2AHAADgoWjU1KlznOr9HMf08+rBCYmnYgG0AJ6KBdBo1LEDAACwRCRiQltv79JlWdc17V6HOokZOwAtgBk7AEEqFk1Jk5m9YpNJb5df5yPYAbAewQ5Aq2ApFgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASq4IeAAAAYVYoSNnsXKmKRMLsLADUqpHXEMEOAIBllEpSOi0NDkpTU3Ptrmu2gerv9764LOwSxDVEHTsA1qOOHeoV1HZQsAdbigEAEBLpdOU/yJJpz+VMP2A5QV1DzNgBsB4zdqhHoSDFYguXzipxXWl83L/todCcgryGuMcOAIB5stna/iBLpt+GDdKaNf6OCc3l/Pn6rqGhIWnXLm+OTbADYK1MJqNMJqMLldZCgGVMTPjbH1jMy2uIYAfAWqlUSqlUanYpFqhFV1f9/Zmxw3znz9cX1uq95qoh2AEAME8iYe57qvX+qDfe4B47LFTvPXbJpHfH5qlYAADmiUZNjTHHqd7PcUw/Qh0WC/Ia4qlYANbjqVjUizp2uFTUsQMAICQiEfMHt7fXLJXN57qmnVCHaoK6hpixA2A9ZuxwKYpFU45iZp/PZJLlV9SnkdcQwQ6A9Qh2AFoFS7EAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAlmBLMQAAqigUpGx2rlRFImF2FgBq1chriBk7AIE6ePCg4vG4otGorrrqKu3cuVOvv/76gj7T09Pat2+frrjiCkUiEd1999365S9/GdCI0SpKJamvz+z5ed99Zuun++4z3/f1mdeBaoK4hqhjByBQn//85/XAAw8oHo/r/fffVzqd1qlTpzQ6OqrIr0uy/+Ef/qH+4R/+Qc8884w++tGP6qtf/aomJib06quvyllpM0ZRxw71Y0sxXKqgriGCHYBQ+d///V9dddVVOn78uD7zmc9ocnJSV155pZ577jndf//9kqRf/epXWr9+vb7//e/rc5/73IqfSbBDvfr6pIGB5f8gz3Acsy3Ut7/duHGheQR1DbEUCyBUJicnJUldXV2SpFdffVXvvfeeksnkbJ/u7m5t2rRJr7zySiBjhN0KBWlwsPofZMm8PjhotosC5gvyGuLhCQChUS6XtX//ft16663atGmTJGlsbEyrV6/WRz7ykQV9165dq7GxsWU/Z3p6WtPT07Pf5/N5/wYN62Sz0tRUbX2npqQNG6Q1a/wdE5rL+fP1XUNDQ9KuXd4cm2AHIDR6e3v1k5/8RP/yL/+yYt9yuay2trZlXzt48KAee+wxr4eHFjEx4W9/YDEvryGCHYBQ2Ldvn44cOaITJ07o6quvnm2PxWJ699139fbbby+YtTt37pxuueWWZT/rkUce0f79+2e/z+fzWr9+vX+Dh1V+fRdAXf2ZscN858/XF9bqveaqIdgBCFS5XNa+fft06NAhHTt2TBs3blzw+o033qgPf/jDymaz+uIXvyhJevPNN/XTn/5UTz755LKf2d7ervb2dt/HDjslEpLr1raU5rrSG29Il1/u/7jQPAoFU9Kk1mto3i3El4yHJwAEKpVK6fnnn9cLL7ygaDSqsbExjY2N6fz585Kkzs5O/f7v/76++tWv6p/+6Z908uRJfelLX9LmzZv12c9+NuDRw0bRqKk3tlIlHccx/Qh1WCzIa4hyJwACVek+uaeffloPPfSQJOmdd97RH/3RH+mFF17Q+fPnddddd+mpp56qeXmVcieoF3XscKmoYwcAPiHY4WKUSlI6bcpRzF9Sc10zy9LfT6hDdUFcQwQ7ANYj2OFSFIumHMXMPp/JJMuvqE8jryGCHQDrEewAtAoengAAALAEwQ4AAMASBDsAAABLEOwAAAAswc4TAABUUShI2ezcE42JhClAC4QRwQ4AgGVQxw7NiHInAKxHuRPUi50n0Ky4xw4AgEXS6cqhTjLtuZzpB4QJM3YArMeMHepRKEix2MLl10pcVxofZycKhAczdgAAzJPN1hbqJNNvaMjf8QD1INgBsFYmk1FPT4/i8XjQQ0ETmZjwtz/gJ4IdAGulUimNjo5qeHg46KGgiXR1+dsf8BPBDgCAeRIJc+9cLVxXSib9HQ9QD4IdAADzRKOmTp3jVO/nOKYfD04gTHgqFoD1eCoW9aKOHZoVM3YAACwSiZjQ1tu7dFnWdU07oQ5hxIwdAOsxY4dLUSyakiYze8Umkyy/IrwIdgCsR7AD0CpYigUAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAACwxKqgBwAAQJgVClI2O1fuJJEwu1MAYUSwAwBgGaWSlE5Lg4PS1NRcu+uarcT6+ylQjPChjh0A61HHDvViSzE0K+6xAwBgkXS6cqiTTHsuZ/oBYcKMHQDrMWOHehQKUiy2cPm1EteVxsfZYgzhwYwdAADzZLO1hTrJ9Bsa8nc8QD0IdgCslclk1NPTo3g8HvRQ0EQmJvztD/iJYAfAWqlUSqOjoxoeHg56KGgiXV3+9gf8RLADAGCeRMLcO1cL15WSSX/HA9SDYAcAwDzRqKlT5zjV+zmO6ceDEwgTnooFYD2eikW9qGOHZsWMHQAAi0QiJrT19i5dlnVd006oQxgxYwfAeszY4VIUi6akycxesckky68IL4IdAOsR7AC0CpZiAQAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACyxKugBAAAQZoWClM3OlTtJJMzuFEAYEewAAFhGqSSl09LgoDQ1NdfuumYrsf5+ChQjfKhjB8B61LFDvdhSDM2Ke+wAAFgkna4c6iTTnsuZfkCYMGMHwHrM2KEehYIUiy1cfq3EdaXxcbYYQ3gwYwcAwDzZbG2hTjL9hob8HQ9QD4IdAGtlMhn19PQoHo8HPRQ0kYkJf/sDfiLYAbBWKpXS6OiohoeHgx4KmkhXl7/9AT8R7AAAmCeRMPfO1cJ1pWTS3/EA9SDYAQAwTzRq6tQ5TvV+jmP68eAEwoSnYgFYj6diUS/q2KFZMWMHAMAikYgJbb29S5dlXde0E+oQRszYAbAeM3a4FMWiKWkys1dsMsnyK8KLYAfAegQ7AK2CpVgAAABLEOwAAAAsQbADAACwBMEOAADAEquCHgAAAGFWKEjZ7NxTsYmEKWIMhBHBDgCAZZRKUjotDQ5KU1Nz7a5rdpzo76eOHcKHcicArEe5E9SLnSfQrLjHDgCARdLpyqFOMu25nOkHhAkzdgCsx4wd6lEoSLHYwuXXSlxXGh9nJwqEBzN2AADMk83WFuok029oyN/xAPUg2AGwViaTUU9Pj+LxeNBDQROZmPC3P+Angh0Aa6VSKY2Ojmp4eDjooaCJdHX52x/wE8EOAIB5Eglz71wtXFdKJv0dD1APgh0AAPNEo6ZOneNU7+c4ph8PTiBMeCoWgPV4Khb1oo4dmhUzdgAALBKJmNDW27t0WdZ1TTuhDmHEjB0A6zFjh0tRLJqSJjN7xSaTLL8ivAh2AKxHsAPQKliKBQAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALDEqqAHAABAmBUKUjY7V+4kkTC7UwBhRLADAGAZpZKUTkuDg9LU1Fy765qtxPr7KVCM8GEpFkCgTpw4oR07dqi7u1ttbW06fPjwgtcfeughtbW1Lfi6+eabAxotWsXMlmIDAwtDnWS+Hxgwr5dKwYwPqIRgByBQpVJJW7Zs0cDAQMU+n//85/Xmm2/Ofn3/+99v4AjRitLpyvvESqY9lzP9gDBhKRZAoLZv367t27dX7dPe3q5YLNagEaHVFQpm+bVSqJtx4YLp941vsMUYwoMZOwChd+zYMV111VW67rrrtHfvXp07d65q/+npaeXz+QVfQK2y2aXLr5VMTZl9ZIGwINgBCLXt27fru9/9rn74wx/qz//8zzU8PKzf/u3f1vT0dMX3HDx4UJ2dnbNf69evb+CI0ewmJvztD/iJpVgAoXb//ffP/nvTpk365Cc/qQ0bNujll1/Wrl27ln3PI488ov37989+n8/nCXeoWVeXv/0BPxHsADSVdevWacOGDTp9+nTFPu3t7Wpvb2/gqGCTRMKUNKllOdZ1pWTS/zEBtWIpFkBTeeutt/SLX/xC69atC3oosFQ0aurUOU71fo5j+vHgBMKEYAcgUMViUSMjIxoZGZEknTlzRiMjIzp79qyKxaIefvhh/ehHP9J///d/69ixY9qxY4euuOIK3XvvvQGPHDbr75e2basc7hzHvN7f39hxASsh2AEI1L//+79r69at2rp1qyRp//792rp1q/70T/9UjuPo1KlTuueee3Tddddpz549uu666/SjH/1IUfZ0go8iEenoUam31yy3zue6pv3oUXaeQPi0lcvlctCDAAA/5fN5dXZ2anJyUh0dHUEPB02mWDQlTWb2ik0mWX5FeBHsAFiPYAegVbAUCwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJthQDAKCKQkHKZufKnSQSZncKIIwIdgAALKNUktJpaXBw4b6xrmu2Euvvp0Axwoc6dgCsRx071KtUku68U8rlpAsXlr4+s6UYu08gbLjHDgCARdLpyqFOMu25nOkHhAkzdgCsx4wd6lEoSLHYwuXXSlxXGh9nizGEBzN2AADMk83WFuok029oyN/xAPUg2AGwViaTUU9Pj+LxeNBDQROZmPC3P+Angh0Aa6VSKY2Ojmp4eDjooaCJdHX52x/wE8EOAIB5Eglz71wtXFdKJv0dD1APgh0AAPNEo6ZOneNU7+c4ph8PTiBMeCoWgPV4Khb1oo4dmhUzdgAALBKJmNDW27t0WdZ1TTuhDmHEjB0A6zFjh0tRLJqSJjN7xSaTLL8ivAh2AKxHsAPQKliKBQAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALDEqqAHAAB+KhSkI0fMv48cke65x+wsANSqUJCy2blyJ4kE1xDCi3InAKxUKknptDQ4KE1N5SV1SpqU63Zo716pv5/isqhu4TU01+664hpCaBHsAFhn6XZQc8FO6mA7KKyILcXQrLjHDoB10unKf5Al057LmX7AcriG0KyYsQNglUJBisUWLp0tnrGb4brS+DjbQ2Gh5a+h5XENIWx4eAKAVbLZ2v4gS6bfhg3SmjX+jgnN5fz5+q6hoSFp1y5/xwTUimAHwCoTE/72BxbjGkKYEOwAWKWrq/7+zNhhvvPn6wtr9V5zgJ+4xw6AVbjHDpeKe+zQzHgqFoBVolFTY8xxqvdzHNOPP8hYjGsIzYwZOwDWoY4dLhV17NCsmLEDYJ1IxPzB7e01S2Xzua5p5w8yquEaQrNixg6A1YpF6fDhvHbv7tRzz01q584Ols5Ql2LRlDSZ2Ss2mWT5FeFFsANgvXw+r87OTk1OTqqjo2PlNwBAk2IpFgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEW4oBsFqhIB05Yv595Ih0zz2mAC1Qq0JBymbnnopNJLiGEF48FQvASqWSlE5Lg4PS1NRcgWLX7dDevVJ/PzXIUN3Ca2iu3XXFNYTQItgBsA47T+BSsfMEmhX32AGwTjpd+Q+yZNpzOdMPWA7XEJoVM3YArFIoSLHYwqWzxTN2M1xXGh9nFwEstPw1tDyuIYQND08AsEo2W9sfZMn027BBWrPG3zGhuZw/X981NDQk7drl75iAWhHsAFhlYsLf/sBiXEMIE4IdAKt0ddXfnxk7zHf+fH1hrd5rDvAT99gBsAr32OFScY8dmhlPxQKwSjRqaow5TvV+jmP68QcZi3ENoZkxYwfAOtSxw6Wijh2aFTN2AKwTiZg/uL29ZqlsPtc17fxBRjVcQ2hWzNgBsFqxKB0+nNfu3Z167rlJ7dzZwdIZ6lIsmpImM3vFJpMsvyK8CHYArJfP59XZ2anJyUl1dHSs/AYAaFIsxQIAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHwGqFgnTkiPn3kSPmewCwFcEOgJVKJamvz+z5uXu3adu923zf12deBwDbUMcOgHXYUgxAq2LGDoB10unKe3xKpj2XM/0AwCbM2AGwSqFgllunpua3Lpyxm+G60vg420MBsAczdgCsks0uDnWVTU2ZPUABwBYEOwBWmZjwtz8AhBnBDoBVurr87Q8AYcY9dgCswj12AFoZM3YArBKNSnv3So5TvZ/jmH6EOgA2YcYOgHWoYwegVTFjB8A6kYgJbb29Zrl1Ptc17YQ6ADZixg6A1YpF6fDhvHbv7tRzz01q584Oll8BWItgB8B6+XxenZ2dmpycVEdHx8pvAIAmxVIsAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgCsVihIR46Yfx85Yr4HAFsR7AAE6sSJE9qxY4e6u7vV1tamw4cPL3i9XC7rwIED6u7u1po1a3THHXfotddeW/FzSyWpr8/sG7t7t2nbvdt839dnXgcA2xDsAASqVCppy5YtGhgYWPb1J598Ut/61rc0MDCg4eFhxWIxJRIJFapMvc1sKTYwIE1NLXxtasq033kn4Q6AfShQDCA02tradOjQIe3cuVOSma3r7u5WX1+fvva1r0mSpqentXbtWj3xxBP6gz/4g2U/p6/PhDezT6y0eK9YSXIcs7XYt7/t648EAA3FjB2A0Dpz5ozGxsaUTCZn29rb23X77bfrlVdeWfY9hYI0ODg/1C3vwgXTr1j0csQAECyCHYDQGhsbkyStXbt2QfvatWtnX1ssm126/FrJ1JQ0NHRJQwSAUCHYAQi9tra2Bd+Xy+UlbTMmJur77Hr7A0CYEewAhFYsFpOkJbNz586dWzKLN6Orq75j1NsfAMKMYAcgtDZu3KhYLKZsNjvb9u677+r48eO65ZZbln1PIiG5bm2f77rSvNv3AKDpEewABKpYLGpkZEQjIyOSzAMTIyMjOnv2rNra2tTX16fHH39chw4d0k9/+lM99NBDcl1XDz744LKfF41Ke/eap16rcRzT7/LLvf6JACA4lDsBEKhjx47pzjvvXNK+Z88ePfPMMyqXy3rsscf013/913r77bd10003KZPJaNOmTRU/c6aOXS4383TswnInjiNt2yYdPSpFIj79YAAQAIIdACuVSlI6bUqaTE3NBTvX7dDevVJ/P6EOgH0IdgCsVixKhw/ntXt3p557blI7d3aw/ArAWgQ7ANbL5/Pq7OzU5OSkOjo6gh4OAPiGhycAAAAsQbADAACwBMEOAADAEgQ7AAAAS6wKegBANYWC2dR9YsJs/ZRImAK0AABgKYIdQmlhDbK5dtcVNcgAAKiAcicInaW7BizErgGoF+VOALQK7rFD6KTTlUOdZNpzOdMPAADMYcYOoVIoSLHYwuXXSlxXGh9nE3esjBk7AK2CGTuESjZbW6iTTL+hIX/HAwBAMyHYIVQmJvztj9aSyWTU09OjeDwe9FAAoCEIdgiVri5/+6O1pFIpjY6Oanh4OOihAEBDEOwQKomEuXeuFq4rJZP+jgcAgGZCsEOoRKOmTp3jVO/nOKYfD04AADCHp2IROtSxg9d4KhZAq2DGDqETiZjQ1tu7dFnWdU07oQ4AgKWYsUOoFYumpMnMXrHJJMuvqB8zdgBaBcEOgPUIdgBaBUuxAAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJZYFfQAgGoKBSmbnSt3kkiY3SkAAMBSBDuEUqkkpdPS4KA0NTXX7rpmK7H+fgoUAwCwGHXsEDpsKQavUccOQKvgHjuETjpdOdRJpj2XM/0AAMAcZuwQKoWCFIstXH6txHWl8XG2GMPKmLED0CqYsUOoZLO1hTrJ9Bsa8nc8AAA0E4IdQmViwt/+aC2ZTEY9PT2Kx+NBDwUAGoJgh1Dp6vK3P1pLKpXS6OiohoeHgx4KADQEwQ6hkkiYe+dq4bpSMunveAAAaCYEO4RKNGrq1DlO9X6OY/rx4AQAAHN4KhahQx07eI2nYgG0CmbsEDqRiAltvb1Ll2Vd17QT6gAAWIoZO4RasWhKmszsFZtMsvyK+jFjB6BVEOwAWI9gB6BVsBQLAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYIlVQQ8AqKZQkLLZuXIniYTZnQIAACxFsEMolUpSOi0NDkpTU3Ptrmu2Euvvp0AxAACLUccOocOWYvAadewAtArusUPopNOVQ51k2nM50w8AAMxhxg6hUihIsdjC5ddKXFcaH2eLMayMGTsArYIZO4RKNltbqJNMv6Ehf8cDAEAzIdghVCYm/O2P1pLJZNTT06N4PB70UACgIQh2CJWuLn/7o7WkUimNjo5qeHg46KEAQEMQ7BAqiYS5d64Wrislk/6OBwCAZkKwQ6hEo6ZOneNU7+c4ph8PTgAAMIenYhE61LGD13gqFkCrYMYOoROJmNDW27t0WdZ1TTuhDgCApZixQ6gVi6akycxesckky6+oHzN2AFoFwQ6A9Qh2AFoFS7EAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAllgV9ACAagoFKZudK3eSSJjdKQAAwFIEO4RSqSSl09LgoDQ1NdfuumYrsf5+ChQDALAYdewQOmwpBq9Rxw5Aq+AeO4ROOl051EmmPZcz/QAAwBxm7BAqhYIUiy1cfq3EdaXxcbYYw8qYsQPQKpixQ6hks7WFOsn0GxrydzwAADQTgh1CZWLC3/5oLZlMRj09PYrH40EPBQAagmCHUOnq8rc/WksqldLo6KiGh4eDHgoANATBDqGSSJh752rhulIy6e94AABoJgQ7hEo0aurUOU71fo5j+vHgBAAAc3gqFqFDHTt4jadiAbQKZuwQOpGICW29vUuXZV3XtBPqAABYihk7hFqxaEqazOwVm0yy/Ir6MWMHoFUQ7ABYj2AHoFWwFAsAAGAJgh0AAIAlCHYAAACWINgBAABYYpWfH14omE3dZ55oTCRMAVoAAAB4z5dgVypJ6bQ0OChNTc21u67ZLaC/nxpkAAAAXvN8KXZm14CBgYWhTjLfDwyY10slr48MwEYHDhxQW1vbgq9YLBb0sAAglDwPdul05a2gJNOey5l+AFCLG264QW+++ebs16lTp4IeEgCEkqfBrlAwy6+VQt2MCxdMv2LRy6MDsNWqVasUi8Vmv6688sqghwQAoeRpsMtmly6/VjI1ZbaKAoCVnD59Wt3d3dq4caMeeOAB/fznP6/af3p6Wvl8fsEXALQCT4PdxIS//QG0nptuuknPPvusfvCDH2hwcFBjY2O65ZZb9NZbb1V8z8GDB9XZ2Tn7tX79+gaOGACC4+lesS+9JN13X+39X3xR2rXLq6MDaAWlUkkf//jH9cd//Mfav3//sn2mp6c1PT09+30+n9f69evZKxaA9Twtd5JImJImtSzHuq6UTHp5dACtIBKJaPPmzTp9+nTFPu3t7Wpvb2/gqAAgHDxdio1GTZ06x6nez3FMv8sv9/LoAFrB9PS0fvazn2ndunVBDwUAQsfzcif9/dK2bZXDneOY1/v7vT4yABs9/PDDOn78uM6cOaN//dd/1Re+8AXl83nt2bMn6KEBQOh4HuwiEenoUam31yy3zue6pv3oUXaeAFCbX/7yl/q93/s9XX/99dq1a5dWr16tH//4x9qwYUPQQwOA0PH04YnFikVT0mRmr9hkkuVXAI2Xz+fV2dnJwxMArOdrsAOAMCDYAWgVni/FAgAAIBgEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASnm4ptlihIGWzc+VOEgmzOwUAAAC850uwK5WkdFoaHFy4b6zrmq3E+vspUAwAAOA1z+vYlUrSnXdKuZx04cLS12e2FGP3CQCNQh07AK3C83vs0unKoU4y7bmc6QcAAADveDpjVyhIsdjC5ddKXFdx7SwRAAAM00lEQVQaH2eLMQD+Y8YOQKvwdMYum60t1Emm39CQl0cHAABobZ4Gu4kJf/sDQD0ymYx6enoUj8eDHgoANISnwa6ry9/+AFCPVCql0dFRDQ8PBz0UAGgIT4NdImHunauF60rJpJdHBwAAaG2eBrto1NSpc5zq/RzH9OPBCQAAAO9Qxw6A9XgqFkCr8LyOXSRiQltv79JlWdc17YQ6AAAA73k+YzdfsWhKmszsFZtMsvwKoPGYsQPQKnwNdgAQBgQ7AK3C86VYAAAABINgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFhilZ8fXihI2excuZNEwuxOAQAAAO/5EuxKJSmdlgYHpampuXbXNVuJ9fdToBgAAMBrbCkGwHrUsQPQKjy/xy6drhzqJNOey5l+AAAA8I6nM3aFghSLLVx+rcR1pfFxthgD4D9m7AC0Ck9n7LLZ2kKdZPoNDXl5dAAAgNbmabCbmPC3PwDUI5PJqKenR/F4POihAEBDeBrsurr87Q8A9UilUhodHdXw8HDQQwGAhvA02CUS5t65WriulEx6eXQAAIDW5mmwi0ZNnTrHqd7PcUw/HpwAAADwDnXsAFiPp2IBtArP69hFIia09fYuXZZ1XdNOqAMAAPCe5zN28xWLpqTJzF6xySTLrwAajxk7AK3C12AHAGFAsAPQKjxfigUAAEAwCHYAAACWINgBAABYgmAHAABgCYIdAACAJVb5+eGFgpTNzpU7SSTM7hQAAADwni/BrlSS0mlpcFCampprd12zlVh/PwWKAQAAvMaWYgCsRx07AK3C83vs0unKoU4y7bmc6QcAAADveDpjVyhIsdjC5ddKXFcaH2eLMQD+Y8YOQKvwdMYum60t1Emm39CQl0cHAABobZ4Gu4kJf/sDQD0ymYx6enoUj8eDHgoANISnwa6ry9/+AFCPVCql0dFRDQ8PBz0UAGgIT4NdImHunauF60rJpJdHBwAAaG2eBrto1NSpc5zq/RzH9OPBCQAAAO9Qxw6A9XgqFkCr8LyOXSRiQltv79JlWdc17YQ6AAAA73k+YzdfsWhKmszsFZtMsvwKoPGYsQPQKnwNdgAQBgQ7AK2CYAfAeuVyWYVCQdFoVG1tbUEPBwB8Q7ADAACwhOcPTwAAACAYBDsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEusupg3zey7CAAAAP/Uu8f1RQW7QqGgzs7Oi3krAAAAajQ5OamOjo6a+7eVy+VyvQepZ8Yun89r/fr1+sUvflHXwGbE43ENDw837H1BHPNSzlEz/ZwX+16uoZVxDVXH+amO/4+tjGuoOq6hlV3sOWrIjF1bW1vd/8N1dHRc1P/YjuM09H1BHVO6uHPUbD/npbyXa2hlXEPVcX6q4/9jK+Maqo5raGUXe45qFfqHJ1KpVEPfF9QxL1az/ZzNdI6a7dxerGb7ORt9jjg//h2z2c7txWq2n7OZzlGzndtGuKil2Hrk83l1dnbWvUbcSjhH1XF+VsY5qo7zUx3nZ2Wco+o4Pytr1DlyDhw4cMC3T585iOPojjvu0KpVF7Xy2xI4R9VxflbGOaqO81Md52dlnKPqOD8ra8Q58n3GDgAAAI0R+nvsAAAAUBuCHQAAgCUIdgAAAJYg2AEAAFjC12D33nvv6Wtf+5o2b96sSCSi7u5uffnLX9avfvUrPw8bSi+99JI+97nP6YorrlBbW5tGRkZWfM8zzzyjtra2JV/vvPNOA0YcHhdz7mxULpd14MABdXd3a82aNbrjjjv02muvVX3PgQMHllw/sVisQSMOj6eeekobN27UZZddphtvvFH//M//HPSQGq6ec8DvnjknTpzQjh071N3drba2Nh0+fDjoIQWi3vNw7NixZa+h//iP/2jQiMPj4MGDisfjikajuuqqq7Rz5069/vrrvh3P12A3NTWlXC6nP/mTP1Eul9NLL72k//zP/9Tdd9/t52FDqVQq6dOf/rS++c1v1vW+jo4Ovfnmmwu+LrvsMp9GGU4Xe+5s8+STT+pb3/qWBgYGNDw8rFgspkQiseL2fjfccMOC6+fUqVMNGnE4/O3f/q36+vqUTqd18uRJ3Xbbbdq+fbvOnj0b9NAa5mLOAb97jFKppC1btmhgYCDooQTqYs/D66+/vuAauvbaa30aYXgdP35cqVRKP/7xj5XNZvX+++8rmUyqVCr5c8Byg/3bv/1bWVL5jTfeaPShQ+HMmTNlSeWTJ0+u2Pfpp58ud3Z2NmBUzaGec2ebDz74oByLxcrf/OY3Z9veeeedcmdnZ/mv/uqvKr7v0UcfLW/ZsqURQwyt3/qt3yp/5StfWdD2iU98ovz1r389oBE1Xr3ngN89y5NUPnToUNDDCFwt5+Ho0aNlSeW33367QaNqHufOnStLKh8/ftyXz2/4PXaTk5Nqa2vTb/zGbzT60E2pWCxqw4YNuvrqq/W7v/u7OnnyZNBDQgDOnDmjsbExJZPJ2bb29nbdfvvteuWVV6q+9/Tp0+ru7tbGjRv1wAMP6Oc//7nfww2Nd999V6+++uqC8yZJyWRyxfNmi4s9B/zugRe2bt2qdevW6a677tLRo0eDHk4oTE5OSpK6urp8+fyGBrt33nlHX//61/Xggw+y5UgNPvGJT+iZZ57RkSNH9L3vfU+XXXaZPv3pT+v06dNBDw0NNjY2Jklau3btgva1a9fOvracm266Sc8++6x+8IMfaHBwUGNjY7rlllv01ltv+TresPi///s/Xbhwoe7zZpOLOQf87sGlWrdunb7zne/oxRdf1EsvvaTrr79ed911l06cOBH00AJVLpe1f/9+3Xrrrdq0aZMvx/A02H33u9/V5ZdfPvs1/+bc9957Tw888IA++OADPfXUU14eNnSqnYd63HzzzfrSl76kLVu26LbbbtPf/d3f6brrrtNf/uVfejzi8PDq3DW7xefhvffekyS1tbUt6Fcul5e0zbd9+3bdd9992rx5sz772c/q5ZdfliT9zd/8jX+DD6F6z5uN6jkHrfi7B966/vrrtXfvXm3btk2f+tSn9NRTT+l3fud39Gd/9mdBDy1Qvb29+slPfqLvfe97vh3D083K7r77bt10002z33/sYx+TZELdF7/4RZ05c0Y//OEPrZ+tq3QeLtWHPvQhxeNxq/+r2a9z12wWn4fp6WlJZuZu3bp1s+3nzp1bMhNTTSQS0ebNm62+hua74oor5DjOkpmpes9bM/PiHLTC7x747+abb9bzzz8f9DACs2/fPh05ckQnTpzQ1Vdf7dtxPA120WhU0Wh0QdtMqDt9+rSOHj2qj370o14eMpSWOw9eKJfLGhkZ0ebNmz3/7LDw69w1m8XnoVwuKxaLKZvNauvWrZLMvVPHjx/XE088UfPnTk9P62c/+5luu+02z8ccRqtXr9aNN96obDare++9d7Y9m83qnnvuCXBkjePFOWiF3z3w38mTJxf8h2mrKJfL2rdvnw4dOqRjx45p48aNvh7P02C32Pvvv68vfOELyuVy+sd//EdduHBh9r8au7q6tHr1aj8PHyoTExM6e/bsbA2/mRo2sVhstq7Yl7/8ZX3sYx/TwYMHJUmPPfaYbr75Zl177bXK5/P6i7/4C42MjCiTyQTzQwSklnNnu7a2NvX19enxxx/Xtddeq2uvvVaPP/64XNfVgw8+ONvvrrvu0r333qve3l5J0sMPP6wdO3bommuu0blz5/SNb3xD+Xxee/bsCepHabj9+/dr9+7d+uQnP6lPfepT+s53vqOzZ8/qK1/5StBDa5iVzgG/eyorFov6r//6r9nvz5w5o5GREXV1demaa64JcGSNtdJ5eOSRR/Q///M/evbZZyVJ3/72t/Wbv/mbuuGGG/Tuu+/q+eef14svvqgXX3wxqB8hMKlUSi+88IL+/u//XtFodDYHdXZ2as2aNd4f0JdnbX9tpjzFcl9Hjx7189Ch8/TTTy97Hh599NHZPrfffnt5z549s9/39fWVr7nmmvLq1avLV155ZTmZTJZfeeWVxg8+YLWcu1bwwQcflB999NFyLBYrt7e3lz/zmc+UT506taDPhg0bFpyX+++/v7xu3bryhz/84XJ3d3d5165d5ddee63BIw9eJpMpb9iwobx69erytm3bfCszEGbVzgG/eyqbKdux+Gv++WoFK52HPXv2lG+//fbZ/k888UT54x//ePmyyy4rf+QjHynfeuut5ZdffjmYwQesUg56+umnfTle268PCgAAgCbHXrEAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAl/h9E8nptWr3XqQAAAABJRU5ErkJggg==\n", "text/plain": [ "Graphics object consisting of 22 graphics primitives" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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X//6zLG333670t3dXfnLv/zLqu976KGHKlu3bm1GF0PrN3/zNytf/vKX5x372Mc+Vvna174WUI+ar9FrwO+epUmqvPDCC0F3I3D1XIdjx45VJFXeeuutJvWqdZw/f74iqXLixAlfPr/p99hNTEyoo6NDv/Zrv9bsU7ekUqmkDRs26Oqrr9bv/M7v6PTp00F3CQE4d+6cRkdHlU6nZ451dnbq1ltv1alTp2q+9+zZs+rp6dHGjRt177336mc/+5nf3Q2Nd955Ry+99NK86yZJ6XR62etmi0u9BvzugRc+/vGPa926dbr99tt17NixoLsTChMTE5KkeDzuy+c3Ndi9/fbb+trXvqb77ruPLUfq8LGPfUxPPvmkjh49qu9973u67LLL9KlPfUpnz54NumtostHRUUnS2rVr5x1fu3btzGtLueGGG/TUU0/pBz/4gYaGhjQ6OqqbbrpJb775pq/9DYv//d//1cWLFxu+bja5lGvA7x6s1Lp16/Ttb39bzz33nJ5//nlde+21uv3223Xy5MmguxaoSqWi+++/XzfffLM2b97syzk8DXbf/e53dfnll898zb05991339W9996r999/X48//riXpw2dWtehETfeeKO+8IUvaOvWrbrlllv0N3/zN/roRz+qv/iLv/C4x+Hh1bVrdQuvw7vvvitJ6ujomNeuUqksOjbXjh07tGfPHm3ZskV33HGHXnzxRUnSd77zHf86H0KNXjcbNXIN2vF3D7x17bXXav/+/dq2bZs++clP6vHHH9dv//Zv60//9E+D7lqg+vr69OMf/1jf+973fDuHp5uV3Xnnnbrhhhtmvv/IRz4iyYS6z3/+8zp37px++MMfWj9bV+06rNQHPvABJZNJq/+r2a9r12oWXoepqSlJZuZu3bp1M8fPnz+/aCamlmg0qi1btlg9hua64oorFIlEFs1MNXrdWpkX16AdfvfAfzfeeKOeeeaZoLsRmAMHDujo0aM6efKkrr76at/O42mwi8ViisVi845Nh7qzZ8/q2LFj+vCHP+zlKUNpqevghUqlojNnzmjLli2ef3ZY+HXtWs3C61CpVJRIJJTL5fTxj39ckrl36sSJE3r00Ufr/typqSn95Cc/0S233OJ5n8No9erVuv7665XL5XT33XfPHM/lcrrrrrsC7FnzeHEN2uF3D/x3+vTpef9h2i4qlYoOHDigF154QcePH9fGjRt9PZ+nwW6h9957T5/73OdUKBT093//97p48eLMfzXG43GtXr3az9OHyvj4uF577bWZGn7TNWwSicRMXbEvfvGL+shHPqJDhw5Jkh5++GHdeOON2rRpk4rFov78z/9cZ86c0eDgYDA/REDquXa26+joUH9/vx555BFt2rRJmzZt0iOPPCLHcXTffffNtLv99tt19913q6+vT5L0wAMPaOfOnbrmmmt0/vx5/cmf/ImKxaL27dsX1I/SdPfff7/27t2rT3ziE/rkJz+pb3/723rttdf05S9/OeiuNc1y14DfPdWVSiX99Kc/nfn+3LlzOnPmjOLxuK655poAe9Zcy12HBx98UP/93/+tp556SpL0zW9+U7/+67+u6667Tu+8846eeeYZPffcc3ruueeC+hECk8lk9Oyzz+pv//ZvFYvFZnJQd3e31qxZ4/0JfXnW9lemy1Ms9XXs2DE/Tx06TzzxxJLX4aGHHpppc+utt1b27ds3831/f3/lmmuuqaxevbpy5ZVXVtLpdOXUqVPN73zA6rl27eD999+vPPTQQ5VEIlHp7OysfPrTn668/PLL89ps2LBh3nW55557KuvWrat88IMfrPT09FR2795deeWVV5rc8+ANDg5WNmzYUFm9enVl27ZtvpUZCLNa14DfPdVNl+1Y+DX3erWD5a7Dvn37KrfeeutM+0cffbTyG7/xG5XLLrus8qEPfahy8803V1588cVgOh+wajnoiSee8OV8Hb86KQAAAFoce8UCAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACW+H8PLlyuwF+ulgAAAABJRU5ErkJggg==\n", "text/plain": [ "Graphics object consisting of 21 graphics primitives" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(B158)\n", "plot(B160)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Detecting isomorphic rings\n", "\n", "Bettina Eick, S.K. (2016) classify the modular cohomology rings of all $p$-groups of order $<100$ up to graded isomorphism.\n", "\n", "The idea is to try all mappings of the generators that may possibly extend to an isomorphism, and user invariants to detect assignments that can *not* possibly extend to an isomorphism.\n", "\n", "To give two quick examples, we show that our two ring presentations of $H^*(A_8,\\mathbb F_2)$ are isomorphic, and we show that the examples with different bar codes are in fact not isomorphic." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('1*b_2_0', '1*c_4_1', '1*b_3_0^2+1*b_6_3+1*b_2_0*c_4_1', '1*b_6_5', '1*b_3_1', '1*b_3_0', '1*b_5_1', '1*b_7_5', '1*b_7_6')\n" ] } ], "source": [ "print HA8.is_isomorphic(HA8_direct)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "False" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H64gp158.is_isomorphic(H64gp160)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question**\n", "Is there an example of two prime power groups of the same order with isomorphic modular cohomology rings that can be distinguished by bar codes?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Is there still time???\n", "### Massey powers\n", "\n", "Let $c$ be an element of mod-$p$ cohomology, and $i\\in\\mathbb N$. If the $p^i$-fold Massey product of $c$ exists, then it is possible to represent it by a well defined cohomology class --- the $i$-th *restricted Massey power* of $c$. A theorem of David Kraines (1965) says that if $p$ is odd then the first restricted Massey power of $c$ is equal to $-\\beta P^1(c)$, where $\\beta$ is the Bockstein operator associated with the exact coefficient sequence $0\\to\\mathbb Z_p\\to\\mathbb Z_{p^2} \\to \\mathbb Z_p\\to 0$, and $P^1$ is the Steenrod $p$-th power.\n", "\n", "Let's compute the first restricted Massey power for generators of the nil radical $H^*(E27;\\mathbb F_3)$:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "[a_1_0: 1-Cocycle in H^*(E27; GF(3)),\n", " a_1_1: 1-Cocycle in H^*(E27; GF(3)),\n", " a_3_4: 3-Cocycle in H^*(E27; GF(3)),\n", " a_3_5: 3-Cocycle in H^*(E27; GF(3))]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "[-b_2_0: 2-Cocycle in H^*(E27; GF(3)),\n", " -b_2_3: 2-Cocycle in H^*(E27; GF(3)),\n", " b_2_0^2*a_1_1*a_3_5+b_2_0^2*a_1_0*a_3_4+b_2_0*c_6_8: 8-Cocycle in H^*(E27; GF(3)),\n", " -b_2_0^3*b_2_2-b_2_0^2*a_1_1*a_3_5-b_2_0^2*a_1_0*a_3_5+b_2_3*c_6_8+b_2_0*c_6_8: 8-Cocycle in H^*(E27; GF(3))]" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = [HE27(str(x)) for x in HE27.nil_radical()] # the nil radical\n", "N\n", "MP = [HE27.element_as_polynomial(c.massey_power(1)) for c in N]\n", "MP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's focus on $a_{3,4}$:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "c = N\n", "cP = MP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are four conjugacy classes of maximal elementary abelian subgroups of $E27$, all of order $9$.\n", "And since it is known that they detect cohomology of $E27$, we compute these restrictions for $c$:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "r1 = HE27.restriction_maps()\n", "r2 = HE27.restriction_maps()\n", "r3 = HE27.restriction_maps()\n", "r4 = HE27.restriction_maps()\n", "U = r1.codomain()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0: 3-Cocycle in H^*(SmallGroup(9,2); GF(3))" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "-c_2_2*a_1_0+c_2_1*a_1_1: 3-Cocycle in H^*(SmallGroup(9,2); GF(3))" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "-c_2_2*a_1_0+c_2_1*a_1_1: 3-Cocycle in H^*(SmallGroup(9,2); GF(3))" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "c_2_2*a_1_1-c_2_2*a_1_0+c_2_1*a_1_1: 3-Cocycle in H^*(SmallGroup(9,2); GF(3))" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.element_as_polynomial(r1(c))\n", "U.element_as_polynomial(r2(c))\n", "U.element_as_polynomial(r3(c))\n", "U.element_as_polynomial(r4(c))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is easy to compute the Bockstein and the Steenrod powers for the cohomology of elementary abelian groups. Since Bockstein and Steenrod powers commute with restriction maps, the formula of Kraines implies that $cP$ should be the *unique* element that restricts to \n", " - $0$\n", " - $c_{2,1}c_{2,2}^3 - c_{2,1}^3c_{2,2}$\n", " - $c_{2,1}c_{2,2}^3 - c_{2,1}^3c_{2,2}$\n", " - $-c_{2,2}^4 - c_{2,1}c_{2,2}^3 + c_{2,1}^3c_{2,2}$.\n", " \n", "It does:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "0: 8-Cocycle in H^*(SmallGroup(9,2); GF(3))" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "c_2_1*c_2_2^3-c_2_1^3*c_2_2: 8-Cocycle in H^*(SmallGroup(9,2); GF(3))" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "c_2_1*c_2_2^3-c_2_1^3*c_2_2: 8-Cocycle in H^*(SmallGroup(9,2); GF(3))" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/html": [ "" ], "text/plain": [ "-c_2_2^4+c_2_1*c_2_2^3-c_2_1^3*c_2_2: 8-Cocycle in H^*(SmallGroup(9,2); GF(3))" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "U.element_as_polynomial(r1(cP))\n", "U.element_as_polynomial(r2(cP))\n", "U.element_as_polynomial(r3(cP))\n", "U.element_as_polynomial(r4(cP))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "SageMath 8.9.beta2", "language": "sage", "name": "sagemath" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.15" } }, "nbformat": 4, "nbformat_minor": 2 }