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