# SageMathCell online --> https://sagecell.sagemath.org/?q=ckwkio # # (4,6)=745 Jitendra Prajapati (23f1001521@ds.study.iitm.ac.in) # https://github.com/infinityscroll/degree-diameter-n46 ''' Main properties of the graph H3 | Ord.: 728 / Size: 1456 / Diam.: 6 / Avg.dist: 5.01513 / 4-reg.? True / Girth: 12 / Alg.conn. 1.00000 H3K3p | Ord.: 740 / Size: 1480 / Diam.: 6 / Avg.dist: 5.04374 / 4-reg.? True / Girth: 3 / Alg.conn. 0.693282 H3K3pp | Ord.: 745 / Size: 1490 / Diam.: 6 / Avg.dist: 5.05270 / 4-reg.? True / Girth: 5 Symmetry properties of the graph H3 | Aut.group.ord.: 8491392 / Cayley ? False --- vtx.trans. ? True -- edge.trans. ? True H3K3p | Aut.group.ord.: 1 / Cayley ? False --- vtx.trans. ? False -- edge.trans. ? False H3K3pp | Aut.group.ord.: 1 / Cayley ? False --- vtx.trans. ? False -- edge.trans. ? False Degree histogram H3: [0, 0, 0, 0, 728] Degree histogram H3K3p: [0, 0, 0, 0, 740] Degree histogram H3K3pp: [0, 0, 0, 0, 745] Automorphism group structure C_n is the cyclic group of order n; x means direct product; : means semidirect product. H3: G(2,3) : C2 | center order: 1 H3K3p: 1 | center order: 1 H3K3pp: 1 | center order: 1 ''' import networkx as nx H3=Graph(r":~?JWjW??BWLasO?AaIGl[??uBWJR??OwnQtO@@YB{kK?OhAbJV?CNowQro@C_K{kc?_Q@GJ@?GIWhAtoABiMgk[?`KbEJL?KB_LqsOBBEIkkk?o~baJN?KROpqrOC@[C?kK@?qAkJJ?OMoyqpoCCOJwlS@OQ`HJ@?SKgjQqoDBYLclK@PGbOJH?WBgMAsOEAsJOkS@_zbkJF?WQOsQqOF@]CCkK@olatJD?[LouasoFCuK_ksA?R@IJ@?_J_lapOGC?MKk{A@Ca~JT?cDGOqdOHA{J?`sAO|BdGn?cQ_qqOOI@?Coh[A_namG\?gMGzaMoICyKGc[AoX?yIX?kJgjqFOJCELobSApDbSHL?oCwPAdOKAiJcacB?vbnGz?oP_saROL?{Csh[BOjAvGh?sOGvQLOLCiKccCB_W?zIX?wI_mAIOMBoMWa{B`NB?HF?{D?OadONBMI[aKBp@BZGt?{R_oQPoO?}Ckh[C?sAdGb@?NGxAJoOCSLKcsCOW_xIX@CKohaGoPB_MsbkCPHbIH@@GDWPqboQBCJGdKC_}BhHv@GR?rQXOR@CD?hKCooArHR@KMW{a^ORDAKOfCD?Y?}IP@OKGkQSoSCIM?gKD@FbUHj@SD_PQboTAqJkdcDOyBoH|@SPgtqYoU@ECwhKD_ja{HX@WOova_oUCkKweSDoY_{IP@[J?maUOVByM[f[DpNbDHp@_DOPaboWBUIcd{E@AB^IB@_S?oq[OX@AC{hKEOsaiH^@cNWyA\oXC[LSekE_X_|IP@gLOiAVoYBcNCfsE`JbKHd@kI_wAkoZB_KShkEpDagIf@oKoxqmo[CEKoiKF@NApIn@sJg{Qlo\BoLWh{FPHayIj@wLWwaRo]BwLCaSF`EaaGp@{KOzAQO^BgJs`{FpOAjG|A?JGuAOo_CGK[akG@KAsGvACIGuqYO`B}KkdsGPHAxIFAGKWxQZoaBmLGeKG`BafHzAKJOzq\ObBWKCd[GpLAoI@AOIo{amocBqKwhkH@MaiIjASL?valodBaLSiKHPIarIfAWJwyAkoeCAKOh{H`DA{InA[LOuQQOfCIJ{aSHpNacGvA_KGwqOogByKW`{I@JalGpAcJ?yaRohBcL?akIPFauG|AgIWzQZoiBYLOdsI`CawI@AkKgvA\OjC?K?eKIpKaeIFAoJ_xaYOkBiKgd[J@GanHzAsIgyQlolCCL[hkJPIAhInAwKw{AkomBsKKiKJ`EAqIjA{JovqmonB]Ksh{JpMAzIfB?LGyqOooBeK_aSK@JAbG|BCK?uaRopCKK{`{KPFAkGvBGIwwQQOqBuJwakK`OatGpBKIOxA\OrBkKGdsKpLavHzBOK_zaYOsB[KceKL@GAdI@BSJWvQZotB{LKd[LPCAmIFBWIwoaiOuBeISjSL`FB\I\B[LGqQkOvCKIwjsLpObcIdB_K?sqjOwBuJ[jcM@JBmI`BcIGoqKoxBmJkckMPLBhGlBgKWrQNoyBWIccSM`HBoGfBkJOtqMOzB}JGdCMpBb^G`BoKwpq^o{B]IGe[N@IBkH`BsJosQ`O|CCIkesNPEBWHTBwIgnQ]O}BsJOfKN`MBaHZB{J?tAkO~CIIWjcNpJbeI\C?LOoAjP?ByI{jSO@FblIdCCKGqaiP@BcJ_jsOPNb[I`CGIOtQNpAB[JodCO`CBqGlCKK_pAMPBB{IgckOpLb]GfCOJWraKpCBkJKcSP@GBgG`CSL?na`PDCAIKfKPPMbYH`CWJwqA]PEBqIoe[P`Ib`HTC[Iorq^pFBaJSesPpDBjHZC_JGqqjPGBwI[jsQ@OBnI\CcLWsaiPHBgJ?jcQPKBZIdCgKOoQkPICGJcjSQ`EbdI`CkIWrAMPJC?JgcSQpGb_GlCoKgtaKpKBiI_dCR@CbfGfCsJ_pQNpLBYJCckRPKbpG`CwKosA]PMBoIOesR`DbbH`C{Jgnq^pNB_IsfKRpNBiHTD?I_pa`POCEJWe[S@HbXHZDCMOa`~pQCGHK`[So|a[GJDONoeAEpTBiIC_{T_uANGBD[NOeQBPWBaG[_CUP@aOGXDgNgdP~pZBgHw`[V@BAKGJDsLogAEp]C?Gw_{VozaVGBE?OOaQBP`BqHG_CW_wAZGXEKOgfP~pcBwGk`[XOxaSGJEWMobQEpfBYHW_{Y?~a^GBEcLwcQBPiCAHg_CYo{AGGXIGW?v`}QbEcM[`Ch@cboGDISXgyaAQeEGL_^shpjB`GTI_XwxQCqhEKMw_[i`]b[FzIkXOy@}QkEANC`CjPhb^GDIwYwuQAQnE[MG^sk@abjGTJCVozqCqqE_Ls_[kpbbeFzJOY_{`}QtEUM?`Cl``BhGDJ[WWwqAQwEiMo^smPeBYGTJgX?uqCqzD}MO_[n@gblFzNK]o}QnrrG[Qcl[{qGcnJDNKa`JAqrsFmNgj{|AOCqJTNOcXMAqRsHKRSks|P{BzI~NSaxMqsrtGsSCk[|QMc}JNNWa@KAhRuGeQshs|aJCiI`N[cPMQnRvHIRWjS|qSCrIxN_bHOakRwGwR{ic}ANc{IlNc`xJafrxGcQkiK}QIcpIZNgcHLqlryHGROjk}aRcyIrNkb@OAirzGuRsi{}qNDBIfNo_XAaar|GGO_gk~a@CHIJN{_xBAbS?GIOsgt?QBCJILSOghPantCIMSglDPAcDKJ@SOhHQqo~~") # CG H3K3p=Graph(r":~?JcjW??BWLasO?AaIGl[??uBWJR??OwnQtO@@YB{kK?OhAbJV?CNowQro@C_K{kc?_Q@GJ@?GIWhAtoABiMgk[?`KbEJL?KB_LqsOBBEIkkk?o~baJN?KROpqrOC@[C?kK@?qAkJJ?OMoyqpoCCOJwlS@OQ`HJ@?SKgjQqoDBYLclK@PGbOJH?WBgMAsOEAsJOkS@_zbkJF?WQOsQqOF@]CCkK@olatJD?[LouasoFCuK_ksA?R@IJ@?_J_lapOGC?MKk{A@Ca~JT?cDGOqdOHA{J?`sAO|BdGn?cQ_qqOOI@?Coh[A_namG\?gMGzaMoICyKGc[AoX?yIX?kJgjqFOJCELobSApDbSHL?oCwPAdOKAiJcacB?vbnGz?oP_saROL?{Csh[BOjAvGh?sOGvQLOLCiKccCB_W?zIX?wI_mAIOMBoMWa{B`NB?HF?{D?OadONBMI[aKBp@BZGt?{R_oQPoO?}Ckh[C?sAdGb@?NGxAJoOCSLKcsCOW_xIX@CKohaGoPB_MsbkCPHbIH@@GDWPqboQBCJGdKC_}BhHv@GR?rQXOR@CD?hKCooArHR@KMW{a^ORDAKOfCD?Y?}IP@OKGkQSoSCIM?gKD@FbUHj@SD_PQboTAqJkdcDOyBoH|@SPgtqYoU@ECwhKD_ja{HX@WOova_oUCkKweSDoY_{IP@[J?maUOVByM[f[DpNbDHp@_DOPaboWBUIcd{E@AB^IB@_S?oq[OX@AC{hKEOsaiH^@cNWyA\oXC[LSekE_X_|IP@gLOiAVoYBcNCfsE`JbKHd@kI_wAkoZB_KShkEqho[BKM[jkF@@bKIb@oRokQjo\AyNCj[FO{BUI^@sQWmaio]BUMGc{F_}BPGd@wPggaKO^BCMoccFoyA|G^@{S?iqNO_AqL_cKG@ABFGjA?R?lALo`AaLkecGO~bJH\ACQOmQ`oaBEMSe{G_zbQHbAGOwhq]obAsM{fSGouB@HVAKROkA_OcAkNGjkH?{bMIZAORgiaiodBOLwj[HOwbTIbASQgkqhoeA}M_jKH`?bCI^AWPOnAjofBSLcccHpAa~GdA[RwhALogBAMKcKI?}bEG^A_QwjQKOhAoMgc{IOxBOGjAcPwlaNOiAeMse{I_ubSH\AgPGmA_OjBILofSIp?B?HbAkRGha`okAwMWecJ?ybIHVAoQGjq]olAiMcj[JP@BVIZAsQ_iQjomBMN?jKJ_|BBIbAwP_kaionA{L{jkJovbLI^A{R_mqhooBQMkcKK?xbGGdB?QogqNOpB?Lgc{KPBBNG^BCPojALoqAmMCccK_|a}GjBGSGlQKOrAcMOfSKozBAH\BKRWlq]osBGMwecL?vBHHbBOQ?hQ_OtAuLse{LO~BRHVBSP?ja`ouAmKGicL_xadItBWhsLosbHIpB[OojanOvDAMOiSM?oBRIlB_NWlqmOwCkMwiCMOgbBGrBcMwmqQoxCsMcasM_pbLG~BgL_iQPOyCcN?a[MolBVGxBkNwkaSOzCML{aCN?rbFH~BoLwgaXo{CgMoeCNOnBPIDBsOOiqZO|CWL_dSN_ia|HxBwNOlA[o}CwMGdkNokBSIpB{OghamO~CmMWhsO?tB?IlC?NgjqlP?C]MsiSOOobIIhCCMOmAnP@C}LoiCO_hBTG~CGLonASPACONGasOoqBCGxCKNoiaQpBCuLwa[P?lbMGrCOMokqPPCC_M_aCPOsA}IDCSOGgq[pDCyLgeCP_nbGHxCWNGjAXpECiMCdSPojBNH~C[MGlQZPFCSMkdkQ?kbJIlC_N_hqnPGD?M{hsQOtbQIhCcM_kAmPHCoLkiSQ_pB@IpCgO_mQlPICYMSiCQohbKGxCkO?maPPJCaM?asR?qbUGrCoMgiASPKCQM[a[ROmBDG~CsLgkQQpLCqNCaCR_rBOHxCwN?hAZPMCUMKeCRoma~H~C{M?jQ[pNC{MgdSS?iBEIDD?OWlaXpOCeLcdkSP~pQCGHK`[So|a[GJDONoeAEpTBiIC_{ZA?pVBsHc_sU?waFG@DcOWcAEPYByHS^{UoyA]GVDoOobAAp\B[I?`kV`?AMGND{Mwdq?p_CCGc_sWO{aQG@EGM?eqEPbCIHs^{X?}AJGVESMWdAApeBkGs`kXouaUGNE_Nwfq?phB]HC_sY`?aYG@EkN?aAEQaFxIKYOxqCQcEQN?_ShPebiGHL_^shpjB`GTI_XwxQCqhEKMw_[i`]b[FzIkXOy@}QkEANC`CjPhb^GDIwYwuQAQnE[MG^sk@abjGTJCVozqCqqE_Ls_[kpbbeFzJOY_{`}QtEUM?`Cl``BhGDJ[WWwqAQwEiMo^smPeBYGTJgX?uqCqzD}MO_[n@gblFzNK]o}QnrrG[Qcl[{qGcnJDNKa`JAqrsFmNgj{|AOCqJTNOcXMAqRsHKRSks|P{BzI~NSaxMqsrtGsSCk[|QMc}JNNWa@KAhRuGeQshs|aJCiI`N[cPMQnRvHIRWjS|qSCrIxN_bHOakRwGwR{ic}ANc{IlNc`xJafrxGcQkiK}QIcpIZNgcHLqlryHGROjk}aRcyIrNkb@OAirzGuRsi{}qNDBIfNo_XAaar|GGO_gk~a@CHIJN{_xBAbS?GIOsgt?QBCJILSOghPantCIMSglDPAcDKJ@SOhHQqoqgMtGkzQuHmgjc[alZIuhDHyUtFHNQvHnITe?hTZivhFh~U|DXNywHaIXUpIXRIwTp^") # H3K3pp=Graph(r":~?Jhi[Bul_??L_uJP??IGgato?BWL_lK?@Ba|JT?CDgNqoo@AcIKl[?O~B`JN?CQ?rqqOA@GC_kC?`QDj_CFS\PWw@AXEKUY?WF?Zdg_EEKTXXW@`~FCU]?We`bde_GAwG@WWA@cDWUU?_\`tdb_GG_VpYgA_dAQUA?gXPUdd_IEsZHYWAaPE_UQ?oFO[Dg_KDgU`WgB@vFWUM?oc`gdc_MA{GHWWB`ZDiUI?wZ`lDh_MHkX@XgC?eASUA@?V@ZDa_OG?[XXwCAHD}Ui@GIO`dI_QDwU@BgC`yFIP]@Gd@dc__SA?h[A_namG\?gMGzaMoICyKGc[AoX?yIX?kJgjqFOJCELobSApDbSHL?oCwPAdOKAiPQ@_ZpvoKCWLGcsBON@LIV?sIolqIOLCALsbSBPIbHH@?wE?MqeOMAgJ_acB_{BeGn?wRooAPoN@OCGhSBoraf_]GGZXEgFa[EAQMBwQqdoOBOISaKC?{bcGn@?POsqROP@aBchcCOrAeGb@CM?zWGaRESQAAOIobdF_cEGUPIWH@{FQRmAOe@ecq_eAGI@QWH`_DeQeAW[pxC}_eICW`MGI?s@{SaA_WPWch_gGS[@OWIANEkRUAgJ?adF_iDcVXJGI`sF_RyAgbPjct_kAKHpQWJ@VDwQqOova_oUCkKweSDoY_{IP@[J?maUOVByM[f[DpNbDHp@_DOPaboWBUIcd{E@AB^IB@_S?oq[OX@AC{hKEOsaiH^@cNWyA\oXC[LSekE_X_|IP@gLOiAVoYBcNCfsE`JbKHd@kI_wAkoZB_KShkEpSDR_wEW[xVWMABEWTEB_f`WdV_yDs]HUwM`wEkS}Bgcp\DT_{Ek[PHwN@{EaPIBobPPCW_}EG\`HGN`sDyO}Bwg@Tc]`?DcZ@GWOACEMPUC?e@YCZ`ADCZXLGO`~EUQyCGc`[dB`CEK[hLwP@vEcRECO`pRc|`EDg\xMgP`kEAQmCWe`WD?`GDW]PVWQ@xE\AORgiaiodBOLwj[HOwbTIbASQgkqhp^FOTeCo_PaDN`KGgV`TwR`iEqQQCw`P^cQ`MH{S`EwS@`FEQED?^PbCN`OH[ThEGS`WFSQ]DGsAIohC]JWbsI_hblHnAgLgtAVOiCQJ_gCIoqb[HtAkO?oAWojCqIWg[J?mBeHhAoMgqaTokCaI{fkJOibhIvAsOOtqeolCgIci{J_rboIrAwNOoqgomCWJGikV`nd\`]E{XhRwVa[DuTME?YPtc``_FKX@CgWAUDEPyEGW@lCf`aGWXxBwWaMDWPmEOTpocc`cFkVpDWXA`DiPaEWS`qCy`eFWWPJgXaZDmRuE_X@vCs`gEwXHKWYAODISAEgUpmcv`iFwYXIwYaGD[SMEoTp`DS`kFKShUifOvBQKcjCLpBAmI|B[SGxAhOwB?LKisM?|avIxB_QozagOxAaKKbKMOzazHJBcROyQJOyBEKsb{M_uAhHDBgQO{AHozAsL[bcMo~aqHPBkOwvqGO{BMK[f{N?vaaHfBoQ_zAWO|A{LCgSNP@AjHlGoZ@IafO}AiJsfcN_|AsHrBwR_waUo~AoLOjCNpAaeIxB{QwxcTp?BSK?isO?}anItG{\hSg_``ESTQGG[`[D]aAH{Z`SG`@QEiP}GOZ`]CgaCG_]PDg``cEGPqGW^`TCdaEHkZpCwa@ZE[PeG_\`XcaaGH?\@CGa`gD{SIGg_PPcxaIHsZPKGb@^EORqGo]PUCraKHS[HIgb`UE]R}Gw[PYcuaMGg\XJWc@XEUTYH?^@Rd]aOI?\{QOtbQIhCcM_kAmPHCoLkiSQ_pB@IpCgO_mQlPICYMSiCQohbKGxCkO?maPPJCaM?asR?qbUGrCoqcR@CbfGfCsJ_pQNpLBYJCckRPKbpG`CwKosA]PMBoIOesR`DbbH`C{Jgnq^pNB_IsfKRpNBiHTD?I_pa`POCEJWe[S@HbXHZDKmkS`AARGVDKNWfAApSB{H_`kTOya`GNEoPx?Wj`yCqOYJ?[PBc?aqGK`cU_}aTF~DkM_faDp[CKGo_kVOvA_GZDwO?baBp^BmH[_KW@@AHGLECNGca?PaB_Hk`cWpAa\F~EON_aqDpdBeHO_kX_zALGZE[LgdaBpgB}H{_KYOvaPGLEgOGea?PjBoG_`d?qMdMdELG[xAHQBHF_OISgrPtCCgaYdLchpjB`GTI_XwxQCqhEKOMTOnPmB|dUKg\?~HUB@FaOaTgspncAd[L[ZH@HVbMFCNyU?pPtcIdaJw\xAXXBOEyOMUWpprB|dgLO]O~HYbJF@JWWOyQ@QvEEMK_cm@ibkF|JcX_uaDQyEOLk`Kmp^bcGFJoYGzP}rrFkNcj{{qFChJVNKaHJqpRrGgQokk|@zbyI~NOc@KatRsHER_kc|ARCtJLNS^?}qnrtGmRklK|QLD@JFNSfpXxzCOH_TI]pCqUruGkQgiC|qPCxI|N[chLalRvHORKjc}AKdAIpN_b`NqiRwG}Rois}QFcmI^NcaPIqgrxGiRChk}aOcvIvNgc`LAmryHMRgjK}qKD?IjNkbXNQjrzG{SKi[~ADDDSjNs_`AAar}GCOcgk~qBcKILO?_hBQbS@GKOkgtPAadEI~SOgxQasTCIOSokDPAcdJJBCoMgiASQJMtBWPov[Th`TyliIG[`DB~bc_LZKg`_B]Fx@WwqItmp?QQepNSTc|H~UrIWbieXaBWF{mIbhfbXIz`]H@Aa_gRAxKy^eA@RRUFsf[O`RaiN") graphs = [('H3 ', H3),('H3K3p ', H3K3p),('H3K3pp ', H3K3pp)] H3nx =H3.networkx_graph() H3K3pnx =H3K3p.networkx_graph() H3K3ppnx =H3K3pp.networkx_graph() def count_k_cycles(G, k): count = 0 visited = set() def dfs(path, start, depth): nonlocal count current = path[-1] # Early exit if we?re going too deep if depth == k: if start in G.neighbors(current): # Normalize to avoid duplicates cycle = tuple(sorted(path)) if cycle not in visited: visited.add(cycle) count += 1 return for neighbor in G.neighbors(current): if neighbor not in path and neighbor >= start: dfs(path + [neighbor], start, depth + 1) for v in G.vertices(): dfs([v], v, 1) return count # each cycle counted twice (once forward, once reverse) def algebraic_connectivity(G): """ Compute the algebraic connectivity (Fiedler value) of a graph G. INPUT: - G: a SageMath Graph OUTPUT: - The second-smallest eigenvalue of the Laplacian matrix of G """ L = G.laplacian_matrix() eigenvalues = L.eigenvalues() eigenvalues.sort() if len(eigenvalues) < 2: return 0 # Trivial case: empty or isolated vertex graph return eigenvalues[1] def check_all_isomorphisms(graph_list): n = len(graph_list) print("\n Isomorphism check of all pairs (a dot means the pair ARE isomorphic):") for i in range(n): label_i, G_i = graph_list[i] for j in range(i + 1, n): label_j, G_j = graph_list[j] if G_i.is_isomorphic(G_j): # print(".", end="") print(f"{label_i} IS isomorphic to {label_j}") else: print(f"{label_i} NOT isomorphic to {label_j}") def non_isomorphic(graph_list): reps = [] labels = [] for label, G in graph_list: if not any(G.is_isomorphic(H) for _, H in reps): reps.append((label, G)) labels.append(label.strip()) # remove extra spaces if you want return labels def isomorphic(graph_list): labels = [] for i, (label, G) in enumerate(graph_list): if any(i != j and G.is_isomorphic(H) for j, (_, H) in enumerate(graph_list)): labels.append(label.strip()) return labels def compare_graphs_list(graphs): canon = {} count =1 for label, G in graphs: s6 = G.canonical_label().sparse6_string() # print(f"{label.strip():15} : {s6[:40]}...") canon.setdefault(s6, []).append(label.strip()) print("\n noniso ->",len(canon)) print("\nGroups:") for group in canon.values(): if len(group) > 1: print(count,"Isomorphic :", ", ".join(group)) count=count+1 else: print(count,"Unique :", group[0]) count=count+1 print("\n START \n") #noniso = non_isomorphic(graphs) #print(len(noniso), " non-isomorphic -> ",noniso) #iso=isomorphic(graphs) #print(len(iso), " isomorphic -> ",iso,"\n") compare_graphs_list(graphs) nonisographs = graphs # Print properties for each graph in the list print("\n Main properties of the graph\n") for label, graph in nonisographs: print(f"{label} | Ord.: {graph.order()} / Size: {graph.size()} / Diam.: {graph.diameter()} / Avg.dist: {graph.average_distance().n(digits=6)} / 4-reg.? {graph.is_regular(k=4)} / Girth: {graph.girth()} ")# / Alg.conn. {algebraic_connectivity(graph).n(digits=6)} ")# / Domin. number: {graph.dominating_set(value_only=True)} ") print("\n Symmetry properties of the graph\n") for label, graph in nonisographs: print(f"{label} | Aut.group.ord.: {graph.automorphism_group().order()} / Cayley ? {graph.is_cayley()} --- vtx.trans. ? {graph.is_vertex_transitive()} -- edge.trans. ? {graph.is_edge_transitive()}" ) print("Degree histogram H3:" , nx.degree_histogram(H3nx) ) print("Degree histogram H3K3p:", nx.degree_histogram(H3K3pnx) ) print("Degree histogram H3K3pp:", nx.degree_histogram(H3K3ppnx) ) ''' print("\n Properties of the graphs as at arXiv\n") for label, graph in nonisographs: print(f"{label} & {graph.average_distance().n(digits=6)} & {graph.girth()} & {algebraic_connectivity(graph).n(digits=6)} & {graph.automorphism_group().order()} \\\\ ") ''' # Check isomorphisms # print(f"Are isomorphic G5 and G6? {G5.is_isomorphic(G6)}") #check_all_isomorphisms(nonisographs) print("\n") # automorphism group structure print(" Automorphism group structure") print(' C_n is the cyclic group of order n; x means direct product; : means semidirect product.\n') AH3 = H3.automorphism_group() AH3K3p = H3K3p.automorphism_group() AH3K3pp = H3K3pp.automorphism_group() print('H3:', AH3.structure_description(), ' | center order:',AH3.center().order()) print('H3K3p:', AH3K3p.structure_description(), ' | center order:',AH3K3p.center().order()) print('H3K3pp:', AH3K3pp.structure_description(), ' | center order:',AH3K3pp.center().order()) print("\n") # Compute the distance distribution from a given vertex v in graph G # Returns a list where the i-th element is the number of vertices at distance i from v def distance_distribution(G, v): from collections import Counter distances = G.shortest_path_lengths(v) distribution = Counter(distances.values()) result = [distribution[d] for d in sorted(distribution)] return result print("\n") for label, graph in nonisographs: print(f"{label} distance distrib from vtx. 0: {distance_distribution(graph, 0)}") ''' # Counting k-cycles for each graph print("\nNumber of k-cycles for k=3 up to 5") for label, graph in nonisographs: print(f"{label} "," & ".join(str(count_k_cycles(graph, k)) for k in range(3, 6))) # from 0 versio Molodtsov† for name, G in nonisographs: fname = name.strip() + "_adjlst.txt" s = "; ".join( "{}-{}".format(v, ",".join(map(str, G.neighbors(v)))) if G.neighbors(v) else str(v) for v in G.vertices(sort=True) ) with open(fname, "w") as f: f.write(s) # from 0 for label, _ in nonisographs: base = label.strip() G = globals()[base + "nx"] with open(f"{base}_edges.txt", "w") as f: f.write(",".join( f"{{{u},{v}}}" for u, v in sorted((min(u, v), max(u, v)) for u, v in G.edges()) )) ''' # from 1 for label, _ in nonisographs: base = label.strip() G = globals()[base + "nx"] with open(f"{base}_Zedges.txt", "w") as f: f.write(",".join( f"{{{u+1},{v+1}}}" for u, v in sorted((min(u, v), max(u, v)) for u, v in G.edges()) )) print("\n DONE \n") ## ##