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