# SageMathCell https://sagecell.sagemath.org/?q=nbvdxl # (4,7) Moore bound=4373; # import networkx as nx dhar1344 =Graph(r":~?T?a@@K`L`J`B`@`A`EaH@C`F`P`M`N_|_{_z`H`IaS@G_}`?_~an?T_??R_@?S_]_^at?\_Q_P_O___a_`_Z_Y@p_A?[b??L_K_N_V_W_U_D_CbH?JbJ?I_H_G_E_FbV??bX?@`p_Ab\?I_H_JaqBLba?Dbc?Cbn?G_F_EbtAfAhaeAsbwA]Ad`qAl`ZAk`eAmacaaaba_Bka^Bva`B`b{`OA\`DA[_yAZaXBIaYA~aWBTaGAj`|AiaRAgcLB}cWB|cz?oA?_l@~_m@}_s@n_u@o_t@r_e@l_d@m_b@kdD?v@u_x@s_w@t_r@x_q@w_p@v_j@{_i@y_k@z_g@harBNdP?h@i_f@jawavaubBbCbDa}a{d[A|aqaratazCmayCxaxCbaoDOapDCanDZdVb@bAb?dpDWd{DUe@DgdhdfdYdXatBMd[dTdRdSd^d]d\_sAX_uAY_tAWaxBJ_dAf_eAe_bAd_rAm_qAl_pAk_xAa_wAc_vAb_oAgazBK_lAj_mAi_iA__kA^_jA`_gAZ_hA\_fA[aPAbaSAaayBHaQAcaDAgaCAiaEAjaMAWaNAYaOAXaAA^a@A`aBA_b?BQaHAmaFAlaIAkaLA\aKAZaJA[aVAeaTAfaUAd_dC_E_b@BO_eCaE^_bC`E`_rCSEX_qCREW_pCTEY_wC]ER_vC\EQ_xC^ES_lCQEU_oCPEVanBWbABP_mCOET_iCNEO_kCMEM_jCKEN_sC[Ec_uCZEb_tCYEa_hCXE\_fCUEZ_gCVE]bif^BgfeF^fSfiBhFdfkCAcLcW`e`q`Zasaha]b]FXaGaR`|bvbkb`a~bIbT`Ob^FY`D_y_M@u`t_B@s`}`~a?`i`jb\FW`h_n@z_c@{_X@y`x`v`w`l`k`mboFj`r`o`na|C\a{C^a}C]_XB?CP_cBACO_nB@CQanCYbnFgapCZaoC[arCMatCKaqCNbDCSbBCRbCCTazCXaxCVbpFhayCU_BAvCaawC__MAuC`csDHF`ctDGF_cuDIF]cdDJFgceDKFjccDLFhawBFbbF\cnC|FZcoC{F\clCzF[cpDQFVcrDMFTcqDPFUcyDAFecwDBFdcvD@FfcjC~FWbaF[ciD?FYckC}FXchDFFccgDDFbcfDEFabIGja~GlbTGiaRG]aGG\bcFZ`|G^a]GbahG_asGa_yGo`OGn`DGm`eGd`ZGe`qGcbqFacWGhcLGfcAGgb`GYbkGZbvG[bFCwDNbGB_CybECvEE_ABUCpbrFbbSCr`pBRCqbZCubYCsGvb[CtbOCebQCdbPCcbLCkFG_?BNCjbsFc_@BMCibVCoEfbXCnE[bWClEPbKChE|bHCfEqbJCgFHdvdxdwbfF`dkdjdid~e?d}d|dydzdobdF_drdqdtdudsdndldm`aEDEs`bEFErbeF]`cECEt`QDpEo`SD{En`RDeEp`gEIEl`dEHEk`fEGEm`VEBEh`UEAEi`TE@EjbjFT`\EKEg`]ELEe`[EJEd`^DCEw``DOEv`_DZEu`YCmEy`WCxEx`XCbEzdyFzavBGHfblFVdzFyd|Fx_EDjFu_GDkFw_FDiFvdtFqduFsdsFr_JDvFl_IDxFkbmFU_HDwFm_CE?G@_DD~F~d}GAdqFodoFndrFpdnF}dmF|dlF{c{IFcJHtcIHucHHsbzHkbyHjbxHicFHocGHlcEHmcDHrc|ICcCHpcBHqc@Hab~H`c?H_btHgbwHhbuHfb}Heb{HbczIEb|Hdj]DBIAJUi|jRjGjhDAI@JVjkDOHFdCHGdZHEeAGueBGse@GteGGyeHGzd@IBJTeIGxcbH@cmH?cxG~dpHCdeHDd{HAeCG}eFG{eDG|dMHzJfeJGpeLGqeKGrgFIzgEI{gGIygSIngRImgTIlgIIwdPH{JdgHIxgKIvgMIkgNIigLIjgBIugCItgDIsgOIrgPIpauBEHhdQH|JegQIogXIggVIdgWIh_ZAH_YAF_[AI_RAE_TAD_SACdGHwJi_PAT_QAV_OAU_`AQ__AP_aAS_LA@_KAB_NAA_^ANdIHvJj_]AO_\AM_WAL_UAJ_VAKdhIKdgILdfIJdWH|dVH{dHHxJgdUHzdcICddIEdbIFdaIId`IHd_IGd^I?d\H~d]H}c}H~JadRIAdTIBdSI@d[HxdXHvdYHw`_@jK_`^@hK]``@iK^`\@{Koc~H}Jc`]@zKp`[@yKn`S@rKc`R@oKa`Q@nKb`c@}Kg`aA?Kh`b@~Ki`d@sKl`g@uKmd?I?Jb`f@tKj`X@vKZ`W@wK\`Y@xK[`U@kKe`V@lKf`T@mKd_{JN_zJM_|JOdDIIJW`CJF`FJH`EJI`GJ?`II~`HI}`@JE`BJD`AJC`MJKdFIGJY`NJJ`PJL_}JA_~J@`?JB`LJP`KJS`JJQ`GEaK{`IEcK|dEIHJX`HEbK}_|EMKz_{EOKy_zENKx`LESLC`JEQLB`KERLD`EE^L?`FE`K~`CE_L@bBBSHidJIKJ\`NE]Kr`MEZKq`PE\Ks_~EVKu_}EUKw`?ETKt`@EWLG`BEYLE`AEXLFevHcdKIJJZewHXeuHnekHBemGwelHMeoG?epFtenGJeiGkehG`dLILJ[ejGUezFSeyFiexF^etIqesIZerIfeeIDedHyegIO_]KiLib^FIJeb\FEJfb]FFJdbpFQJ\boFRJ[bnFPJZbfE~JbbeE{JcbdE}JabqFLJ`_^KgLkbsFJJ_brFKJ^bgFMJXbiFOJWbhFNJYbjF?JjblFAJgbmF@JibaFCJUbbFDJT_\KhLjbcFBJVePLVefLUe[LX_?LTfGLS_@LRkTL]gvL\ieL^_D?PKeL`b_LQeELOdNLPfHLMeqLKe|LNlJlIMClHl[_C?QKdLa`pLZ_ALYcZHMIYcYHBIXc[GwIWcRIZIccTIaIqcSIbIfcNFtI_cKG?I`_OKfL_cMGJI^cVHcINcUHXIPcXHnIMc_FiIVc`FSITcaF^IUcPG`I]cOGkI[cQGUI\_J?ZK_Lqc^IDIQc]IOISc\HyIR`fD^HOJn`gD\HQJo`dD]HPJp`]DdH]K?`[DcH\KA`\DbH^K@`VDUHLJ|bCBRHjNM_I?YK]Lr`UDVHKJ}`TDWHNJ{``D`HHJx`_DaHJJz`^D_HIJy`WDhHTJm`XDgHRJl`YDfHSJk`bDRHZJt`cDTHYJr_H?[K^Lp`aDSH[Jq`SDYHWJw`QDXHUJv`RD[HVJu_nAsCn_cAhCl_XA]Co_MCACrcWCq_BCLCp_aK[Lt`ZCk`eCi`qCjbICga~CfbTCh`OCw_yCv`DCyaGCd_`KZLuaRCc`|CebkCtbvCub`Cs``DtEIFj`^DsEHFh`_DuEGFg`dDxEDFf`gDwECFd__K\Ls`fDvEFFe`QDqD{Fa`SDeDrFb`RDoDpFc`cDODmFV`aDCDlFU`bDZDnFT`UDzELFY`VD|EKFX`TDyEJFW_E?TKoLh`]CmD~F\`\CbD}FZ`[CxE?F[`XDjEBF``YDiEAF]`WDkE@F___C[L~NB_`CYM?N@_aCZL}NA_SCaMJNM_G?RKnLf_RC`MINO_TC_MHNN_NCPLzNP_LCQL|NS_KCOL{NR_WC^MGM}_UC\MFN?_VC]MEM~_ZCNMMND_YCKMKNE_F?SKpLg_[CMMLNC_QCVM@NK_OCXMANJ_PCUMBNL_\CSLvNI_^CRLyNG_]CTLwNH`rJqKL`nJtKM`oJrKN_KKbLla?K@KX`}K?KY`~KAKW`hJoKV`iJnKS`jJpKR`sJkKH`uJmKK`tJlKJ`{JwKD_NKaLo`zJuKC`yJvKB`kJ|KG`lJ{KE`mJ}KF`xJzKQ`vJxKP`wJyKObfKFMXbeKEM[bDBUHkNO_LKcLnbdKGMYbpKQMQboKOMPbnKPMNbsKWMcbqKXMdbrKYMbb\KMMab^KNM_b]KLM`_VKmLcblKJM\bmKKM^bjKHM]bgKBMUbiKDMWbhKCMVbaKVMTbcKSMSbbKRMRaNFwGT_WKjLeaMFvGSaOFuGRaFGAGPaIF~GOaHG@GQaAF{GKaBF|GHa@F}GIaKFlGFaJFmGE_UKlLdaLFkGGaSFnGXaQFpGWaPFoGVaTFsGCaUFqGBaVFrGDaDFzGNaCFxGMaEFyGLgPGgOOmnP]P~mmP^Q@mlP\Q?_nM|PQQG_XMzPOQF_cMyPPQEmxPXQL_BMwPUQM_MMvPWQKmqP[QBQNgOGhONmrPYQDmoPZQAQYmkPMQJmiPNQImjPLQHmsPJP{muPHP}mtPIP|mgPTPymfPSPzgQGfOMQZmhPRPw`BAjIELA`AAgICLW`@AiIFLL`NAfI?Js`PAeH}J]`MAdH~Jh`?AXHzMO_~AYH|MZ_}AWH{MDgKGcOYQQ`HAmIKLx`IAlILLb`GAkIJLm`KAbHwJ~`JAaHvKU`LAcHxKI`CA`IIJR`FA_IHI|`EA^IGJG_zAZIAKvgHGeOXQP_|A\I@Kk_{A[IBK`_vCoJ`ND_wClJ^NE_xCnJ_NC_mCyJdNO_lCvJeNN_oCwJfNM_kCdJiN@_jCeJjNBgIGdOWQO_iCcJgNA_hCtJWNL_fCsJYNK_gCuJXNJ_rCkJUNS_qCiJVNP_pCjJTNR_eCgJ\NG_bChJ[NH_dCfJZNIa{B[HdNPgTGaOQQa_tCpJcM}_uCrJaN?_sCqJbM~bYDuJULkb[DtJTLjbZDsJVLibQD~JdLrbPE?JeLpbOD}JfLqbNDjJ^LtgSG_ORQ_bMDkJ`LubLDiJ_LsbWDvJWLobXDxJYLlbVDwJXLnbKDzJZLcbHDyJ\LebJD|J[LdbUDrJjL`bSDoJiLagRGbOPQ`bRDqJgL_bGDmJaLhbEDnJbLgbFDlJcLfc@HKMSc?HNMRb~HLMTcJHJM^cIHIM\cHHHM]gWG[OUQ]cGH\MbcFH^MccEH]MdbxHZMYbzHYM[byH[MXb}HRMVb|HTMWb{HSMUcCHUMNgXGZOVQ^cDHWMQcBHVMPbtHQMabuHOM`bwHPM_fYJKN]PpfXJLN[PnfWJJNZPofjJONjPkfgJNNiPjgVGYOSQ\fhJMNhPlfdJSNePffeJPNfPdffJQNdPefTJDN_PufVJEN`PtfUJCN^Pvf`J?NcPhf]I}NbPif_I~NaPggEGlOLQbf[JHNWP`f\JINYP_fZJFNXPcfaJBNUPsfcJ@NVPrfbJANTPqfnL?OLR{fpL@OKRyfoK~OJRzfwLDOYRwgFGjOJQefvLBOWRxfuLCOXRvg@LEOVRogALFOSRpf~LGOURqfzKsORRtfxKqOQRufyKrOPRsf{KwODS?f}KtOER~gGGiOKQcf|KuOCR|fkKyONSAflKzOOS@fmKxOMSBfrK|OFRmfsK}OHRlfqK{OGRnbQBsInM{bOBrImMebPBqIlMpgCGnOGQUbYBiIzPmb[BgI{QCbZBhIyPxbXBeIvPVbVBdIxPKbWBfIwPbbUBmIgOIbSBlIdO_bRBjIhOTbGBbIuN\\") loz1320 =Graph(r":~?Sg_?_?_?_?_E?D_D_D_D_J?I_I_I_I_O?N_N_N_N_T?S_S_S_S_Y?X_X_X_X_^?]_]_]_]_c?b_b_b_b_h?g_g_g_g_m?l_l_l_l_r?q_q_q_q_w?v_v_v_v_|?{_{_{_{`A@@`@`@`@`F@E`E`E`E`K@J`J`J`J`P@O`O`O`O`U@T`T`T`T`Z@Y`Y`Y`Y`_@^`^`^`^`d@c`c`c`c`i@h`h`h`h`n@m`m`m`m`s@r`r`r`r`x@w`w`b@w_o@w`}@|`|`|`|aBAAaAaAaAaGAFaFaFaFaLAKaK`HAKaKaQAPaP_QAPaPaVAUaUaUaUa[AZaZaZaZa`A_a_a_a_aeAdadadadajAiai_pAi`aAiaoAnanananatAsasasasayAxaxaxaxa~A}a}_VA}a}bCBBbB`CBBbBbHBGbGbGbGbMBLbL_eBLbLbRBQbQ`RBQbQbWBVbVbVbVb\B[b[bFB[aSB[baB`b`b`b`bfBebebebebkBjbj_MBj_~BjbpBoboalBobobuBtbt`uBtbtbzBybybybyc?B~b~`WB~b~cDCCcC_`CCcCcICHcHcHcHcNCMcMaTCMbECMcSCRcRcRcRcXCWcWcWcWc]C\c\`?C\_LC\cbCaca`zCacacgCfcfagCfcf`A`A`AcoCncnaICncnctCscsavCs_ACscy?UCxcx`_Cxcxc~C}_jC}cjC}bwC}`I_fDB_HDBdB_}_VDFdF_rDF_EdJ`qDJabDJ`K`KCP`K_B_iDQdQ_xBYDQ_O_O_OdYDXdXa{DXdXd^D]d]aDD]_sD]dc@GDbdb_mDbdbdhDg`\DgbxDgciDg_W`XDl_zDldl_K`HDpdp_@Dp_wdtacDt`pDt_Y_YB^_Y_t`[D{d{_FCKD{ae`NAe_[AeeCEBeBbmEBeBeHEGeGcZEG`eEGeM@yELeLbCELeLeREQaNEQ_tEQdTEQamaJEV`lEVeVaa`zEZeZaVEZ`ie^bUE^cFE^aoaoDjao`faMEeeea\C{Ee`s_\@s`M@semElelc_ElelerEqeqbhEqaWEqewAkEvevaQEveve|E{b@E{_BE{d~E{`{a|F@a^F@f@`oalFDfD`dFDa[fHcGFHbTFH`}`}D@`}aXb?FOfO`jDeFOcIarCI_aA?CIfWFVfVdLFV`NFVf\F[f[drF[`aBIF[faB]F`f`cgF`f`ffFebrFe_fAXFeehFecQbnFjbPFjfjcEb^FnfnbzFnbMfrcwFrd`FrcScSE~cSbJbqFyfyc@EOFybWa@BW`SAqBWgAG@g@dvG@_\G@gFGEgEdHGE_oB{GEgKCOGJgJbuGJgJgPGOcdGO`X@fGOfRGOb_c`GTcBGTgTbScPGXgXbHGXc?g\daG\cvG\babaETbab|ccGcgcbNEyGccVDcaEBcDc_h_hE`_hAr`C_FGlgl_TFFGl`PD?`PD|`PgtGsdOGsaJB|Gsf|GsdkdMGxcrGx_PGxd__dD@G|_JG|dUG|co_yH@eKH@etH@_uDmdm`LCl_eHFdZFcHFbdCyawCUCy`Z`ZFJ`ZA@_Q_xHNhN`FE\HN_^Di_^DR_^hVHUdyHUa|BJHUgfHUdAdwHZd\HZ`BHZcu`VDjH^_|H^ckH^dY_GHbeuHbeJHb_CDCdC_ZDV`WHhcpGMHhdoEw`IBiEwaLaLFt`\ALCVag`jHphp`xGZHpatES_aAtFPathxHwecHwbnDVHwhHHwf?eaH|eFH|`tH|esaHETI@`nI@eiI@eCa]IDf_IDgHIDaYFAfAapE@aIIJenGqIJdEEM_WC[EMa~a~G^_jA~Bd`ua\IRiRajFpIRaBE}`SABEfaBiZIYfMIYc`ClIYhjIYeUfKI^epI^afI^eIazE~Iba`Ibe?Ibem`kIfgIIff^If`gEWeW`~Eja{IleDHSIlfCGKamDIGKbpbpHBb@BpDocKbNItitb\H`ItcXFg`]AECXGd_jCXi|I{fwI{dMEjI{iLI{gSfuJ@fZJ@bXJ@gGblFhJDbRJDf}JDfWcAJH`CJHhQJHb}GUgUcTFTbmJNgBHuJNeYFa`{DsFacbcbHdaNCbDEbYc@JVjVcNG~JVbfGQ_kAwBfFz`\Bfj^J]gaJ]dwE@J]inJ]fig_JbgDJbcJJbf]c^GRJfcDJffSJfgAbOJj_QJjgoJjbKFkfkbbF~c_JpfXIWJpgWHR_TCQE]HRdNdNIFcdDNFC_mCp_mC~IddqGu_ZBABiDq`U`UEaF~`UJPhYhCK?gkK?czK?hPdKGvKCctKC_UKCgid[KG_PAgKGiUKG_~DWH[h[`]DnGg_\DLKMfmGp`FB_FGGpdxdxIhbrDxEY`_DZ`_DhIBdGHW`LAOC[DG_c_cFKFT_cJrgwheK[hMK[ddK[gnduHXK_d^K_`GK_hKcqKc`B@uKchsKc_LCmGygy_kDDHI`NDvKih]IV`xDkFqIVebebJJdyEbGWaQEDaQERJhfEHy`~CeDIFEayayFuHI`]Ayi]iGKwhoKw_LENKwiTe_HzK{eHK{`yK{hmeoL?_u@tCKL?jYL?abEkI_i_bAFBHka@E`LEg{HtajDAG[HtfLfLJldOFLFmbCEnbCE|JFe[I[apBsDsE[aGaGG_Gg_kAGh{iiLSiQLS_~ExLShrfII\LWerLWakLWiOeEL[_CAfBYL[iwL[`pEAH}h}aOEXIMarFJLaiaJZb\F?H?JZfvfvKIfMFvH]buFXbuFfKagYI}bbDzE]GYc]c]HCIMbAC]jajKLoisLo`pFbLojXfsI~Lsf\Lsb]LsiqgCLwaYBXDeLwkULwcFG?JcjcceGVIobdFtL}i?IxcNEUHaIxg`g`KeecG`G{cgGBcgGPKEfoJ_cTDPFGFobkbkHeHkaOBkj?jmMKjUMKabGLMKivg]J`MOgFMOcOMOjSfYMS`gCJC{MSjyMSbTFUJAjAbsFlJQcVG^MYjeKVc~GSICKV_RHDgaHDIadRGtLYdDFNFqH__wIGJQ_wCe`RKZ_TKJMcjwMc``HAJ}``Gm``D?juhLMib}CzEyMilMMid`HJK\__K\dzH\Js_sDEHBMojCJzdhFiIeJz`DHffwHfI?d|HVK}dnEdG[G}_EIiIo_EBs_`J~`FKfMykSMy_nHcKY_nHO_nDikQgjN?bKDdEON?kqN?cvGhK@`QK@dPGzKO_ADoHdNEk^LNeRHYJGLN`vIH_fIHJeefHxMQeXGbH?Ica[JKKOa[DzavLR`xLBNOkoNObDIEKubDHqbDESkmiPNUdWENGMNUmENUetINLTaCLTfNI`KkaWEYIFN[kBKre|GwJiKrahIj`XIjJCfPIZLufBFxHaIA`iJmJs`iDPaDKvajL^NelKNeaRIgLQaRISaRE}lIhnNkcmExFcNkliNkeJHlKxauKxedH~LG`eFCIhNqlVMFffI]KFMFbZJLaJJLK^fzI|M}flHgICJgc?KJLG_GC?FNcZMJb\LzN{lgN{chJILm_pChIuchFglejTOAekFbHSOAmuOAgHJRMLbgMLgbJdLcb{FmJJOGkzLjgPH{KbLjcLJna|JnKBgdJ^MggVHEIeJEbMKfKk_yBMEdbhLncNMVOQmCOQbvJkMI`bBvJWbvGQmAirOWeAGLGqOWm_OWf^IpLpcYLpfxJBM?bIGWJlO]_dMN_dGtJaK~_@C|KK`LJ|NigzIkJGK`dYLBM?_J@kDYGbdrMxc~MlOf__M^Ofd}KHMaaTD}Jxd}Gu`SM]_pKROlnaOl_}Mz_PHgK]M[`VLr`VHVJ?LZ_rDfKg_ZKXNSh\IIJiKDcoL^Lc_|A]CoFxdHMbdhNBOx`QMtOxdSKdMwbFDSKTdSHW_aMs`bJvO~nKO~_KMd`BHEKAMq_`AHaHHxKZLv`dEPLCapKtOUh~JoKFLXemLzMq`nBOEmHgfFNdeRNXPJaCNJPJfQL@NM_HBxFQKp_yFQHyawNIaTLJPPoMPPaaNf`tIkLUNG`RAzazIZJ~MRaVEzL_`~LPO?i`JMKbK|eCMVM[a`CAECHEe\NNe|NnP\auN`P\egL\Nc_zCjEgLL_GEgI[aEN_bFKnPbnwPb`oNPafIIKyN]aDBlblI|LRMhbHFdL{cTLlO|jBKhK~MPgAMlN]bRCqGAIkgZOPffODPnbgNvPngeLxNy_B@lGeLha]GeI}c[NubxMBPtotPtcEORbXJoMMNsavC^c^J^KvM~bzGNMWbbMHOjjdKLLZLtfWNBNGcDD[FWIIfpNzgPOZQ@cYOLQ@f{MTOO_tA^F{MD`kF{J_biOKcjLfQFobQFbSN|cJJMLqOI`QBhDKdKJ|MJNT_[CkGrMmkAL`LvM|hKNXOIctEEHKJo_|GtOnhiMjOd_i@fBPHi_@PXd_OyczKhM{O___CZDuduKXLnNj`MDUHTNCk]LDMRMfgiNnNsd^EoGiJM_JHVP@hGN@Ov`[AXCBHG_rPFcuOgddKLMeOqauDHE_e_KtMxO@a?E?HvNYkyMXMhNhiOODOqeHFYIOKha`HxPRimNVPHaMBJCrIm`D@dP|_MEsP]eNL`NgPCaCDrFIfILPMbOVaqEiIXNolUL|M~NRhmOZO_erGCHmKL`nIZPdiKNlPZb?B|D\IK_RAVPj`?EIPKexLDNQPU_RCYE\FsfsLlNdOkbcFSIzOElqNDNTOTjSOnPUf\GjJSL`cDI|PvjqOBPlbqClEFJq_HAhBH_[@qGGQAfbMXOSPg`DBgFFG]g]MHNNO}cUF}J\O[mMMnNjN~iqP@PCgFHLIqLDbRJ^QHjOOXP~ccDVEpJO_z@vBz`MAcF]PogLL|N}Py_K@vFpHAmeNpO@O{_AKQPRPygmHnKQMX_oD^J|QT_MKjOmQO_x@lCLCka?BUHPQ]_}AhGZHcm{NZOVOi_sJuPdPghOIPJuL|`aCtKXQ``?KNP?Q[_FA^BZDUaqCGGnQQ`oBZG~IEnQO\OkP_`eLIPvQWhqIrLINDaSErKtQl`qLbPQQga\BPDfE?bcCwITQuaaCLH`IgngOFO}PMaWKmQHQKiSJTKmMnbEEHLPQxacLFPcQs`jCBC|EicUDaHrQibSC|IBJIn}PAPOQCbIMAQTQoiuJvMANpbwGFLlRDbUMZPuR?c@CrEzFS`IEKJXRMcEDfIdJkoSOoPaPqb{LeQ`QcjWKRLeNZciF\MHRPcGL~QGRKbND\EPF}_WEuIvRAcuEPJFKHohPePsQ^jxKnMsO\`GDZEFGNd_EzJhKdozPSQEQRkTLJM]OF_UCpEpFdeIFdKEL@`WPLQIQvkpLfN_PAakEnFZHTesGNKaL\_eP^PwQjlLMBNIOo`yEDGDGrf]GrK}Lxa{PpQaRN_uLhOKPecOGBGkIXgGHTLYMTaIQBQURB_CMDNuPSb]FXHMHvgnHvLuMj_iAYOsQIhPIXMQN@`[@gOaPwhrIzMgNVaMB}PWQaiTJ\M}Nlb?BKPEQU`HIvNSOBbqDWP{Qy_VJXNiOXccCmPiQm") dhar1344nx =dhar1344.networkx_graph() loz1320nx =loz1320.networkx_graph() # List of graphs to process graphs = [('dhar1344 ', dhar1344),('loz1320 ', loz1320)] 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 domination_number(G): """ Compute the domination number of a graph G using MILP. INPUT: - G: a SageMath Graph OUTPUT: - The domination number (integer) """ p = MixedIntegerLinearProgram(maximization=False) x = p.new_variable(binary=True) # Objective: minimize the number of chosen vertices p.set_objective(sum(x[v] for v in G.vertices())) # Constraint: each vertex is dominated for v in G.vertices(): p.add_constraint(x[v] + sum(x[u] for u in G.neighbors(v)) >= 1) return p.solve() 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 properties for each graph in the list print("\n Main properties of the graph\n") for label, graph in graphs: 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: {domination_number(graph)} ") print("Degree histogram :", nx.degree_histogram(dhar1344nx)) print("Degree histogram :", nx.degree_histogram(loz1320nx)) print("\n Symmetry properties of the graph\n") for label, graph in graphs: 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("\n") ''' compare_graphs_list(graphs) ''' # automorphism group structure print(" Automorphism group structure: x means direct product; : means semidirect product.") Adhar1344 = dhar1344.automorphism_group() print('dhar1344:', Adhar1344.structure_description(), ' | center order:',Adhar1344.center().order()) Aloz1320 = loz1320.automorphism_group() print('loz1320 :', Aloz1320.structure_description(), ' | center order:',Aloz1320.center().order()) print("\n") ''' 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()} \\\\ ") ''' # 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 for label, graph in graphs: print(f"{label} distance distrib from vtx. 0: {distance_distribution(graph, 0)}") print(f"{label} distance distrib from vtx. 9: {distance_distribution(graph, 9)}") # Counting k-cycles for each graph print("\nNumber of k-cycles for k=3 up to 7") for label, graph in graphs: print(f"{label} ", " ".join(str(count_k_cycles(graph, k)) for k in range(3, 8))) print("\n") ''' # from 0 versio Molodtsov for name, G in graphs: 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 graphs: 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 graphs: 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") ##