1 #include "def.h"
2 #include "macro.h"
3 
4 
5 INT the_integer__faktor();
tse_integer__faktor(a,b,f)6 INT tse_integer__faktor(a,b,f) OP a,b,f;
7 {
8     INT erg = OK;
9     CTO(INTEGER,"tse_integer__faktor(1)",a);
10     CTTO(HASHTABLE,ELMSYM,"tse_integer__faktor(2)",b);
11     SYMCHECK((S_I_I(a)<0),"tse_integer__faktor:integer < 0");
12 
13     erg += the_integer__faktor(a,b,f);
14 
15     ENDR("tse_integer__faktor");
16 }
17 
18 
19 INT tsh_integer__faktor();
20 INT mee_partition__();
21 
tse_partition__faktor_pre040202(a,b,f)22 INT tse_partition__faktor_pre040202(a,b,f) OP a,b,f;
23 {
24     INT t_schur_naegelsbach();
25     INT erg = OK;
26     CTO(PARTITION,"tse_partition__faktor(1)",a);
27     CTTO(HASHTABLE,ELMSYM,"tse_partition__faktor(2)",b);
28 
29     if (S_PA_LI(a) == 0) {
30         erg += the_integer__faktor(cons_null,b,f);
31         goto ende;
32         }
33     else if (S_PA_LI(a) == 1)
34         {
35         erg += the_integer__faktor(S_PA_I(a,0),b,f);
36         goto ende;
37         }
38     else
39         {
40         erg += t_schur_naegelsbach(a,b,f,tsh_integer__faktor,mee_partition__);
41         goto ende;
42         }
43 ende:
44     CTTO(HASHTABLE,ELMSYM,"tse_partition__faktor(2-ende)",b);
45     ENDR("tse_partition__faktor");
46 }
47 
tse_partition__faktor(a,b,f)48 INT tse_partition__faktor(a,b,f) OP a,b,f;
49 {
50     INT erg = OK;
51     CTO(PARTITION,"tse_partition__faktor(1)",a);
52     CTTO(HASHTABLE,ELMSYM,"tse_partition__faktor(2)",b);
53 
54     if (S_PA_LI(a) == 0) {
55         erg += the_integer__faktor(cons_null,b,f);
56         goto ende;
57         }
58     else if (S_PA_LI(a) == 1)
59         {
60         erg += the_integer__faktor(S_PA_I(a,0),b,f);
61         goto ende;
62         }
63     else
64         {
65         OP m,p;
66         m = CALLOCOBJECT();
67         p = CALLOCOBJECT();
68         conjugate_partition(a,p);
69         tsh_jt(p,m);
70         FREEALL(p);
71         tsh_eval_jt(b,f,m);
72         FREEALL(m);
73 
74         goto ende;
75         }
76 ende:
77     CTTO(HASHTABLE,ELMSYM,"tse_partition__faktor(2-ende)",b);
78     ENDR("tse_partition__faktor");
79 }
80 
81 
82 
tse___faktor(a,b,f)83 INT tse___faktor(a,b,f) OP a,b,f;
84 {
85     INT erg = OK;
86     CTTTTO(HASHTABLE,SCHUR,PARTITION,INTEGER,"tse___faktor(1)",a);
87     CTTO(HASHTABLE,ELMSYM,"tse___faktor(2)",b);
88     if (S_O_K(a) == INTEGER) {
89         erg += tse_integer__faktor(a,b,f);
90         goto ende;
91         }
92     else if (S_O_K(a) == PARTITION) {
93         erg += tse_partition__faktor(a,b,f);
94         goto ende;
95         }
96     else {
97         T_FORALL_MONOMIALS_IN_A(a,b,f,tse_partition__faktor);
98         }
99 ende:
100     ENDR("tse___faktor");
101 }
102 
tse_schur__faktor(a,b,f)103 INT tse_schur__faktor(a,b,f) OP a,b,f;
104 {
105     INT erg = OK;
106     OP z,ha;
107 
108     CTTO(HASHTABLE,SCHUR,"tse_schur__faktor(1)",a);
109     CTTO(HASHTABLE,ELMSYM,"tse_schur__faktor(2)",b);
110 
111     if (NULLP(a)) { goto endr_ende; }
112 
113 
114     if (S_O_K(a) == SCHUR)
115         {
116         if (S_L_N(a) == NULL) {
117             erg += tse_partition__faktor(S_S_S(a),b,f);
118             goto ende;
119             }
120         }
121     else /* HASHTABLE */
122         {
123         if (S_V_II(a,S_V_LI(a)) == 1) {
124             OP z;
125             FORALL(z,a, { goto eee; } );
126             eee:
127             erg += tse_partition__faktor(S_MO_S(z),b,f);
128             goto ende;
129             }
130         }
131 
132 
133     ha = CALLOCOBJECT();
134     if (S_O_K(a) == HASHTABLE)
135         COPY(a,ha);
136     else
137         t_SCHUR_HASHTABLE(a,ha);
138 
139 /* such die lex max partition  */
140 /* die partition werden lex immer kleiner */
141     CTO(HASHTABLE,"tse_schur__faktor(ha)",ha);
142     while (not NULLP_HASHTABLE(ha)) {
143         OP ff,m;
144         z = findmax_monomial(ha,comp_partition);
145         ff = CALLOCOBJECT();
146         m = CALLOCOBJECT();
147         MULT(S_MO_K(z),f,ff);
148         erg += b_sk_mo(CALLOCOBJECT(),ff,m);
149         erg += conjugate_partition(S_MO_S(z),S_MO_S(m));
150 
151         if (S_PA_II(S_MO_S(z), S_PA_LI(S_MO_S(z))-1)  == 1) { /* elmsym */
152             FREESELF(z);
153             DEC_INTEGER(S_V_I(ha,S_V_LI(ha)));
154             }
155         else {
156             INT tes_partition__faktor();
157             OP inf;
158             inf = CALLOCOBJECT(); /* invers koeff */
159             ADDINVERS(S_MO_K(m),inf);
160             erg += tes_partition__faktor(S_MO_S(m),ha,inf);
161             FREEALL(inf);
162             }
163 
164         CTO(HASHTABLE,"tse_schur__faktor(ha-i)",ha);
165         CTTO(HASHTABLE,ELMSYM,"tse_schur__faktor(b-i)",b);
166 
167         if (S_O_K(b) == HASHTABLE)
168             insert_scalar_hashtable(m,b,add_koeff,eq_monomsymfunc,hash_monompartition);
169         else
170             insert_list(m,b,add_koeff,comp_monomelmsym);
171         }
172 
173 
174     FREEALL(ha);
175 ende:
176     CTTO(HASHTABLE,ELMSYM,"tse_schur__faktor(2-ende)",b);
177     ENDR("tse_schur__faktor");
178 }
179 
180 
181 
182 
183 
184 
185 
tse___faktor_slow(a,b,f)186 INT tse___faktor_slow(a,b,f) OP a,b,f;
187 {
188     INT erg = OK;
189     CTTTTO(HASHTABLE,SCHUR,PARTITION,INTEGER,"tse___faktor(1)",a);
190     CTTO(HASHTABLE,ELMSYM,"tse___faktor(2)",b);
191     if (S_O_K(a) == INTEGER) {
192         erg += tse_integer__faktor(a,b,f);
193         goto ende;
194         }
195     else if (S_O_K(a) == PARTITION) {
196         erg += tse_partition__faktor(a,b,f);
197         goto ende;
198         }
199     else {
200         tse_schur__faktor(a,b,f);
201         goto ende;
202         }
203 ende:
204     ENDR("tse___faktor");
205 }
206 
207 
208 
209 
t_SCHUR_ELMSYM(a,b)210 INT t_SCHUR_ELMSYM(a,b) OP a,b;
211 {
212     INT erg = OK;
213     INT t = 0;
214     CTTTTO(INTEGER,HASHTABLE,SCHUR,PARTITION,"t_SCHUR_HOMSYM",a);
215     TCE2(a,b,t_SCHUR_ELMSYM,ELMSYM);
216 
217     if (S_O_K(b) == EMPTY)
218         {
219         erg += init_hashtable(b);
220         t=1;
221         }
222     tse___faktor(a,b,cons_eins);
223     if (t==1) t_HASHTABLE_ELMSYM(b,b);
224 
225     ENDR("t_SCHUR_ELMSYM");
226 }
227