1
2
3 #include "def.h"
4 #include "macro.h"
5
6 static INT mhh_integer_partition_();
7 static INT mhh_integer_hashtable_();
mhh_integer__(a,b,c,f)8 static INT mhh_integer__(a,b,c,f) OP a,b,c; OP f;
9 /* AK 311001 */
10 {
11 INT erg = OK;
12 CTO(INTEGER,"mhh_integer__(1)",a);
13 CTTTO(HASHTABLE,PARTITION,HOMSYM,"mhh_integer__(2)",b);
14 CTTO(HASHTABLE,HOMSYM,"mhh_integer__(3)",c);
15
16 if (S_O_K(b) == PARTITION) {
17 erg += mhh_integer_partition_(a,b,c,f);
18 goto ende;
19 }
20 else
21 {
22 erg += mhh_integer_hashtable_(a,b,c,f);
23 goto ende;
24 }
25 ende:
26 ENDR("mhh_integer__");
27 }
28
mhh_partition_partition_(a,b,c,f)29 INT mhh_partition_partition_(a,b,c,f) OP a,b,c; OP f;
30 {
31 INT erg = OK;
32 INT m_merge_partition_partition();
33 CTO(PARTITION,"mhh_partition_partition_(1)",a);
34 CTO(PARTITION,"mhh_partition_partition_(2)",b);
35 CTTO(HASHTABLE,HOMSYM,"mhh_partition_partition_(3-start)",c);
36
37 erg += m_merge_partition_partition(a,b,c,f,comp_monomhomsym,eq_monomsymfunc);
38
39 CTTO(HASHTABLE,HOMSYM,"mhh_partition_partition_(3-end)",c);
40 ENDR("mhh_partition_partition_");
41 }
42
mhh_partition__(a,b,c,f)43 INT mhh_partition__(a,b,c,f) OP a,b,c; OP f;
44 /* AK 311001 */
45 {
46 INT erg = OK;
47 CTO(PARTITION,"mhh_partition__(1)",a);
48 CTTTO(HASHTABLE,PARTITION,HOMSYM,"mhh_partition__(2)",b);
49 CTTO(HASHTABLE,HOMSYM,"mhh_partition__(3)",c);
50
51 if (S_O_K(b) == PARTITION)
52 {
53 erg += mhh_partition_partition_(a,b,c,f);
54 goto ende;
55 }
56 else {
57 M_FORALL_MONOMIALS_IN_B(a,b,c,f,mhh_partition_partition_);
58 goto ende;
59 }
60
61 ende:
62 ENDR("mhh_partition__");
63 }
64
mhh_partition_hashtable_(a,b,c,f)65 INT mhh_partition_hashtable_(a,b,c,f) OP a,b,c; OP f;
66 /* AK 311001 */
67 {
68 INT erg = OK;
69 CTO(PARTITION,"mhh_partition_hashtable_(1)",a);
70 CTO(HASHTABLE,"mhh_partition_hashtable_(2)",b);
71 CTTO(HASHTABLE,HOMSYM,"mhh_partition_hashtable_(3)",c);
72 M_FORALL_MONOMIALS_IN_B(a,b,c,f,mhh_partition_partition_);
73 ENDR("mhh_partition_hashtable_");
74 }
75
76
mhh_homsym__(a,b,c,f)77 INT mhh_homsym__(a,b,c,f) OP a,b,c,f;
78 /* AK 061101 */
79 /* c += h_a \times s_b \times f */
80 {
81 INT erg = OK;
82 CTO(HOMSYM,"mhh_homsym__(1)",a);
83 CTTTO(HASHTABLE,PARTITION,HOMSYM,"mhh_homsym__(2)",b);
84 CTTO(HASHTABLE,HOMSYM,"mhh_homsym__(3)",c);
85 M_FORALL_MONOMIALS_IN_A(a,b,c,f,mhh_partition__);
86 ENDR("mhh_homsym__");
87 }
88
mhh_hashtable__(a,b,c,f)89 INT mhh_hashtable__(a,b,c,f) OP a,b,c,f;
90 /* AK 061101 */
91 /* c += h_a \times b_b \times f */
92 {
93 INT erg = OK;
94 CTO(HASHTABLE,"mhh_hashtable__(1)",a);
95 CTTTO(HASHTABLE,PARTITION,HOMSYM,"mhh_hashtable__(2)",b);
96 CTTO(HASHTABLE,HOMSYM,"mhh_hashtable__(3)",c);
97 M_FORALL_MONOMIALS_IN_A(a,b,c,f,mhh_partition__);
98 ENDR("mhh_hashtable__");
99 }
100
mhh_hashtable_hashtable_(a,b,c,f)101 INT mhh_hashtable_hashtable_(a,b,c,f) OP a,b,c,f;
102 /* AK 051201 */
103 /* c += h_a \times h_b \times f */
104 {
105 INT erg = OK;
106 CTO(HASHTABLE,"mhh_hashtable_hashtable_(1)",a);
107 CTTTO(HASHTABLE,PARTITION,HOMSYM,"mhh_hashtable_hashtable_(2)",b);
108 CTTO(HASHTABLE,HOMSYM,"mhh_hashtable_hashtable_(3)",c);
109 M_FORALL_MONOMIALS_IN_AB(a,b,c,f,mhh_partition_partition_);
110 ENDR("mhh_hashtable_hashtable_");
111 }
112
mhh_integer_partition_(a,b,c,f)113 static INT mhh_integer_partition_(a,b,c,f) OP a,b,c,f;
114 /* AK 061101 */
115 {
116 INT erg = OK;
117 OP m;
118 INT i,k;
119
120 CTO(INTEGER,"mhh_integer_partition_(1)",a);
121 CTO(PARTITION,"mhh_integer_partition_(2)",b);
122 CTTO(HOMSYM,HASHTABLE,"mhh_integer_partition_(3)",c);
123
124
125 m = CALLOCOBJECT();
126 erg += b_sk_mo(CALLOCOBJECT(),CALLOCOBJECT(),m);
127 erg += b_ks_pa(VECTOR,CALLOCOBJECT(),S_MO_S(m));
128 erg += m_il_v(S_PA_LI(b)+1,S_PA_S(S_MO_S(m)));
129 C_O_K(S_PA_S(S_MO_S(m)),INTEGERVECTOR);
130
131 for (i=0,k=0; k<S_PA_LI(S_MO_S(m)); k++,i++)
132 if (k == S_PA_LI(b))
133 M_I_I(S_I_I(a), S_PA_I(S_MO_S(m),k) );
134 else if (S_PA_II(b,i) < S_I_I(a))
135 M_I_I(S_PA_II(b,i), S_PA_I(S_MO_S(m),k) );
136 else
137 {
138 M_I_I(S_I_I(a), S_PA_I(S_MO_S(m),k) );
139 break;
140 }
141
142 for (k++;k<S_PA_LI(S_MO_S(m)); k++,i++)
143 M_I_I(S_PA_II(b,i), S_PA_I(S_MO_S(m),k) );
144
145 COPY(f, S_MO_K(m));
146 if (S_O_K(c) == HOMSYM)
147 INSERT_LIST(m,c,add_koeff,comp_monomhomsym);
148 else
149 INSERT_HASHTABLE(m,c,add_koeff,eq_monomsymfunc,hash_monompartition);
150
151 ENDR("mhh_integer_partition_");
152 }
153
mhh_integer_hashtable_(a,b,c,f)154 static INT mhh_integer_hashtable_(a,b,c,f) OP a,b,c,f;
155 /* AK 061101 */
156 {
157 INT erg = OK;
158
159 CTO(INTEGER,"mhh_integer_hashtable_(1)",a);
160 CTTO(HASHTABLE,HOMSYM,"mhh_integer_hashtable_(2)",b);
161 CTTO(HOMSYM,HASHTABLE,"integer_hashtable_(3)",c);
162
163 M_FORALL_MONOMIALS_IN_B(a,b,c,f,mhh_integer_partition_);
164 ENDR("mhh_integer_hashtable_");
165 }
166
167
168
mult_homsym_homsym(a,b,c)169 INT mult_homsym_homsym(a,b,c) OP a,b,c;
170 /* AK 111001
171 */
172 {
173 INT erg = OK;
174 INT t=0; /* is 1 if transfer HASHTABLE->HOMSYM necessary */
175 CTTTTO(HASHTABLE,INTEGER,PARTITION,HOMSYM,"mult_homsym_homsym(1)",a);
176 CTTTO(HASHTABLE,PARTITION,HOMSYM,"mult_homsym_homsym(2)",b);
177 CTTTO(EMPTY,HASHTABLE,HOMSYM,"mult_homsym_homsym(3)",c);
178
179 if (S_O_K(a) == INTEGER)
180 {
181 if (S_O_K(c) == EMPTY) {
182 if (S_O_K(b) == PARTITION) init_homsym(c);
183 else { t=1; init_hashtable(c); }
184 }
185 erg += mhh_integer__(a,b,c,cons_eins);
186 }
187 else if (S_O_K(a) == PARTITION)
188 {
189 if (S_O_K(c) == EMPTY) { t=1; init_hashtable(c); }
190 erg += mhh_partition__(a,b,c,cons_eins);
191 }
192 else if (S_O_K(a) == HOMSYM)
193 {
194 if (S_O_K(c) == EMPTY) { t=1; init_hashtable(c); }
195 erg += mhh_homsym__(a,b,c,cons_eins);
196 }
197 else /* if (S_O_K(a) == HASHTABLE) */
198 {
199 if (S_O_K(c) == EMPTY) { t=1; init_hashtable(c); }
200
201 if (S_O_K(b) == HASHTABLE)
202 erg += mhh_hashtable_hashtable_(a,b,c,cons_eins);
203 else
204 erg += mhh_hashtable__(a,b,c,cons_eins);
205 }
206
207 if (t==1) t_HASHTABLE_HOMSYM(c,c);
208 ENDR("mult_homsym_homsym");
209 }
210
211