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