1 #include "def.h"
2 #include "macro.h"
3
plet_schur_schur(a,b,c)4 INT plet_schur_schur(a,b,c) OP a,b,c;
5 /* AK 061201 */
6 /* AK 210704 V3.0 */
7 {
8 INT erg = OK;
9 #ifdef PLETTRUE
10
11 CTTTTO(HASHTABLE,INTEGER,PARTITION,SCHUR,"plet_schur_schur(1)",a);
12 CTTTTO(INTEGER,HASHTABLE,PARTITION,SCHUR,"plet_schur_schur(2)",b);
13 CTTTO(EMPTY,HASHTABLE,SCHUR,"plet_schur_schur(3)",c);
14
15 {
16 INT t=0;
17 if (S_O_K(c) == EMPTY)
18 { t=1; init_hashtable(c); }
19 pss___(a,b,c,cons_eins);
20 if (t==1) t_HASHTABLE_SCHUR(c,c);
21 }
22 #endif
23 ENDR("plet_schur_schur");
24 }
25
pss_ende()26 INT pss_ende() { return OK; }
27
28 #ifdef PLETTRUE
29
30 INT m_merge_partition_partition();
31 INT pss_integer_integer_();
32 INT pss_integer_partition_();
33 INT pss_integer_hashtable_();
34 INT pss_partition_partition_();
35 INT pss_partition_schur_();
36 INT pss_schur__();
37 INT mss_hashtable_hashtable_();
38 INT pss_null_partition_();
39 INT mxx_null__();
40
41 INT pss___();
42
pss_null__(b,c,f)43 INT pss_null__(b,c,f) OP b,c,f;
44 {
45 return mxx_null__(b,c,f);
46 }
47
48 INT p_schursum();
pss_integer_schur_(a,b,c,f)49 INT pss_integer_schur_(a,b,c,f) OP a,b,c,f;
50 {
51 INT erg = OK;
52 CTO(INTEGER,"pss_integer_schur_(1)",a);
53 CTO(SCHUR,"pss_integer_schur_(2)",b);
54 CTTO(HASHTABLE,SCHUR,"pss_integer_schur_(3)",c);
55 SYMCHECK((S_I_I(a) < 0) , "pss_integer_schur_:integer < 0");
56
57 if (S_I_I(a) == 0) {
58 erg += pss_null__(b,c,f);
59 goto ende;
60 }
61 else if (S_S_N(b) == NULL) {
62 erg += pss_integer_partition_(a,S_S_S(b),c,f);
63 goto ende;
64 }
65 else {
66 erg += p_schursum(a,b,c,f,NULL,pss_integer_schur_,
67 mss_hashtable_hashtable_);
68 goto ende;
69 }
70 ende:
71 ENDR("pss_integer_schur_");
72 }
73
74
pss_integer__(a,b,c,f)75 INT pss_integer__(a,b,c,f) OP a,b,c; OP f;
76 /* AK 051201 */
77 {
78 INT erg = OK;
79 CTO(INTEGER,"pss_integer__(1)",a);
80 CTTTTO(HASHTABLE,PARTITION,SCHUR,INTEGER,"pss_integer__(2)",b);
81 CTTO(HASHTABLE,SCHUR,"pss_integer__(3)",c);
82 SYMCHECK((S_I_I(a) < 0) , "pss_integer__:integer < 0");
83
84 if (S_I_I(a) == 0)
85 {
86 erg += pss_null__(b,c,f);
87 }
88 else if (S_O_K(b) == PARTITION)
89 {
90 erg += pss_integer_partition_(a,b,c,f);
91 }
92 else if (S_O_K(b) == INTEGER)
93 {
94 erg += pss_integer_integer_(a,b,c,f);
95 }
96 else if (S_O_K(b) == SCHUR)
97 {
98 erg += pss_integer_schur_(a,b,c,f);
99 }
100 else
101 {
102 NYI("pss_integer__");
103 }
104
105 ENDR("pss_integer__");
106 }
107
pss_partition_schur_(a,b,c,f)108 INT pss_partition_schur_(a,b,c,f) OP a,b,c,f;
109 {
110 INT erg = OK;
111 CTO(PARTITION,"pss_partition_schur_(1)",a);
112 CTO(SCHUR,"pss_partition_schur_(2)",b);
113 CTTO(HASHTABLE,SCHUR,"pss_partition_schur_(3)",c);
114
115 if (S_PA_LI(a) == 0) {
116 erg += pss_null__(b,c,f);
117 }
118 else if (S_PA_LI(a) == 1) {
119 erg += pss_integer__(S_PA_I(a,0),b,c,f);
120 }
121 else if (S_S_N(b) == NULL) {
122 erg += pss_partition_partition_(a,S_S_S(b),c,f);
123 goto ende;
124 }
125 else {
126 /* loop over all partitions smaller then a */
127 /* S_a[b1+b2] = \sum_d<a S_a/d [b1] * S_d[b2] */
128 erg += p_schursum(a,b,c,f,pss___,
129 pss_partition_schur_,
130 mss_hashtable_hashtable_);
131 goto ende;
132 }
133
134 ende:
135 ENDR("pss_partition_schur_");
136 }
pss_partition_hashtable_(a,b,c,f)137 INT pss_partition_hashtable_(a,b,c,f) OP a,b,c,f;
138 {
139 INT erg = OK;
140 CTO(PARTITION,"pss_partition_hashtable_(1)",a);
141 CTO(HASHTABLE,"pss_partition_hashtable_(2)",b);
142 CTTO(HASHTABLE,SCHUR,"pss_partition_hashtable_(3)",c);
143
144 if (S_PA_LI(a) == 0) {
145 erg += pss_null__(b,c,f);
146 goto ende;
147 }
148 else if (S_PA_LI(a) == 1) {
149 erg += pss_integer__(S_PA_I(a,0),b,c,f);
150 goto ende;
151 }
152 else
153 {
154 NYI("pss_partition_hashtable_");
155 }
156 ende:
157 ENDR("pss_partition_hashtable_");
158 }
159
160
pss_partition__(a,b,c,f)161 INT pss_partition__(a,b,c,f) OP a,b,c; OP f;
162 {
163 INT erg = OK;
164 CTO(PARTITION,"pss_partition__(1)",a);
165 CTTTO(HASHTABLE,SCHUR,PARTITION,"pss_partition__(2)",b);
166 CTTO(HASHTABLE,SCHUR,"pss_partition__(3)",c);
167
168 if (S_PA_LI(a) == 0) {
169 erg += pss_null__(b,c,f);
170 }
171 else if (S_PA_LI(a) == 1) {
172 erg += pss_integer__(S_PA_I(a,0),b,c,f);
173 }
174 else{
175 if (S_O_K(b) == PARTITION) {
176 erg += pss_partition_partition_(a,b,c,f);
177 }
178 else if (S_O_K(b) == SCHUR)
179 {
180 erg += pss_partition_schur_(a,b,c,f);
181 }
182 else
183 {
184 erg += pss_partition_hashtable_(a,b,c,f);
185 }
186 }
187
188 ENDR("pss_partition__");
189 }
190
191
192
pss_schur__(a,b,c,f)193 INT pss_schur__(a,b,c,f) OP a,b,c,f;
194 /* AK 051201 */
195 /* c += p_a [p_b] \times f */
196 {
197 INT erg = OK;
198 CTO(SCHUR,"pss_schur__(1)",a);
199 CTTTO(HASHTABLE,PARTITION,SCHUR,"pss_schur__(2)",b);
200 CTTO(HASHTABLE,SCHUR,"pss_schur__(3)",c);
201 M_FORALL_MONOMIALS_IN_A(a,b,c,f,pss_partition__);
202 ENDR("pss_schur__");
203 }
204
pss_hashtable__(a,b,c,f)205 INT pss_hashtable__(a,b,c,f) OP a,b,c,f;
206 /* AK 051201 */
207 /* c += p_a [p_b] \times f */
208 {
209 INT erg = OK;
210 CTO(HASHTABLE,"pss_hashtable__(1)",a);
211 CTTTO(HASHTABLE,PARTITION,SCHUR,"pss_hashtable__(2)",b);
212 CTTO(HASHTABLE,SCHUR,"pss_hashtable__(3)",c);
213 M_FORALL_MONOMIALS_IN_A(a,b,c,f,pss_partition__);
214 ENDR("pss_hashtable__");
215 }
216
pss_hashtable_hashtable_(a,b,c,f)217 INT pss_hashtable_hashtable_(a,b,c,f) OP a,b,c,f;
218 /* AK 051201 */
219 /* c += p_a [p_b] \times f */
220 {
221 INT erg = OK;
222 CTO(HASHTABLE,"pss_hashtable_hashtable_(1)",a);
223 CTO(HASHTABLE,"pss_hashtable_hashtable_(2)",b);
224 CTTO(HASHTABLE,SCHUR,"pss_hashtable_hashtable_(3)",c);
225 M_FORALL_MONOMIALS_IN_AB(a,b,c,f,pss_partition_partition_);
226 ENDR("pss_hashtable_hashtable_");
227 }
228
pss_null_partition_(b,c,f)229 INT pss_null_partition_(b,c,f) OP b,c,f;
230 /* AK 061201 */
231 {
232 INT erg = OK;
233 CTO(PARTITION,"pss_null_partition(1)",b);
234 CTTO(SCHUR,HASHTABLE,"pss_null_partition(2)",c);
235 _NULL_PARTITION_(b,c,f);
236 ENDR("pss_null_partition");
237 }
238
239 extern INT cc_plet_pss_integer_partition();
pss_integer_partition_(a,b,c,f)240 INT pss_integer_partition_(a,b,c,f) OP a,b,c,f;
241 /* AK 051201 */
242 {
243 INT erg = OK;
244
245 CTO(INTEGER,"pss_integer_partition_(1)",a);
246 CTO(PARTITION,"pss_integer_partition_(2)",b);
247 CTTO(SCHUR,HASHTABLE,"pss_integer_partition_(3)",c);
248
249
250 if (S_I_I(a) == 0) { erg += pss_null_partition_(b,c,f); goto ende; }
251 if (S_I_I(a) < 0) { /* zero contributon */ goto ende; }
252
253 erg += cc_plet_pss_integer_partition(a,b,c,f);
254 ende:
255 ENDR("pss_integer_partition_");
256 }
pss_integer_integer_(a,b,c,f)257 INT pss_integer_integer_(a,b,c,f) OP a,b,c,f;
258 /* AK 030603 */
259 {
260 INT erg = OK;
261
262 CTO(INTEGER,"pss_integer_integer_(1)",a);
263 CTO(INTEGER,"pss_integer_integer_(2)",b);
264 CTTO(SCHUR,HASHTABLE,"pss_integer_integer_(3)",c);
265 {
266 OP d = CALLOCOBJECT();
267 erg += m_i_pa(b,d);
268 erg += pss_integer_partition_(a,d,c,f);
269 FREEALL(d);
270 }
271
272 ende:
273 ENDR("pss_integer_integer_");
274 }
275
pss_partition_partition_(a,b,c,f)276 INT pss_partition_partition_(a,b,c,f) OP a,b,c,f;
277 /* AK 071201 */
278 {
279 INT erg = OK;
280 INT cc_plet_pss_partition_partition();
281
282 CTO(PARTITION,"pss_partition_partition_(1)",a);
283 CTO(PARTITION,"pss_partition_partition_(2)",b);
284 CTTO(SCHUR,HASHTABLE,"pss_partition_partition_(3)",c);
285 if (S_PA_LI(a) == 0) {
286 erg += pss_null_partition_(b,c,f);
287 }
288 else if (S_PA_LI(a) == 1) {
289 erg += pss_integer_partition_(S_PA_I(a,0),b,c,f);
290 }
291 else{
292 erg += cc_plet_pss_partition_partition(a,b,c,f);
293 }
294 CTTO(SCHUR,HASHTABLE,"pss_partition_partition_(3-ende)",c);
295 ENDR("pss_partition_partition_");
296 }
297
298
pss_integer_hashtable_(a,b,c,f)299 INT pss_integer_hashtable_(a,b,c,f) OP a,b,c,f;
300 /* AK 061101 */
301 {
302 INT erg = OK;
303
304 CTO(INTEGER,"pss_integer_hashtable_(1)",a);
305 CTTO(HASHTABLE,SCHUR,"pss_integer_hashtable_(2)",b);
306 CTTO(SCHUR,HASHTABLE,"integer_hashtable_(3)",c);
307
308 M_FORALL_MONOMIALS_IN_B(a,b,c,f,pss_integer_partition_);
309
310 ENDR("pss_integer_hashtable_");
311 }
312
313
pss___(a,b,c,f)314 INT pss___(a,b,c,f) OP a,b,c,f;
315 {
316 INT erg = OK;
317 CTTTTO(HASHTABLE,INTEGER,PARTITION,SCHUR,"pss___(1)",a);
318 CTTTTO(HASHTABLE,PARTITION,SCHUR,INTEGER,"pss___(2)",b);
319 CTTO(HASHTABLE,SCHUR,"pss___(3)",c);
320 if (S_O_K(a) == INTEGER)
321 {
322 erg += pss_integer__(a,b,c,f);
323 }
324 else if (S_O_K(a) == PARTITION)
325 {
326 erg += pss_partition__(a,b,c,f);
327 }
328 else if (S_O_K(a) == SCHUR)
329 {
330 erg += pss_schur__(a,b,c,f);
331 }
332 else /* if (S_O_K(a) == HASHTABLE) */
333 {
334 erg += pss_hashtable__(a,b,c,f);
335 }
336
337 ENDR("pss___");
338 }
339
340
341
342
343 INT phs___();
344 INT tsh___faktor();
plet_schur_schur_via_phs(a,b,c)345 INT plet_schur_schur_via_phs(a,b,c) OP a,b,c;
346 /* AK 061201
347 */
348 {
349 INT t=0,erg = OK;
350 CTTTTO(HASHTABLE,INTEGER,PARTITION,SCHUR,"plet_schur_schur(1)",a);
351 CTTTTO(INTEGER,HASHTABLE,PARTITION,SCHUR,"plet_schur_schur(2)",b);
352 CTTTO(EMPTY,HASHTABLE,SCHUR,"plet_schur_schur(3)",c);
353
354 if (S_O_K(c) == EMPTY)
355 { t=1; init_hashtable(c); }
356 {
357 /* via phs with change of basis */
358 OP f = CALLOCOBJECT();
359 erg += init_hashtable(f);
360 erg += tsh___faktor(a,f,cons_eins);
361 erg += phs___(f,b,c,cons_eins);
362 FREEALL(f);
363 }
364
365 if (t==1) t_HASHTABLE_SCHUR(c,c);
366 ENDR("plet_schur_schur");
367 }
368
369
370 #endif /* PLETTRUE */
371