/* CF.c */ #include "def.h" #include "macro.h" INT inumber_of_fixed_points(); INT number_of_fixed_points(); INT inumber_of_cycles(); INT number_of_cycles(); INT CF(); INT CF_from_zykelind(); INT CF_right_sur(); INT CF_left_sur(); INT CF_left_right_sur(); INT CF_right_inj(); INT CF_left_inj(); INT CF_left_right_inj(); INT gen_arb(); INT gen_Sn(); INT gen_Cn(); INT gen_Dn(); INT gen_In(); INT gen_An(); INT gen_An_3(); INT gen_M24(); INT dir_sum_perm(); INT gen_dir_sum(); INT dir_prod_perm(); INT gen_dir_prod(); INT gen_on2sets(); INT generator_test(); INT t_kranz_plethysm(); OP s_kr_gi(); OP S_KR_GI(); INT s_kr_gii(); INT S_KR_GII(); OP s_kr_ij(); OP S_KR_IJ(); INT s_kr_iji(); INT S_KR_IJI(); INT gen_full_mon_group(); INT gen_plethysm(); INT gen_centralizer_permutation(); INT gen_stabilizer_partition(); INT gen_young_group(); INT zykelind_In(); INT degree_from_zykelind(); INT zykelind_M24(); INT Bell_numbers(); INT Bell_number(); INT Bell_number_recursive(); static INT bellrec(); INT polya_compl_sub(); static INT sum_ueber_alle_teiler(); INT comp_le(); INT prod_binom(); static INT first_unordered_part_into_atmost_k_parts(); static INT next_unordered_part_into_atmost_k_parts(); /* **************************************************************** Some basic routines for enumeration under finite group actions. ******************************************************************* */ INT inumber_of_fixed_points(a) OP a; /* a eine PERMUTATION int Ergebnis ist Anzahl der Fixpunkte */ { INT i,j; j=0L; for (i=0L;i Y where the group actions on X an Y are given by their cycle index. ******************************************************************** */ INT CF(a,b) OP a,b; /* a ist ein VECTOR, dessesn Komponenten PERMUTATIONen sind. Dies sind die Elemente der operierenden Gruppe. b ist Anzahl der G-Orbiten. */ { INT i,j; OP hilf=callocobject(); copy(cons_null,b); for (i=0L;i2L) { /* two generators */ m_il_v(2L,b); for (i=0L;i<2L;++i) m_il_p(S_I_I(a),S_V_I(b,i)); hilf=S_V_I(b,0L); /* transposition */ M_I_I(2L,S_P_I(hilf,0L)); M_I_I(1L,S_P_I(hilf,1L)); for (i=2L;i=1L) l=S_P_LI(S_V_I(a,0L)); for (i=1L;i 0 falls i=1,3,5,7,9... und 2 falls i=2,4,6,8,... */ { OP c,d; INT i; INT erg=OK; if (S_O_K(a)!=POLYNOM) return error("polya_compl_sub(a,b) a not POLYNOM"); if (not EMPTYP(b)) erg+=freeself(b); c=callocobject(); d=callocobject(); numberofvariables(a,c); m_l_v(c,d); for (i=0L;i a[i]<=b[i] fuer alle comp_le ==1 sonst */ { INT i; if (S_O_K(a)==PARTITION) { for (i=0L;(i S_PA_II(b,i)) return(1L); } for (;i S_V_II(b,i)) return(1L); } if (S_V_LI(a)>S_V_LI(b)) { for (;i=0. Diese Darstellung wird als VECTOR a weitergegeben. */ OP a; INT k,s; { int i; INT erg=OK; if (!emptyp(a)) freeself(a); m_il_v(k,a); for (i = 0L;i < k-1L; M_I_I(0L,S_V_I(a,i)) , ++i) ; erg+=M_I_I(s,S_V_I(a,k-1L)); if (erg!=OK) error(" in computation of first_unordered_part_into_atmost_k_parts(s,k,a) "); return(erg); } static INT next_unordered_part_into_atmost_k_parts(a) /*next_pa_into_atmost_k_parts(a)*/ OP a; /* Berechnet den Nachfolger der Darstellung einer natuerlichen Zahl als Summe von hoechstens k Summanden >=0. Die natuerliche Zahl ist dabei die Summe ueber alle Elemente von a, k ist die Laenge von a. */ { int i; if (S_O_K(a)!=VECTOR) return error("next_unordered_part_into_atmost_k_parts(a) a not VECTOR"); i=s_v_li(a)-1L; while( nullp(S_V_I(a,i)) && (i>=0L)) --i; if (i<=0L) return(2L); /* alle aufglistet */ copy(S_V_I(a,i),S_V_I(a,S_V_LI(a)-1L)); dec(S_V_I(a,S_V_LI(a)-1L)); inc(S_V_I(a,i-1L)); if (i