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