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