1 #include "def.h"
2 #include "macro.h"
3
4 INT mhp_integer_partition_();
5 INT mhp_integer_hashtable_();
mhp_integer__(a,b,c,f)6 INT mhp_integer__(a,b,c,f) OP a,b,c; OP f;
7 /* AK 311001 */
8 {
9 INT erg = OK;
10
11
12 CTO(INTEGER,"mhp_integer__(1)",a);
13 CTTTO(HASHTABLE,PARTITION,POWSYM,"mhp_integer__(2)",b);
14 CTTO(HASHTABLE,POWSYM,"mhp_integer__(3)",c);
15 CTO(ANYTYPE,"mhp_integer__(4)",f);
16
17 if (S_O_K(b) == PARTITION) {
18 erg += mhp_integer_partition_(a,b,c,f);
19 goto ende;
20 }
21 else
22 {
23 erg += mhp_integer_hashtable_(a,b,c,f);
24 goto ende;
25 }
26 ende:
27 CTTO(HASHTABLE,POWSYM,"mhp_integer__(e3)",c);
28 ENDR("mhp_integer__");
29 }
30
mhp_partition__(a,b,c,f)31 INT mhp_partition__(a,b,c,f) OP a,b,c; OP f;
32 /* AK 311001 */
33 {
34 INT erg = OK;
35 CTO(PARTITION,"mhp_partition__(1)",a);
36 CTTTO(HASHTABLE,PARTITION,POWSYM,"mhp_partition__(2)",b);
37 CTTO(HASHTABLE,POWSYM,"mhp_partition__(3)",c);
38
39 if (S_PA_LI(a) == 0) {
40 if (S_O_K(b) == PARTITION) {
41 OP d;
42 d = CALLOCOBJECT();
43 erg += b_sk_mo(CALLOCOBJECT(),CALLOCOBJECT(),d);
44 erg += copy_partition(b,S_MO_S(d));
45 COPY(f,S_MO_K(d));
46 INSERT_POWSYMMONOM_(d,c);
47 }
48 else /* powsym or hashtable */
49 {
50 OP z;
51 FORALL(z,b,{
52 OP d;
53 d = CALLOCOBJECT();
54 erg += b_sk_mo(CALLOCOBJECT(),CALLOCOBJECT(),d);
55 erg += copy_partition(S_MO_S(z),S_MO_S(d));
56 COPY(S_MO_K(z),S_MO_K(d));
57 if (not EINSP(f))
58 {
59 MULT_APPLY(f,S_MO_K(d));
60 }
61 INSERT_POWSYMMONOM_(d,c);
62 });
63 }
64 goto endr_ende;
65 }
66 else { /* partition of length >= 1 */
67 INT i; OP d,e;
68
69 d=CALLOCOBJECT();
70 e=CALLOCOBJECT();
71
72 erg += init_hashtable(e);
73 erg += mhp_integer__(S_PA_I(a,0),b,e,f);
74 for (i=1;i<S_PA_LI(a);i++)
75 {
76 FREESELF(d);
77 erg += init_hashtable(d);
78 SWAP(d,e);
79 erg += mhp_integer__(S_PA_I(a,i),d,e,cons_eins);
80 }
81 FREEALL(d);
82 if (S_O_K(c) == POWSYM)
83 INSERT_LIST(e,c,add_koeff,comp_monompowsym);
84 else
85 INSERT_HASHTABLE(e,c,add_koeff,eq_monomsymfunc,hash_monompartition);
86 }
87
88
89 ENDR("mhp_partition__");
90 }
91
mhp_homsym__(a,b,c,f)92 INT mhp_homsym__(a,b,c,f) OP a,b,c,f;
93 /* AK 061101 */
94 /* c += h_a \times p_b \times f */
95 {
96 INT erg = OK;
97
98 CTO(HOMSYM,"mhp_homsym__(1)",a);
99 CTTTO(HASHTABLE,PARTITION,POWSYM,"mhp_homsym__(2)",b);
100 CTTO(HASHTABLE,POWSYM,"mhp_homsym__(3)",c);
101 M_FORALL_MONOMIALS_IN_A(a,b,c,f,mhp_partition__);
102 ENDR("mhp_homsym__");
103 }
104
mhp_hashtable__(a,b,c,f)105 INT mhp_hashtable__(a,b,c,f) OP a,b,c,f;
106 /* AK 061101 */
107 /* c += h_a \times p_b \times f */
108 {
109 INT erg = OK;
110
111 CTO(HASHTABLE,"mhp_hashtable__(1)",a);
112 CTTTO(HASHTABLE,PARTITION,POWSYM,"mhp_hashtable__(2)",b);
113 CTTO(HASHTABLE,POWSYM,"mhp_hashtable__(3)",c);
114 M_FORALL_MONOMIALS_IN_A(a,b,c,f,mhp_partition__);
115 ENDR("mhp_homsym__");
116 }
117
118 OP find_thp_integer();
mhp_co(a,b,c,f)119 INT mhp_co(a,b,c,f) OP a,b,c,f;
120 {
121 INT m_merge_partition_partition();
122 return m_merge_partition_partition(a,b,c,f,comp_monompowsym,eq_monomsymfunc);
123 }
124
125 INT mpp_partition_partition_();
mhp_integer_partition_(a,b,c,f)126 INT mhp_integer_partition_(a,b,c,f) OP a,b,c,f;
127 /* AK 061101 */
128 {
129 INT erg = OK;
130 OP e;
131
132 CTO(INTEGER,"mhp_integer_partition_(1)",a);
133 CTO(PARTITION,"mhp_integer_partition_(2)",b);
134 CTTO(POWSYM,HASHTABLE,"mhp_integer_partition_(3)",c);
135 SYMCHECK((S_I_I(a) <= 0),"mhp_integer_partition_:parameter <= 0");
136
137 e = find_thp_integer(a);
138 M_FORALL_MONOMIALS_IN_A(e,b,c,f,mpp_partition_partition_);
139 ENDR("mhp_integer_partition_");
140 }
141
142
mhp_integer_hashtable_(a,b,c,f)143 INT mhp_integer_hashtable_(a,b,c,f) OP a,b,c,f;
144 /* AK 061101 */
145 {
146 INT erg = OK;
147 OP e;
148
149 CTO(INTEGER,"mhp_integer_hashtable_(1)",a);
150 CTTO(HASHTABLE,POWSYM,"mhp_integer_hashtable_(2)",b);
151 CTTO(POWSYM,HASHTABLE,"mhp_integer_hashtable_(3)",c);
152
153 e = find_thp_integer(a);
154
155 M_FORALL_MONOMIALS_IN_AB(e,b,c,f,mpp_partition_partition_);
156
157 ENDR("mhp_integer_hashtable_");
158 }
159
160
161
162
163
mult_homsym_powsym(a,b,c)164 INT mult_homsym_powsym(a,b,c) OP a,b,c;
165 /* AK 111001
166 */
167 {
168 INT erg = OK;
169 INT t=0; /* is 1 if transfer HASHTABLE->POWSYM necessary */
170 CTTTTO(HASHTABLE,INTEGER,PARTITION,HOMSYM,"mult_homsym_powsym(1)",a);
171 CTTTO(HASHTABLE,PARTITION,POWSYM,"mult_homsym_powsym(2)",b);
172 CTTTO(EMPTY,HASHTABLE,POWSYM,"mult_homsym_powsym(3)",c);
173
174 if (S_O_K(a) == INTEGER)
175 {
176 if (S_O_K(c) == EMPTY) {
177 if (S_O_K(b) == PARTITION) init_powsym(c);
178 else { t=1; init_hashtable(c); }
179 }
180 erg += mhp_integer__(a,b,c,cons_eins);
181 }
182 else if (S_O_K(a) == PARTITION)
183 {
184 if (S_O_K(c) == EMPTY)
185 { t=1; init_hashtable(c); }
186 erg += mhp_partition__(a,b,c,cons_eins);
187 }
188 else if (S_O_K(a) == HOMSYM)
189 {
190 if (S_O_K(c) == EMPTY)
191 { t=1; init_hashtable(c); }
192 erg += mhp_homsym__(a,b,c,cons_eins);
193 }
194 else /* if (S_O_K(a) == HASHTABLE) */
195 {
196 if (S_O_K(c) == EMPTY)
197 { t=1; init_hashtable(c); }
198 erg += mhp_hashtable__(a,b,c,cons_eins);
199 }
200
201 if (t==1) t_HASHTABLE_POWSYM(c,c);
202 ENDR("mult_homsym_powsym");
203 }
204
205