/* newgen.c */ #include "def.h" #include "macro.h" static INT o_grenze; static INT my_operate_perm_vector(ii,a,b,c) OP a,b,c; INT ii; /**************************************************************** Input ii = INT, Index, der die Tiefe der Rekursion anzeigt, und damit zusaetzlich noch angibt, dass die anzuwendende Permutation die Stellen 0,...,ii-1 nicht veraendert. a = PERMUTATION b = VECTOR, auf dem a operiert, die Eintraege an den Stellen 0,...,ii-2 sind dabei nicht mehr angegeben natuerliche Operation einer Permutation aus S_n auf einem n-elementigen Vector Output c = VECTOR, Ergebnis der Operation von a auf b, a und b stimmen auf den Stellen 0,...,ii-1 ueberein, d.h. c wird erst ab der Stelle ii angegeben. Return OK ******************************************************************/ { INT i; INT erg = OK; for (i=(INT)ii;iS_V_II(b,k)) { if (k==j) return(1L); else return(2L); } } return(3L); } static INT my_sims_kette(a,in,b,anz,zibasis) OP a,b,anz; INT in,*zibasis; /*********************************************************************** Input a = VECTOR von PERMUTATIONen, der ein Erzeugendensystem einer Permutationsgruppe enthaelt in = INT, Maechtigkeit des Definitionsbereichs Output b = MATRIX, die ein System von strong generators der Permutationsgruppe enthaelt, dabei sind alle Eintragungen in b invertiert worden die Diagonalelemente sind stets die Identitaet anz = VECTOR, S_V_I(anz,i) enthaelt die Anzahl der Eintragungen in der i-ten Zeile von b, die verschieden von dem EMPTY Objekt sind. Diese Objekte liegen an den Stelle S_M_IJ(b,i,j) fuer i<=j0L) i=i-1L; *zibasis=i; ENDR("my_sims_kette"); } static INT next_vector_ogrenze(i,v,n) OP v; INT i,*n; /*********************************************************************** Input i = INT, gibt an ob der zuletzt berechnete charakteristische Vektor zu einem kanonischen Rep. gefuehrt hat (i=1L) oder nicht (i=0L) Input und Output v = VECTOR, mit 0,1-Eintragungen, es wird lexikografisch der naechstmoegliche Vektor (unter Verwendung der "Lerneffekte" bestimmt, der eine maximal vorgegebene Anzahl von 1-en nicht ueberschreitet) n = *INT (k+Anzahl der Einsen in w), wobei k die Dimension der linearen Codes darstellt Return 2L falls alle Kandidaten aufgelistet wurden 1L sonst ***********************************************************************/ { INT j,k=-1L,l,max=S_V_LI(v)-1L; for (j=max;j>=0L;--j) if (S_V_II(v,j)==1L) { k=j; j=0L; } if (k==max) { lab030697: l=k; for (j=k-1L;j>=0L;--j) if (S_V_II(v,j)==1L) { l=j; j=0L; } if (l==k) return(2L); /******************************************* alle Moeglichkeiten aufgelistet ********************************************/ M_I_I(0L,S_V_I(v,l)); --(*n); ++l; if (S_V_II(v,l)==0L) { M_I_I(1L,S_V_I(v,l)); ++(*n); } for (j=++l;j= 0L) { if (S_V_II(v,i)nj) { e=ni; ni=nj; nj=e; }; /* ni < nj ist ergebnis der permutation */ /* nun nur noch die nummer zu bestimmen */ /* sie ist e */ e = ni+(nj-1L)*(nj-2L)/2L; /* e ist die nummer des neuen paars */ M_I_I(e,S_P_I(b,z)); z++; }; /*println(b);*/ return erg; } static INT next_graph_ogrenze(i,v,n,w,vertices) OP v,w; INT i,*n,*vertices; /*********************************************************************** Input i = INT, gibt an ob der zuletzt berechnete charakteristische Vektor zu einem kanonischen Rep. gefuehrt hat (i=1L) oder nicht (i=0L) Input und Output v = VECTOR, mit 0,1-Eintragungen, es wird lexikografisch der naechstmoegliche Vektor (unter Verwendung der "Lerneffekte" bestimmt, der eine maximal vorgegebene Anzahl von 1-en nicht ueberschreitet) n = *INT (k+Anzahl der Einsen in w), wobei k die Dimension der linearen Codes darstellt Return 2L falls alle Kandidaten aufgelistet wurden 1L sonst ***********************************************************************/ { INT j,k=-1L,l,max=S_V_LI(v)-1L,m; /*printf("i=%d n=%d vert=%d\n",i,*n,*vertices); println(v);println(w);*/ for (j=max;j>=0L;--j) if (S_V_II(v,j)==1L) { k=j; j=0L; } if (k==max) { lab030697: l=k; for (j=k-1L;j>=0L;--j) if (S_V_II(v,j)==1L) { l=j; j=0L; } if (l==k) return(2L); /******************************************* alle Moeglichkeiten aufgelistet ********************************************/ for (j=*vertices;j>=1L;--j) if (l>=S_V_II(w,j-1L)) { *vertices=j; if (l==S_V_II(w,*vertices-1L)) goto weiter; if (l+1L>=S_V_II(w,j)) { for (m=S_V_II(w,*vertices-1L);m=S_V_II(w,*vertices)) ++(*vertices); for (j=++l;j=S_V_II(w,*vertices)) ++(*vertices); M_I_I(1L,S_V_I(v,k)); ++(*n); return(1L); } else goto lab030697; } INT number_of_simple_graphs(a,d) OP a,d; /*********************************************************************** Input a = INTEGER Output d = Anzahl der einfachen Graphen auf S_I_I(a) Knoten Return OK oder ERROR; ***********************************************************************/ { INT erg=OK; OP b=callocobject(); OP c=callocobject(); if (S_O_K(a)!=INTEGER) WTO("number_of_simple_graphs",a); if (!emptyp(d)) erg+=freeself(d); erg+=zykelind_Sn(a,b); erg+=zykelind_on_2sets(b,c); erg+=polya_const_sub(c,cons_zwei,d); erg+=freeall(b); erg+=freeall(c); ENDR("number_of_simple_graphs"); } INT numbers_of_simple_graphs(a,d) OP a,d; /*********************************************************************** Input a = INTEGER Output d = VECTOR, S_V_I(d,i) ist die Anzahl der einfachen Graphen auf i+1 Knoten Return OK oder ERROR; ***********************************************************************/ { OP hilf=callocobject(); INT i,erg=OK; if (S_O_K(a)!=INTEGER) WTO("numbers_of_simple_graphs",a); if (!emptyp(d)) erg+=freeself(d); erg+=m_il_v(S_I_I(a),d); for (i=0L,M_I_I(1L,hilf);i1L) erg+=M_I_I(1L,S_V_I(v,1L)); i=2L; for (M_I_I(3L,help);S_I_I(help)<=S_I_I(a);inc(help)) { erg+=m_i_i(0L,hilf3); first_part_EXPONENT(help,part); next(part,part); do { /*println(part);*/ m_i_i(1L,hilf2); for (j=1L;j0L) { erg+=zykelind_Sn(S_PA_I(part,j),hilf); erg+=polya_const_sub(hilf,S_V_I(v,j),hilf1); erg+=mult_apply(hilf1,hilf2); } /*println(hilf2);*/ erg+=add_apply(hilf2,hilf3); } while(next(part,part)); /*println(hilf3);*/ erg+=sub(S_V_I(sg,i),hilf3,S_V_I(v,i)); ++i; /*println(v);*/ } erg+=freeall(help); erg+=freeall(part); erg+=freeall(hilf); erg+=freeall(sg); erg+=freeall(hilf1); erg+=freeall(hilf2); erg+=freeall(hilf3); ENDR("numbers_of_connected_simple_graphs"); }