1 /* file: macro.h symmetrica source code */ 2 #ifndef MACRO_H 3 4 #ifdef SYMMAGMA 5 #define SYM_MALLOC(a) mem_malloc(a) 6 #else 7 #define SYM_MALLOC(a) SYM_malloc(a) 8 #endif 9 10 #ifdef SYMMAGMA 11 #define SYM_FREE(a) mem_free(a) 12 #else 13 #define SYM_FREE(a) SYM_free(a) 14 #endif 15 16 17 18 #define S_O_S(a) (((OP)(a))->ob_self) 19 #define S_O_K(a) (((OP)(a))->ob_kind) 20 #define C_O_K(a,b) ((a)->ob_kind = (OBJECTKIND)(b)) 21 #define C_O_S(a,b) S_O_S(a)=(b) 22 #define B_KS_O(a,b,c) do { C_O_S(c,b); C_O_K(c,a); } while(0) 23 24 #define EMPTYP(a) ((a)->ob_kind == (OBJECTKIND)0) 25 26 #define EQ_INTEGER(a,b) \ 27 ( S_O_K(b) == INTEGER ?(S_I_I(a) == S_I_I(b)):(comp_integer(a,b) == 0)) 28 #define EQ_PARTITION(a,b) \ 29 ( S_O_K(b) == PARTITION ? eq_partition_partition(a,b) :FALSE ) 30 #define EQ_LONGINT(a,b) \ 31 ( S_O_K(b) == LONGINT ? eq_longint_longint(a,b) :(comp_longint(a,b) == 0)) 32 #define EQ_FF(a,b) \ 33 ( comp_ff(a,b) == 0 ) 34 #define EQ(a,b) \ 35 (\ 36 S_O_K(a) == INTEGER? EQ_INTEGER(a,b) : \ 37 (\ 38 S_O_K(a) == LONGINT? EQ_LONGINT(a,b) :\ 39 ( \ 40 S_O_K(a) == PARTITION?EQ_PARTITION(a,b): \ 41 (\ 42 S_O_K(a)==FF?EQ_FF(a,b): eq(a,b) \ 43 )\ 44 ) \ 45 )\ 46 ) 47 48 49 50 #define S_I_I(a) (((a)->ob_self).ob_INT) 51 #define C_I_I(a,b) (a)->ob_self.ob_INT = (INT)(b) 52 #define M_I_I(a,b) (\ 53 ((b)->ob_self.ob_INT = (INT)(a)),\ 54 ((b)->ob_kind = INTEGER)\ 55 ) 56 57 #define DEC_INTEGER(a) (((a)->ob_self).ob_INT --) 58 #define INC_INTEGER(a) (((a)->ob_self).ob_INT ++) 59 60 61 #define COPY_INTEGER(a,b) M_I_I(S_I_I(a),b) 62 #define FREESELF_INTEGER(a) C_O_K((a),0) 63 #define NULLP_INTEGER(a) (S_I_I(a) == 0) 64 #define POSP_INTEGER(a) (S_I_I(a) > (INT)0) 65 #define NEGP_INTEGER(a) (S_I_I(a) < (INT)0) 66 #define EINSP_INTEGER(a) (S_I_I(a) == (INT)1) 67 #define NEGEINSP_INTEGER(a) (S_I_I(a) == (INT)-1) 68 #define COMP_INTEGER_INTEGER(a,b) ((S_I_I(a) == S_I_I(b))? 0L :\ 69 ((S_I_I(a) > S_I_I(b))? 1L : -1L) ) 70 #define INTEGERP(a) (S_O_K(a) == INTEGER) 71 72 73 #define S_V_S(a) ((((a)->ob_self).ob_vector)->v_self) 74 #define C_V_S(a,b) (((((a)->ob_self).ob_vector)->v_self) = ((OP) b)) 75 #define S_V_L(a) ((((a)->ob_self).ob_vector)->v_length) 76 #define C_V_L(a,b) (((((a)->ob_self).ob_vector)->v_length) = (b)) 77 #define S_V_I(a,i) (((((a)->ob_self).ob_vector)->v_self)+(i)) 78 #define C_V_I(a,i,b) ( *(((((a)->ob_self).ob_vector)->v_self)+(i)) = *(b)) 79 #define S_V_II(a,i) (((((((a)->ob_self).ob_vector)->v_self)+(i))\ 80 ->ob_self).ob_INT) 81 #define S_V_LI(a) ((((((a)->ob_self).ob_vector)->v_length)->ob_self).ob_INT) 82 83 #define B_O_V(a,b) \ 84 do { \ 85 struct vector *callocvectorstruct();\ 86 FREESELF(b);C_O_K(b,VECTOR);b->ob_self.ob_vector = callocvectorstruct();\ 87 C_V_S(b,a);C_V_L(b,CALLOCOBJECT()); M_I_I(1,S_V_L(b)); } while(0) 88 89 90 91 #define INTEGRALP(a) ( (S_O_K(a) == LONGINT) \ 92 || (S_O_K(a) == INTEGER) \ 93 ) 94 #define VECTORP_CO1(a) ( (S_O_K(a) == VECTOR) \ 95 || (S_O_K(a) == WORD) \ 96 || (S_O_K(a) == QUEUE) \ 97 || (S_O_K(a) == INTEGERVECTOR) \ 98 || (S_O_K(a) == COMPOSITION) \ 99 || (S_O_K(a) == HASHTABLE) \ 100 || (S_O_K(a) == LAURENT) \ 101 || (S_O_K(a) == KRANZ) \ 102 || (S_O_K(a) == SUBSET) \ 103 || (S_O_K(a) == FF) \ 104 ) 105 106 #define VECTORP(a) ((a == NULL)? FALSE: VECTORP_CO1(a)) 107 108 #define LISTP_CO1(a) ( (S_O_K(a) == LIST) \ 109 || (S_O_K(a) == SCHUR) \ 110 || (S_O_K(a) == GRAL) \ 111 || (S_O_K(a) == POLYNOM) \ 112 || (S_O_K(a) == SCHUBERT) \ 113 || (S_O_K(a) == MONOPOLY) \ 114 || (S_O_K(a) == ELM_SYM) \ 115 || (S_O_K(a) == POW_SYM) \ 116 || (S_O_K(a) == MONOMIAL) \ 117 || (S_O_K(a) == HOM_SYM) \ 118 ) 119 #define LISTP(a) ((a == NULL)? FALSE: LISTP_CO1(a)) 120 121 #define POLYP(a) ( \ 122 (S_O_K(a) == SCHUR) \ 123 || (S_O_K(a) == GRAL) \ 124 || (S_O_K(a) == POLYNOM) \ 125 || (S_O_K(a) == SCHUBERT) \ 126 || (S_O_K(a) == MONOPOLY) \ 127 || (S_O_K(a) == ELM_SYM) \ 128 || (S_O_K(a) == POW_SYM) \ 129 || (S_O_K(a) == MONOMIAL) \ 130 || (S_O_K(a) == HOM_SYM) \ 131 ) 132 133 134 135 #define S_L_S(a) ((((a)->ob_self).ob_list)->l_self) 136 #define C_L_S(a,b) (((((a)->ob_self).ob_list)->l_self) = (OP)(b)) 137 #define S_L_N(a) ((((a)->ob_self).ob_list)->l_next) 138 #define C_L_N(a,b) (((((a)->ob_self).ob_list)->l_next) = (OP)(b)) 139 140 #define S_PA_C(a) ((unsigned char *) (S_PA_S(a))) 141 #define S_PA_K(a) ((a)->ob_self.ob_partition->pa_kind) 142 #define C_PA_K(a,b) (((((a)->ob_self).ob_partition)->pa_kind) = b) 143 #define C_PA_HASH(a,b) (((((a)->ob_self).ob_partition)->pa_hash) = b) 144 #define S_PA_S(a) ((a)->ob_self.ob_partition->pa_self) 145 #define S_PA_HASH(a) ((a)->ob_self.ob_partition->pa_hash) 146 #define C_PA_S(a,b) ((a)->ob_self.ob_partition->pa_self = b) 147 #define S_PA_I(a,i) S_V_I((a)->ob_self.ob_partition->pa_self,i) 148 #define S_PA_II(a,i) \ 149 ((S_O_K(a) == CHARPARTITION || S_O_K(a) == CHAR_AUG_PART) ? \ 150 (INT)(S_PA_C(a)[i+1]) : \ 151 S_V_II((a)->ob_self.ob_partition->pa_self,i)) 152 #define S_PA_CII(a,i) (S_PA_C(a)[i+1]) 153 #define S_PA_CI(a,i) (S_PA_C(a)+i+1) 154 #define S_PA_CL(a) (S_PA_C(a)[0]) 155 #define S_PA_L(a) S_V_L(S_PA_S(a)) 156 #define S_PA_LI(a) \ 157 ((S_O_K(a) == CHARPARTITION || S_O_K(a) == CHAR_AUG_PART) ? \ 158 (INT)(S_PA_C(a)[0]) : \ 159 S_V_LI(S_PA_S(a))) 160 #define INC_PARTITION(a) inc_vector(S_PA_S(a)) 161 #define DEC_PARTITION(a) dec_integervector(S_PA_S(a)) 162 163 #ifdef FAST 164 #define PART_CHECK_KIND(t,a,b) 165 #else 166 #define PART_CHECK_KIND(t,a,b)\ 167 CTO(PARTITION,t,a);\ 168 if (S_PA_K(a) != b)\ 169 wrong_kind_part(t,a,b); 170 #endif 171 172 173 174 extern INT partition_speichersize,partition_speicherindex,mem_counter_part; 175 extern struct partition **partition_speicher; 176 177 #define FREEPARTITION(d)\ 178 FREE_MEMMANAGER(struct partition *,\ 179 partition_speicher,\ 180 partition_speicherindex,\ 181 partition_speichersize,\ 182 mem_counter_part,\ 183 d) 184 185 #define B_KS_PA(a,b,c) \ 186 do {\ 187 C_O_K(c,PARTITION);\ 188 CALLOC_MEMMANAGER(struct partition,\ 189 partition_speicher,\ 190 partition_speicherindex,\ 191 mem_counter_part,\ 192 (c ->ob_self).ob_partition);\ 193 /* (c ->ob_self).ob_partition=CALLOCPARTITION();*/\ 194 C_PA_K(c,a);\ 195 C_PA_S(c,b);\ 196 C_PA_HASH(c,-1L); \ 197 } while (0) 198 199 #define M_KL_PA(a,b,c) \ 200 do { B_KS_PA(a,CALLOCOBJECT(),c);\ 201 erg += m_l_v(b,S_PA_S(c));\ 202 C_O_K(S_PA_S(c),INTEGERVECTOR) );\ 203 while(0) 204 205 #define B_KL_PA(a,b,c) \ 206 do { B_KS_PA(a,CALLOCOBJECT(),c);\ 207 erg += b_l_v(b,S_PA_S(c));\ 208 C_O_K(S_PA_S(c),INTEGERVECTOR);\ 209 } while(0) 210 211 212 213 214 #define S_P_K(a) ((((a)->ob_self).ob_permutation)->p_kind) 215 #define C_P_K(a,b) (((((a)->ob_self).ob_permutation)->p_kind) = b) 216 #define S_P_S(a) ((((a)->ob_self).ob_permutation)->p_self) 217 #define C_P_S(a,b) (((((a)->ob_self).ob_permutation)->p_self) = b) 218 #define S_P_I(a,i) S_V_I(((((a)->ob_self).ob_permutation)->p_self),(i)) 219 #define S_P_II(a,i) S_V_II(((((a)->ob_self).ob_permutation)->p_self),(i)) 220 #define S_P_L(a) S_V_L(S_P_S(a)) 221 #define S_P_LI(a) S_V_LI(S_P_S(a)) 222 223 /* kranz produkt AK 120804 */ 224 #define S_KR_G(a) S_V_I(a,0) 225 #define S_KR_GI(a,i) S_P_I(S_V_I(a,0),i) 226 #define S_KR_GL(a) S_P_L(S_V_I(a,0)) 227 #define S_KR_GLI(a) S_P_LI(S_V_I(a,0)) 228 #define S_KR_V(a) S_V_I(a,1) 229 #define S_KR_VL(a) S_V_L(S_V_I(a,1)) 230 #define S_KR_VLI(a) S_V_LI(S_V_I(a,1)) 231 #define S_KR_I(a,i) S_V_I(S_V_I(a,1),i) 232 233 #define S_M_L(a) ((((a)->ob_self).ob_matrix)->m_length) 234 #define C_M_L(a,b) (((((a)->ob_self).ob_matrix)->m_length)=(b)) 235 #define S_M_LI(a) ((((((a)->ob_self).ob_matrix)->m_length)->ob_self).ob_INT) 236 #define S_M_H(a) ((((a)->ob_self).ob_matrix)->m_height) 237 #define S_M_HASH(a) ((((a)->ob_self).ob_matrix)->m_hash) 238 #define C_M_H(a,b) (((((a)->ob_self).ob_matrix)->m_height)=(b)) 239 #define S_M_HI(a) ((((((a)->ob_self).ob_matrix)->m_height)->ob_self).ob_INT) 240 #define S_M_S(a) ((((a)->ob_self).ob_matrix)->m_self) 241 #define C_M_S(a,b) (((((a)->ob_self).ob_matrix)->m_self)=(b)) 242 #define C_M_HASH(a,b) (((((a)->ob_self).ob_matrix)->m_hash)=(b)) 243 #define S_M_IJ(a,i,j) ( ((((a)->ob_self).ob_matrix)->m_self)\ 244 + ((((((a)->ob_self).ob_matrix)->m_length)->ob_self).ob_INT)\ 245 * (i) + (j) ) 246 #define S_M_IJI(a,i,j) S_I_I(S_M_IJ(a,i,j)) 247 #define MATRIXP(a) ((S_O_K(a) == MATRIX) || (S_O_K(a) == KRANZTYPUS)\ 248 || (S_O_K(a) == KOSTKA) || (S_O_K(a) == INTEGERMATRIX) ) 249 250 #define S_MO_S(a) (((a->ob_self).ob_monom)->mo_self) 251 #define C_MO_S(a,b) ((((a->ob_self).ob_monom)->mo_self)=(b)) 252 #define S_MO_K(a) (((a->ob_self).ob_monom)->mo_koeff) 253 #define C_MO_K(a,b) ((((a->ob_self).ob_monom)->mo_koeff)=(b)) 254 #define S_MO_KI(a) ((((a->ob_self).ob_monom)->mo_koeff)->ob_self.ob_INT) 255 #define S_MO_SI(a,i) S_V_I(S_MO_S(a),(i)) 256 #define S_MO_SII(a,i) S_V_II(S_MO_S(a),(i)) 257 #define S_MO_SL(a) S_V_L(S_MO_S(a)) 258 #define S_MO_SLI(a) S_V_LI(S_MO_S(a)) 259 #define COPY_MONOM(a,b) M_SK_MO(S_MO_S(a),S_MO_K(a),b) 260 261 #define B_SK_MO(a,b,c)\ 262 do { \ 263 C_O_K(c,MONOM);\ 264 CALLOC_MEMMANAGER(struct monom, monom_speicher, monom_speicherindex,mem_counter_monom ,(c->ob_self).ob_monom);\ 265 C_MO_S(c,a) ; \ 266 C_MO_K(c,b); \ 267 } while(0) 268 269 extern INT monom_speicherindex,mem_counter_monom,monom_speichersize; 270 extern struct monom **monom_speicher; 271 272 #define FREEMONOM(v) \ 273 FREE_MEMMANAGER(struct monom *,\ 274 monom_speicher,\ 275 monom_speicherindex,\ 276 monom_speichersize,\ 277 mem_counter_monom,\ 278 v) 279 280 281 #define FREESELF_MONOM(a)\ 282 do {\ 283 if (S_O_K(S_MO_S(a)) == PARTITION) \ 284 { erg+= freeself_partition(S_MO_S(a)); }\ 285 else if (S_O_K(S_MO_S(a)) == INTEGERMATRIX) \ 286 { erg+= freeself_integermatrix(S_MO_S(a)); }\ 287 else erg += freeself(S_MO_S(a));\ 288 FREE_EMPTY_OBJECT(S_MO_S(a));\ 289 if (S_O_K(S_MO_K(a)) == INTEGER) C_O_K(S_MO_K(a),EMPTY);\ 290 else if (S_O_K(S_MO_K(a)) == LONGINT) erg += freeself_longint(S_MO_K(a));\ 291 else if (S_O_K(S_MO_K(a)) == BRUCH) erg += freeself_bruch(S_MO_K(a));\ 292 else if (S_O_K(S_MO_K(a)) == FF) erg += freeself_ff(S_MO_K(a));\ 293 else erg += freeself(S_MO_K(a));\ 294 FREE_EMPTY_OBJECT(S_MO_K(a));\ 295 FREEMONOM(((a)->ob_self).ob_monom);\ 296 C_O_K(a,EMPTY);\ 297 } while(0) 298 299 #define S_B_I(a) ((INT)((((a)->ob_self).ob_bruch)->b_info)) 300 #define S_B_O(a) ((OP)((((a)->ob_self).ob_bruch)->b_oben)) 301 #define S_B_OI(a) ((INT)((((((a)->ob_self).ob_bruch)->b_oben)->ob_self).ob_INT)) 302 #define S_B_U(a) ((OP)((((a)->ob_self).ob_bruch)->b_unten)) 303 #define S_B_UI(a) ((INT)((((((a)->ob_self).ob_bruch)->b_unten)->ob_self).ob_INT)) 304 #define FREESELF_BRUCH(a) (freeall(S_B_O(a)),freeall(S_B_U(a)),\ 305 free(S_O_S(a).ob_bruch),C_O_K(a,0),OK) 306 #define C_B_I(a,b) (((((a)->ob_self).ob_bruch)->b_info)=(INT)(b)) 307 #define C_B_O(a,b) (((((a)->ob_self).ob_bruch)->b_oben)=(b)) 308 #define C_B_U(a,b) (((((a)->ob_self).ob_bruch)->b_unten)=(b)) 309 #define EINSP_BRUCH(a) (EQ(S_B_O((a)),S_B_U((a)))) 310 #define BRUCHP(a) (S_O_K(a) == BRUCH) 311 312 #define S_S_S(a) ((((((((a)->ob_self).ob_list)->l_self))\ 313 ->ob_self).ob_monom)->mo_self) 314 #define S_S_SL(a) S_PA_L( ((((((((a)->ob_self).ob_list)->l_self))\ 315 ->ob_self).ob_monom)->mo_self)\ 316 ) 317 #define S_S_SLI(a) S_PA_LI( ((((((((a)->ob_self).ob_list)->l_self))\ 318 ->ob_self).ob_monom)->mo_self)\ 319 ) 320 #define S_S_SI(a,i) S_PA_I( ((((((((a)->ob_self).ob_list)->l_self))\ 321 ->ob_self).ob_monom)->mo_self)\ 322 ,(i)) 323 #define S_S_SII(a,i) S_PA_II( ((((((((a)->ob_self).ob_list)->l_self))\ 324 ->ob_self).ob_monom)->mo_self)\ 325 ,(i)) 326 #define S_S_K(a) (S_MO_K(((((a)->ob_self).ob_list)->l_self))) 327 #define C_S_K(a,b) (C_MO_K(((((a)->ob_self).ob_list)->l_self),(b))) 328 #define C_S_S(a,b) (C_MO_S(((((a)->ob_self).ob_list)->l_self),(b))) 329 #define S_S_KI(a) (S_MO_KI(((((a)->ob_self).ob_list)->l_self))) 330 #define S_S_N(a) (S_L_N(a)) 331 #define C_S_N(a,b) (C_L_N((a),(b))) 332 333 #define S_SCH_S(a) (S_MO_S(S_L_S(a))) 334 #define S_SCH_SL(a) (S_P_L(S_MO_S(S_L_S(a)))) 335 #define S_SCH_SLI(a) (S_P_LI(S_MO_S(S_L_S(a)))) 336 #define S_SCH_SI(a,i) S_P_I(S_SCH_S(a),(i)) 337 #define S_SCH_SII(a,i) S_P_II(S_SCH_S(a),(i)) 338 #define S_SCH_K(a) (S_MO_K(S_L_S(a))) 339 #define C_SCH_K(a,b) (C_MO_K(S_L_S(a),(b))) 340 #define S_SCH_KI(a) (S_MO_KI(S_L_S(a))) 341 #define S_SCH_N(a) (S_L_N(a)) 342 #define C_SCH_N(a,b) (C_L_N((a),(b))) 343 344 345 #define POLYNOMP(a) (S_O_K(a) == POLYNOM) 346 #define S_PO_S(a) (S_MO_S(S_L_S(a))) 347 #define S_PO_SI(a,i) (S_V_I(S_MO_S(S_L_S(a)),i)) 348 #define S_PO_SIJ(a,i,j) (S_M_IJ(S_MO_S(S_L_S(a)),i,j)) 349 #define S_PO_SIJI(a,i,j) (S_M_IJI(S_MO_S(S_L_S(a)),i,j)) 350 #define S_PO_SII(a,i) (S_V_II(S_MO_S(S_L_S(a)),i)) 351 #define S_PO_SL(a) (S_V_L(S_MO_S(S_L_S(a)))) 352 #define S_PO_SLI(a) (S_V_LI(S_MO_S(S_L_S(a)))) 353 #define S_PO_K(a) (S_MO_K(S_L_S(a))) 354 #define S_PO_KI(a) (S_MO_KI(S_L_S(a))) 355 #define S_PO_N(a) (S_L_N(a)) 356 #define C_PO_N(a,b) (C_L_N((a),(b))) 357 #define C_PO_K(a,b) (C_MO_K(S_L_S(a),(b))) 358 #define COPY_POLYNOM(a,b) copy_list(a,b) 359 #define M_SK_MO(a,b,c) (b_sk_mo(callocobject(),callocobject(),c),\ 360 copy(b,S_MO_K(c)),\ 361 copy(a,S_MO_S(c))) 362 363 #define S_SPA_G(a) ((((a)->ob_self).ob_skewpartition)->spa_gross) 364 #define S_SPA_GL(a) S_PA_L((((a)->ob_self).ob_skewpartition)->spa_gross) 365 #define S_SPA_GLI(a) S_PA_LI((((a)->ob_self).ob_skewpartition)->spa_gross) 366 #define S_SPA_GI(a,i) S_PA_I(((((a)->ob_self).ob_skewpartition)->spa_gross),i) 367 #define S_SPA_GII(a,i) S_PA_II(((((a)->ob_self).ob_skewpartition)->spa_gross),i) 368 #define S_SPA_GS(a) S_PA_S((((a)->ob_self).ob_skewpartition)->spa_gross) 369 #define S_SPA_K(a) ((((a)->ob_self).ob_skewpartition)->spa_klein) 370 #define S_SPA_KL(a) S_PA_L((((a)->ob_self).ob_skewpartition)->spa_klein) 371 #define S_SPA_KLI(a) S_PA_LI((((a)->ob_self).ob_skewpartition)->spa_klein) 372 #define S_SPA_KI(a,i) S_PA_I(S_SPA_K(a),i) 373 #define S_SPA_KII(a,i) S_PA_II(S_SPA_K(a),i) 374 #define S_SPA_KS(a) S_PA_S((((a)->ob_self).ob_skewpartition)->spa_klein) 375 376 #define S_T_S(a) ((((a)->ob_self).ob_tableaux)->t_self) 377 #define S_T_U(a) ((((a)->ob_self).ob_tableaux)->t_umriss) 378 #define S_T_IJ(a,i,j) S_M_IJ(S_T_S(a),i,j) 379 #define S_T_H(a) S_M_H(S_T_S(a)) 380 #define S_T_HI(a) S_M_HI(S_T_S(a)) 381 #define S_T_L(a) S_M_L(S_T_S(a)) 382 #define S_T_LI(a) S_M_LI(S_T_S(a)) 383 #define S_T_IJI(a,i,j) S_M_IJI(S_T_S(a),i,j) 384 #define S_T_UG(a) S_SPA_G(S_T_U(a)) 385 #define S_T_UGLI(a) S_SPA_GLI(S_T_U(a)) 386 #define S_T_UGL(a) S_SPA_GL(S_T_U(a)) 387 #define S_T_UGII(a,i) S_SPA_GII(S_T_U(a),i) 388 #define S_T_UGI(a,i) S_SPA_GI(S_T_U(a),i) 389 #define S_T_UK(a) S_SPA_K(S_T_U(a)) 390 #define S_T_UKLI(a) S_SPA_KLI(S_T_U(a)) 391 #define S_T_UKL(a) S_SPA_KL(S_T_U(a)) 392 #define S_T_UKII(a,i) S_SPA_KII(S_T_U(a),i) 393 #define S_T_UKI(a,i) S_SPA_KI(S_T_U(a),i) 394 #define S_T_UL(a) S_PA_L(S_T_U(a)) 395 #define S_T_ULI(a) S_PA_LI(S_T_U(a)) 396 #define S_T_UII(a,i) S_PA_II(S_T_U(a),i) 397 #define S_T_UI(a,i) S_PA_I(S_T_U(a),i) 398 #define TABLEAUXP(a) (S_O_K(a) == TABLEAUX) 399 400 #define S_W_I(a,i) S_V_I(a,i) 401 #define S_W_II(a,i) S_V_II(a,i) 402 #define S_W_L(a) S_V_L(a) 403 #define S_W_LI(a) S_V_LI(a) 404 #define S_W_S(a) S_V_S(a) 405 #define S_LA_I(a,i) S_V_I(a,i) 406 #define S_LA_II(a,i) S_V_II(a,i) 407 #define S_LA_L(a) S_V_L(a) 408 #define S_LA_LI(a) S_V_LI(a) 409 #define S_LA_S(a) S_V_S(a) 410 #define b_l_w(a,b) (b_l_v(a,b),C_O_K(b,WORD),OK) 411 #define m_l_w(a,b) (m_l_v(a,b),C_O_K(b,WORD),OK) 412 #define m_il_w(a,b) (m_il_v(a,b),C_O_K(b,WORD),OK) 413 #define m_il_nw(a,b) (m_il_nv(a,b),C_O_K(b,WORD),OK) 414 #define m_l_nw(a,b) (m_l_nv(a,b),C_O_K(b,WORD),OK) 415 #define b_l_la(a,b) (b_l_v(a,b),C_O_K(b,LAURENT),OK) 416 #define m_l_la(a,b) (m_l_v(a,b),C_O_K(b,LAURENT),OK) 417 #define m_il_la(a,b) (m_il_v(a,b),C_O_K(b,LAURENT),OK) 418 #define m_il_nla(a,b) (m_il_nv(a,b),C_O_K(b,LAURENT),OK) 419 #define m_l_nla(a,b) (m_l_nv(a,b),C_O_K(b,LAURENT),OK) 420 421 #define S_SC_D(a) ((((a)->ob_self).ob_symchar)->sy_dimension) 422 #define S_SC_DI(a) S_I_I((((a)->ob_self).ob_symchar)->sy_dimension) 423 #define S_SC_W(a) ((((a)->ob_self).ob_symchar)->sy_werte) 424 #define S_SC_WI(a,i) S_V_I(((((a)->ob_self).ob_symchar)->sy_werte),i) 425 #define S_SC_WII(a,i) S_V_II(((((a)->ob_self).ob_symchar)->sy_werte),i) 426 #define S_SC_P(a) ((((a)->ob_self).ob_symchar)->sy_parlist) 427 #define S_SC_PI(a,i) S_V_I(((((a)->ob_self).ob_symchar)->sy_parlist),i) 428 #define S_SC_PLI(a) S_V_LI(((((a)->ob_self).ob_symchar)->sy_parlist)) 429 #define S_SC_WLI(a) S_V_LI(((((a)->ob_self).ob_symchar)->sy_werte)) 430 431 /* MD */ 432 #define S_N_S(a) ((((a)->ob_self).ob_number)->n_self) 433 #define C_N_S(a,b) (((((a)->ob_self).ob_number)->n_self) = (b)) 434 #define S_N_D(a) (((((a)->ob_self).ob_number)->n_data).o_data) 435 #define C_N_D(a,b) ((((((a)->ob_self).ob_number)->n_data).o_data) = (b)) 436 #define S_N_DC(a) (((((a)->ob_self).ob_number)->n_data).c_data) 437 #define S_N_DCI(a) ((((((a)->ob_self).ob_number)->n_data).c_data)->index) 438 #define S_N_DCII(a) S_I_I(S_N_DCI(a)) 439 #define S_N_DCD(a) ((((((a)->ob_self).ob_number)->n_data).c_data)->deg) 440 #define S_N_DCP(a) ((((((a)->ob_self).ob_number)->n_data).c_data)->poly) 441 #define OBJECTREAD_CYCLO(f,a) objectread_number((f),(a),CYCLOTOMIC) 442 #define OBJECTREAD_SQRAD(f,a) objectread_number((f),(a),SQ_RADICAL) 443 #define EINSP_MONOPOLY(a) eq_fieldobject_int(MONOPOLY,(a),1L) 444 #define EINSP_CYCLO(a) eq_fieldobject_int(CYCLOTOMIC,(a),1L) 445 #define EINSP_SQRAD(a) eq_fieldobject_int(SQ_RADICAL,(a),1L) 446 #define NEGEINSP_MONOPOLY(a) eq_fieldobject_int(MONOPOLY,(a),-1L) 447 #define NEGEINSP_CYCLO(a) eq_fieldobject_int(CYCLOTOMIC,(a),-1L) 448 #define NEGEINSP_SQRAD(a) eq_fieldobject_int(SQ_RADICAL,(a),-1L) 449 450 451 452 453 #define evenp(a) even(a) 454 #define oddp(a) odd(a) 455 #define first_ym(a,b) ym_min(a,b) 456 457 #define addinvers_schubert(a,b) addinvers_polynom(a,b) 458 #define addinvers_schur(a,b) addinvers_polynom(a,b) 459 #define einsp_schur(a) einsp_symfunc(a) 460 #define add_apply_schur(a,b) add_apply_symfunc(a,b) 461 #define add_apply_schur_schur(a,b) add_apply_symfunc_symfunc(a,b) 462 #define m_part_schur(a,b) m_skn_s(a,cons_eins,NULL,b) 463 464 /* for MONOMIAL */ 465 #define m_v_mon(a,b) (m_v_s(a,b),C_O_K(b,MONOMIAL),OK) 466 #define b_skn_mon(a,b,c,d) (b_skn_s(a,b,c,d),C_O_K(d,MONOMIAL),OK) 467 #define m_skn_mon(a,b,c,d) (m_skn_s(a,b,c,d),C_O_K(d,MONOMIAL),OK) 468 #define addinvers_monomial(a,b) addinvers_polynom(a,b) 469 #define add_apply_monomial(a,b) add_apply_symfunc(a,b) 470 #define add_apply_monomial_monomial(a,b) add_apply_symfunc_symfunc(a,b) 471 #define m_part_monomial(a,b) m_skn_mon(a,cons_eins,NULL,b) 472 #define einsp_monomial(a) einsp_symfunc(a) 473 474 /* for ELM_SYM */ 475 #define m_v_e(a,b) (m_v_s(a,b),C_O_K(b,ELM_SYM),OK) 476 #define add_monom_elmsym(a,b,c) add_monom_schur(a,b,c) 477 #define addinvers_elmsym(a,b) addinvers_polynom(a,b) 478 #define b_skn_e(a,b,c,d) (b_skn_s(a,b,c,d),C_O_K(d,ELM_SYM),OK) 479 #define m_skn_e(a,b,c,d) (m_skn_s(a,b,c,d),C_O_K(d,ELM_SYM),OK) 480 #define add_apply_elmsym(a,b) add_apply_symfunc(a,b) 481 #define add_apply_elmsym_elmsym(a,b) add_apply_symfunc_symfunc(a,b) 482 #define m_part_elmsym(a,b) m_skn_e(a,cons_eins,NULL,b) 483 #define einsp_elmsym(a) einsp_symfunc(a) 484 485 /* for POW_SYM */ 486 #define m_v_ps(a,b) (m_v_s(a,b),C_O_K(b,POW_SYM),OK) 487 #define add_monom_powsym(a,b,c) add_monom_schur(a,b,c) 488 #define addinvers_powsym(a,b) addinvers_polynom(a,b) 489 #define b_skn_ps(a,b,c,d) (b_skn_s(a,b,c,d),C_O_K(d,POW_SYM),OK) 490 #define m_skn_ps(a,b,c,d) (m_skn_s(a,b,c,d),C_O_K(d,POW_SYM),OK) 491 #define compute_powsym_with_alphabet(a,b,c) \ 492 compute_power_with_alphabet(a,b,c) 493 #define add_apply_powsym(a,b) add_apply_symfunc(a,b) 494 #define add_apply_powsym_powsym(a,b) add_apply_symfunc_symfunc(a,b) 495 #define m_part_powsym(a,b) m_skn_ps(a,cons_eins,NULL,b) 496 #define einsp_powsym(a) einsp_symfunc(a) 497 498 /* for HOM_SYM */ 499 #define m_v_h(a,b) (m_v_s(a,b),C_O_K(b,HOM_SYM),OK) 500 #define add_monom_homsym(a,b,c) add_monom_schur(a,b,c) 501 #define addinvers_homsym(a,b) addinvers_schur(a,b) 502 #define b_skn_h(a,b,c,d) (b_skn_s(a,b,c,d),C_O_K(d,HOM_SYM),OK) 503 #define m_skn_h(a,b,c,d) (m_skn_s(a,b,c,d),C_O_K(d,HOM_SYM),OK) 504 #define compute_homsym_with_alphabet(a,b,c) \ 505 compute_complete_with_alphabet(a,b,c) 506 #define add_apply_homsym(a,b) add_apply_symfunc(a,b) 507 #define add_apply_homsym_homsym(a,b) add_apply_symfunc_symfunc(a,b) 508 #define m_part_homsym(a,b) m_skn_h(a,cons_eins,NULL,b) 509 #define einsp_homsym(a) einsp_symfunc(a) 510 511 /* for nc.c */ 512 #define S_NC_GL(a) S_V_I(a,0L) 513 #define S_NC_C(a) S_V_I(a,1L) 514 #define SYM_GL(a) (S_V_II(a,0L)==1L) /* true falls sym */ 515 #define ALT_GL(a) (S_V_II(a,0L)==2L) /* true falls alt */ 516 #define KRANZ_GL(a) (S_V_II(a,0L)==3L) /* true falls kranz */ 517 #define CYCLIC_GL(a) (S_V_II(a,0L)==4L) /* true falls cyclic */ 518 #define GLNQ_GL(a) (S_V_II(a,0L)==5L) /* true falls gl(n,q) */ 519 #define S_GL_SYM_A(a) S_V_I(a,1L) 520 #define S_GL_ALT_A(a) S_V_I(a,1L) 521 #define S_GL_CYCLIC_A(a) S_V_I(a,1L) 522 #define S_GL_KRANZ_A(a) S_GL_SYM_A(S_V_I(S_V_I(a,1L),0L)) 523 #define S_GL_KRANZ_GLA(a) (S_V_I(S_V_I(a,1L),0L)) 524 #define S_GL_KRANZ_B(a) S_GL_SYM_A(S_V_I(S_V_I(a,1L),1L)) 525 #define S_GL_KRANZ_GLB(a) (S_V_I(S_V_I(a,1L),1L)) 526 #define S_GL_GLNQ_N(a) (S_V_I(S_V_I(a,1L),0L)) 527 #define S_GL_GLNQ_Q(a) (S_V_I(S_V_I(a,1L),1L)) 528 529 530 531 /* for ga.c */ 532 533 #define m_skn_gral(a,b,c,d) ( m_skn_po(a,b,c,d), C_O_K(d,GRAL), OK ) 534 #define b_skn_gral(a,b,c,d) ( b_skn_po(a,b,c,d), C_O_K(d,GRAL), OK ) 535 #define hplus_hecke(a,b) hplus(a,b) 536 537 /* for ff.c */ 538 #define S_FF_C(a) S_V_I(a,0) 539 #define S_FF_CI(a) S_V_II(a,0) 540 #define S_FF_IP(a) S_O_S(S_V_I(a,1)).ob_INTpointer 541 #define C_FF_IP(a,p) S_O_S(S_V_I(a,1)).ob_INTpointer=(INT*)p 542 #define S_FF_II(a,i) *((S_O_S(S_V_I(a,1)).ob_INTpointer) + i) 543 #define S_FF_DI(a) S_FF_II(a,0) 544 #define S_FF_ME(a) S_V_I(a,2) 545 #define S_FF_MEI(a) S_V_II(a,2) 546 547 /* for galois.c */ 548 #define S_GR_CI(a) S_V_II(a,1) 549 #define S_GR_C(a) S_V_I(a,1) 550 #define S_GR_D(a) S_V_I(a,0) 551 #define S_GR_DI(a) S_V_II(a,0) 552 553 554 555 /* for longint */ 556 557 extern INT loc_index, loc_size,loc_counter; 558 extern struct loc **loc_speicher; 559 560 extern INT longint_speicherindex,mem_counter_loc,longint_speichersize; 561 extern struct longint **longint_speicher; 562 563 564 565 #define FREE_LOC(a) \ 566 FREE_MEMMANAGER(struct loc *,loc_speicher,loc_index,loc_size,loc_counter,a) 567 568 #define LOCSGN(lx) ( ((lx)->w2 || (lx)->w1 || (lx)->w0 ) ? 1 : 0 ) 569 570 #define LOCNULL(lx) ((lx)->w0=0,(lx)->w1=0,(lx)->w2=0) 571 572 #define LOCHOLE(aloc) \ 573 do {\ 574 CALLOC_MEMMANAGER(struct loc,loc_speicher,loc_index,loc_counter,*(aloc));\ 575 LOCNULL(*(aloc));\ 576 (*(aloc))->nloc = NULL;\ 577 } while(0) 578 579 #define GANZDEFINIERE(x) \ 580 do {\ 581 (x)->signum = (signed char)0;\ 582 (x)->laenge = (INT)1;\ 583 (x)->floc = NULL;\ 584 LOCHOLE(&((x)->floc)) ;\ 585 } while (0) 586 587 #define INTGANZ(x) \ 588 ( x->signum < 0 ?\ 589 - x->floc->w0 - x->floc->w1 * LO_B - x->floc->w2 * LO_B * LO_B :\ 590 (x->floc->w0&BMINUSEINS)\ 591 +(x->floc->w1&BMINUSEINS) * LO_B\ 592 +(x->floc->w2&BMINUSEINS) * LO_B * LO_B ) 593 594 #define T_LONGINT_INT(a)\ 595 if ((S_O_S(a).ob_longint) ->laenge == 1)\ 596 if (S_O_S(a).ob_longint ->floc ->w2 <= 1) /* AK 051101 */\ 597 {\ 598 INT wert = INTGANZ(S_O_S(a).ob_longint);\ 599 FREESELF(a);\ 600 M_I_I(wert,a);\ 601 } 602 603 604 #define INIT_LONGINT(l) \ 605 do { \ 606 C_O_K(l,LONGINT); \ 607 CALLOC_MEMMANAGER(struct longint, longint_speicher,\ 608 longint_speicherindex,mem_counter_loc,(l->ob_self).ob_longint);\ 609 GANZDEFINIERE(S_O_S(l).ob_longint);\ 610 } while(0) 611 612 613 614 #define t_INTEGER_LONGINT(a,b) m_i_longint(a,b) 615 616 #ifdef FAST 617 #define SYMCHECK(a,b) 618 #define COP(text,object) 619 #define CTO(type,text,object) 620 #define CTTO(type,type2,text,object) 621 #define CTTTO(type,type2,type3,text,object) 622 #define CTTTTO(type,type2,type3,type4,text,object) 623 #define CTTTTTO(type,type2,type3,type4,type5,text,object) 624 #define CTTTTTTO(type,type2,type3,type4,type5,type6,text,object) 625 #define CTTTTTTTO(type,type2,type3,type4,type5,type6,type7,text,object) 626 #define CTTTTTTTTO(type,type2,type3,type4,type5,type6,type7,type8,text,object) 627 #define TCTO(type,text,object) 628 #define TCTTO(type,type2,text,object) 629 #define TCTTTO(type,type2,type3,text,object) 630 #define TCTTTTO(type,type2,type3,type4,text,object) 631 #define TCTTTTTO(type,type2,type3,type4,type5,text,object) 632 #define TCTTTTTTO(type,type2,type3,type4,type5,type6,text,object) 633 #define TCTTTTTTTO(type,type2,type3,type4,type5,type6,type7,text,object) 634 #define TCTTTTTTTTO(type,type2,type3,type4,type5,type6,type7,type8,text,object) 635 #else 636 #define SYMCHECK(a,b) if (a) { erg += error(b); goto endr_ende; } 637 #define COP(b,a) if (((void *)a) == NULL) { erg += null_object(b); goto endr_ende;} 638 #define CTO(type,text,object) \ 639 if (type == INTTYPE);\ 640 else { \ 641 COP(text,object);\ 642 if (type == ANYTYPE);\ 643 else if(S_O_K(object) != type) {\ 644 erg += wrong_type_oneparameter(text,object);\ 645 goto endr_ende;\ 646 }\ 647 } 648 649 #define CTTO(type,type2,text,object) \ 650 COP(text,object);\ 651 if((S_O_K(object) != type)&&(S_O_K(object) != type2)) {\ 652 erg += wrong_type_oneparameter(text,object);\ 653 goto endr_ende;\ 654 } 655 656 #define CTTTO(type,type2,type3,text,object) \ 657 COP(text,object);\ 658 if((S_O_K(object) != type)&&(S_O_K(object) != type2)\ 659 &&(S_O_K(object) != type3)) {\ 660 erg += wrong_type_oneparameter(text,object);\ 661 goto endr_ende; } 662 #define CTTTTO(type,type2,type3,type4,text,object) \ 663 COP(text,object);\ 664 if( (S_O_K(object) != type)\ 665 &&(S_O_K(object) != type2)\ 666 &&(S_O_K(object) != type3) \ 667 &&(S_O_K(object) != type4)) {\ 668 erg += wrong_type_oneparameter(text,object);\ 669 goto endr_ende; } 670 #define CTTTTTO(type,type2,type3,type4,type5,text,object) \ 671 COP(text,object);\ 672 if( (S_O_K(object) != type)\ 673 &&(S_O_K(object) != type2)\ 674 &&(S_O_K(object) != type3)\ 675 &&(S_O_K(object) != type4)\ 676 &&(S_O_K(object) != type5) ) {\ 677 erg += wrong_type_oneparameter(text,object);\ 678 goto endr_ende; } 679 #define CTTTTTTO(type,type2,type3,type4,type5,type6,text,object) \ 680 COP(text,object);\ 681 if( (S_O_K(object) != type)\ 682 &&(S_O_K(object) != type2)\ 683 &&(S_O_K(object) != type3)\ 684 &&(S_O_K(object) != type4)\ 685 &&(S_O_K(object) != type5)\ 686 &&(S_O_K(object) != type6) ) {\ 687 erg += wrong_type_oneparameter(text,object);\ 688 goto endr_ende; } 689 690 #define CTTTTTTTO(type,type2,type3,type4,type5,type6,type7,text,object) \ 691 COP(text,object);\ 692 if( (S_O_K(object) != type)\ 693 &&(S_O_K(object) != type2)\ 694 &&(S_O_K(object) != type3)\ 695 &&(S_O_K(object) != type4)\ 696 &&(S_O_K(object) != type5)\ 697 &&(S_O_K(object) != type7)\ 698 &&(S_O_K(object) != type6) ) {\ 699 erg += wrong_type_oneparameter(text,object);\ 700 goto endr_ende; } 701 702 #define CTTTTTTTTO(type,type2,type3,type4,type5,type6,type7,type8,text,object) \ 703 COP(text,object);\ 704 if( (S_O_K(object) != type)\ 705 &&(S_O_K(object) != type2)\ 706 &&(S_O_K(object) != type3)\ 707 &&(S_O_K(object) != type4)\ 708 &&(S_O_K(object) != type5)\ 709 &&(S_O_K(object) != type7)\ 710 &&(S_O_K(object) != type8)\ 711 &&(S_O_K(object) != type6) ) {\ 712 erg += wrong_type_oneparameter(text,object);\ 713 goto endr_ende; } 714 715 716 717 #define TCTO(type,text,object) \ 718 CTO(type,text,object);\ 719 if (type == INTTYPE) printf("%s= %ld\n",text,(INT)object);\ 720 else { printf("%s=",text);println(object);} 721 722 #define TCTTO(type,type2,text,object) \ 723 CTTO(type,type2,text,object);\ 724 printf("%s=",text);println(object); 725 726 #define TCTTTO(type,type2,type3,text,object) \ 727 COP(text,object);\ 728 if((S_O_K(object) != type)&&\ 729 (S_O_K(object) != type3)&&(S_O_K(object) != type2)) {\ 730 erg += wrong_type_oneparameter(text,object);\ 731 goto endr_ende;\ 732 }\ 733 printf("%s=",text);println(object); 734 735 #define TCTTTTO(type,type2,type3,type4,text,object) \ 736 COP(text,object);\ 737 if((S_O_K(object) != type)&&(S_O_K(object) != type4)&&\ 738 (S_O_K(object) != type3)&&(S_O_K(object) != type2)) {\ 739 erg += wrong_type_oneparameter(text,object);\ 740 goto endr_ende;\ 741 }\ 742 printf("%s=",text);println(object); 743 744 #define TCTTTTTO(type,type2,type3,type4,type5,text,object) \ 745 COP(text,object);\ 746 if((S_O_K(object) != type)&&(S_O_K(object) != type4)&&\ 747 (S_O_K(object) != type5)&&\ 748 (S_O_K(object) != type3)&&(S_O_K(object) != type2)) {\ 749 erg += wrong_type_oneparameter(text,object);\ 750 goto endr_ende;\ 751 }\ 752 printf("%s=",text);println(object); 753 754 #define TCTTTTTTO(type,type2,type3,type4,type5,type6,text,object) \ 755 COP(text,object);\ 756 if((S_O_K(object) != type)&&(S_O_K(object) != type4)&&\ 757 (S_O_K(object) != type5)&&(S_O_K(object) != type6)&&\ 758 (S_O_K(object) != type3)&&(S_O_K(object) != type2)) {\ 759 erg += wrong_type_oneparameter(text,object);\ 760 goto endr_ende;\ 761 }\ 762 printf("%s=",text);println(object); 763 764 #define TCTTTTTTTO(type,type2,type3,type4,type5,type6,type7,text,object) \ 765 COP(text,object);\ 766 if((S_O_K(object) != type)&&(S_O_K(object) != type4)&&\ 767 (S_O_K(object) != type5)&&(S_O_K(object) != type6)&&\ 768 (S_O_K(object) != type7)&&\ 769 (S_O_K(object) != type3)&&(S_O_K(object) != type2)) {\ 770 erg += wrong_type_oneparameter(text,object);\ 771 goto endr_ende;\ 772 }\ 773 printf("%s=",text);println(object); 774 775 #define TCTTTTTTTTO(type,type2,type3,type4,type5,type6,type7,type8,text,object) \ 776 COP(text,object);\ 777 if((S_O_K(object) != type)&&(S_O_K(object) != type4)&&\ 778 (S_O_K(object) != type5)&&(S_O_K(object) != type6)&&\ 779 (S_O_K(object) != type7)&&(S_O_K(object) != type8)&&\ 780 (S_O_K(object) != type3)&&(S_O_K(object) != type2)) {\ 781 erg += wrong_type_oneparameter(text,object);\ 782 goto endr_ende;\ 783 }\ 784 printf("%s=",text);println(object); 785 786 787 #endif 788 #define C2R(a,b,t,c) if (check_result_2(a,b,t,c) \ 789 != NORESULT) goto strlabel 790 #define S2R(a,b,t,c) erg += store_result_2(a,b,t,c);strlabel: 791 #define C3R(a,b,d,t,c) if (check_result_3(a,b,d,t,c)\ 792 != NORESULT) goto strlabel 793 #define S3R(a,b,d,t,c) erg += store_result_3(a,b,d,t,c);strlabel: 794 #define C5R(a,b,d,e,f,t,c) if (check_result_5(a,b,d,e,f,t,c)\ 795 != NORESULT) goto strlabel 796 #define S5R(a,b,d,e,f,t,c) erg += store_result_5(a,b,d,e,f,t,c);strlabel: 797 #define C0R(t,c) if (check_result_0(t,c)\ 798 != NORESULT) goto strlabel 799 #define S0R(t,c) erg += store_result_0(t,c);strlabel: 800 #define C1R(a,t,c) if (check_result_1(a,t,c)\ 801 != NORESULT) goto strlabel 802 #define S1R(a,t,c) erg += store_result_1(a,t,c);strlabel: 803 #define WTO(text,b) erg += wrong_type_oneparameter(text,b) 804 #define WTT(text,b,c) erg += wrong_type_twoparameter(text,b,c) 805 #define EDC(b) error_during_computation_code(b,erg) 806 #define ENDR(a) endr_ende: if (erg != OK) EDC(a); return erg; 807 #define ENDO(a) endr_ende: if (erg != OK) EDC(a); return (OP) NULL; 808 #define ENDTYP(a,t) endr_ende: if (erg != OK) EDC(a); return (t) NULL; 809 #define NYI(b) not_yet_implemented(b) 810 #define NOP(a) null_object(a) 811 #define EOP(text,object) \ 812 COP(text,object);\ 813 if (EMPTYP(object)) {erg += empty_object(text); goto endr_ende;} 814 #define FATALERROR(text) fatal_error(text) 815 #define CH2D(a,b) if ((a) == (b) ) { erg += equal_2_error(); goto endr_ende;} 816 817 #define CE2A(a,b,f) if (check_equal_2a(a,b,f,&erg) == EQUAL) goto endr_ende; 818 819 #define CE3(a,b,c,f) \ 820 if ((a==c) && (b == c))\ 821 {\ 822 OP checkequal3_d = callocobject();\ 823 *checkequal3_d = *c;\ 824 C_O_K(c,EMPTY);\ 825 erg += (*f)(checkequal3_d,checkequal3_d,c);\ 826 erg += freeall(checkequal3_d);\ 827 goto endr_ende;\ 828 }\ 829 else if (a==c)\ 830 {\ 831 OP checkequal3_d = callocobject();\ 832 *checkequal3_d = *c;\ 833 C_O_K(c,EMPTY);\ 834 erg += (*f)(checkequal3_d,b,c);\ 835 erg += freeall(checkequal3_d);\ 836 goto endr_ende;\ 837 }\ 838 else if (b==c)\ 839 {\ 840 OP checkequal3_d = callocobject();\ 841 *checkequal3_d = *c;\ 842 C_O_K(c,EMPTY);\ 843 erg += (*f)(a,checkequal3_d,c);\ 844 erg += freeall(checkequal3_d);\ 845 goto endr_ende;\ 846 }\ 847 else\ 848 {\ 849 if (c != NULL)\ 850 FREESELF(c);\ 851 } 852 853 #define CE4(a,b,c,d,f) \ 854 if (check_equal_4(a,b,c,d,\ 855 f,&erg) == EQUAL) goto endr_ende; 856 #define CE5(a,b,c,d,e,f) \ 857 if (check_equal_5(a,b,c,d,e,\ 858 f,&erg) == EQUAL) goto endr_ende; 859 860 #define GET_BIT_I(a,i) (((*a) >> (i))&1) 861 /* 862 #define GET_BV_I(a,i) ((*(((unsigned char *)S_V_S(a) ) + ((i)>>3)) >> ((i)&7))&1) 863 */ 864 #define GET_BV_I(a,i) ((*(((unsigned char *)S_V_S(a) ) + ((i)>>3)) >> (7-((i)&7))&1)) 865 #define GET_BV_B(a,i) (*(((unsigned char *)S_V_S(a) ) + (i)>>3)) 866 /* 867 #define UNSET_BV_I(a,i) (*((unsigned char *)S_V_S(a) + ((i)>>3)) &= (~(1 << ((i)&7)))) 868 */ 869 #define UNSET_BV_I(a,i) (\ 870 *((unsigned char *)S_V_S(a) + ((i)>>3)) \ 871 &= (~(1 << (7-((i)&7)) ) )\ 872 ) 873 #define UNSET_BIT_I(a,i) ((*(a)) &= (~(1 << (i)))) 874 /* 875 #define SET_BV_I(a,i) ( *((unsigned char *)S_V_S(a) + ((i)>>3)) |= (1 << ((i)&7))) 876 */ 877 #define SET_BV_I(a,i) ( *((unsigned char *)S_V_S(a) + ((i)>>3)) |= (128 >> ((i)&7))) 878 #define SET_BIT_I(a,i) ( *(a) |= (1 << (i))) 879 #define S_BV_LI(a) (S_V_LI(a) % 8 == 0 ? S_V_LI(a)>>3 : (S_V_LI(a)>>3) +1) 880 881 882 #define cons_two cons_zwei 883 #define ANFANG \ 884 int main()\ 885 {\ 886 OP a,b,c,d,e,f,g,h;\ 887 INT i,j,k;\ 888 OP z=NULL;\ 889 anfang();\ 890 a=callocobject();\ 891 b=callocobject();\ 892 c=callocobject();\ 893 d=callocobject();\ 894 e=callocobject();\ 895 f=callocobject();\ 896 g=callocobject();\ 897 h=callocobject(); 898 899 #define ENDE \ 900 freeall(a);\ 901 freeall(b);\ 902 freeall(c);\ 903 freeall(d);\ 904 freeall(e);\ 905 freeall(f);\ 906 freeall(g);\ 907 freeall(h);\ 908 ende();\ 909 i=j=k=0;z=NULL;\ 910 return 0;\ 911 } 912 #define SYM_BEGIN ANFANG 913 #define SYM_END ENDE 914 915 #define inhalt(a,b) content(a,b) 916 #define inhalt_tableaux(a,b) content_tableaux(a,b) 917 #define inhalt_word(a,b) content_word(a,b) 918 919 920 921 922 923 924 925 926 927 /* FOR ALL macros */ 928 #define FORALL_HASHTABLE_PRE060202(z,a,B)\ 929 do { \ 930 OP FORALL_E;INT I,J; \ 931 for (FORALL_E=S_V_S(a), I=0; I<S_V_LI(a); I++,FORALL_E++) \ 932 {\ 933 if (S_O_K(FORALL_E)==VECTOR)\ 934 for (J=0;J<S_V_LI(FORALL_E) ;J++) \ 935 { \ 936 z = S_V_I(FORALL_E,J); \ 937 if (not EMPTYP(z)) {B;} \ 938 } \ 939 }\ 940 } while(0) 941 942 #define FORALL_HASHTABLE(z,a,B)\ 943 do { \ 944 OP FORALL_E;INT I,J; \ 945 for (FORALL_E=S_V_S(a), I=0; I<S_V_LI(a); I++,FORALL_E++) \ 946 {\ 947 if (S_O_K(FORALL_E)==VECTOR)\ 948 for (J=0,z=S_V_S(FORALL_E);J<S_V_LI(FORALL_E) ;J++,z++) \ 949 { if (not EMPTYP(z)) {B;} } \ 950 else if (S_I_I(FORALL_E) == -1) break;\ 951 else { I = S_I_I(FORALL_E)-1; FORALL_E=S_V_I(a,I); } \ 952 }\ 953 } while(0) 954 955 956 #define FORALL(z,a,B)\ 957 if (S_O_K(a) == HASHTABLE) \ 958 do { \ 959 OP FORALL_E;INT I,J; \ 960 for (FORALL_E=S_V_S(a), I=0; I<S_V_LI(a); I++,FORALL_E++) \ 961 {\ 962 if (S_O_K(FORALL_E)==VECTOR)\ 963 for (J=0,z=S_V_S(FORALL_E);J<S_V_LI(FORALL_E) ;J++,z++) \ 964 { if (not EMPTYP(z)) {B;} }\ 965 else if (S_I_I(FORALL_E) == -1) break;\ 966 else { I = S_I_I(FORALL_E)-1; FORALL_E=S_V_I(a,I); } \ 967 }\ 968 } while(0);\ 969 else if (LISTP(a)) { \ 970 OP FORALL_E; \ 971 FORALL_E=a; \ 972 while (FORALL_E!=NULL) \ 973 { z = S_L_S(FORALL_E); \ 974 if (z != NULL) {B;}; \ 975 FORALL_E=S_L_N(FORALL_E); } \ 976 }\ 977 else if (MATRIXP(a)) {\ 978 INT I=S_M_HI(a)*S_M_LI(a)-1;\ 979 for (z=S_M_S(a)+I;I>=0;I--,z--) {B;}\ 980 }\ 981 else if (VECTORP(a)) {\ 982 INT I=S_V_LI(a)-1;\ 983 for (z=S_V_S(a)+I;I>=0;I--,z--) {B;}\ 984 } 985 986 987 988 989 990 /* new macros for main functions */ 991 992 #define ABSOLUTE_INTEGER(a,b) \ 993 M_I_I((S_I_I(a) > 0 ? S_I_I(a) : -S_I_I(a)), b) 994 995 #define ADD_INTEGER(a,b,c) \ 996 if (S_O_K(b) == INTEGER) erg += add_integer_integer(a,b,c);\ 997 else if (S_O_K(b) == LONGINT) erg += add_longint_integer(b,a,c);\ 998 else if (S_O_K(b) == BRUCH) erg += add_bruch_integer(b,a,c);\ 999 else erg += add_integer(a,b,c) 1000 1001 #define ADD(a,b,c) \ 1002 if (S_O_K(a) == INTEGER) ADD_INTEGER(a,b,c); \ 1003 else if (S_O_K(a) == LONGINT) \ 1004 {\ 1005 if (S_O_K(b) == INTEGER) erg += add_longint_integer(a,b,c);\ 1006 else if (S_O_K(b) == LONGINT) erg += add_longint_longint(b,a,c);\ 1007 else erg += add_longint(a,b,c);\ 1008 }\ 1009 else\ 1010 erg += add(a,b,c) 1011 1012 #define ADD_APPLY_INTEGER(a,b)\ 1013 if (S_O_K(b) == INTEGER) erg += add_apply_integer_integer(a,b);\ 1014 else if (S_O_K(b) == LONGINT) erg += add_apply_integer_longint(a,b);\ 1015 else if (S_O_K(b) == BRUCH) erg += add_apply_integer_bruch(a,b);\ 1016 else erg += add_apply_integer(a,b) 1017 1018 #define ADD_APPLY(a,b) \ 1019 if (S_O_K(a) == INTEGER) ADD_APPLY_INTEGER(a,b);\ 1020 else if (S_O_K(a) == LONGINT) \ 1021 {\ 1022 if (S_O_K(b) == INTEGER) erg += add_apply_longint_integer(a,b);\ 1023 else if (S_O_K(b) == LONGINT) erg += add_apply_longint_longint(a,b);\ 1024 else erg += add_apply_longint(a,b);\ 1025 }\ 1026 else if (S_O_K(a) == BRUCH) \ 1027 {\ 1028 if (S_O_K(b) == INTEGER) erg += add_apply_bruch_integer(a,b);\ 1029 else if (S_O_K(b) == BRUCH) erg += add_apply_bruch_bruch(a,b);\ 1030 else erg += add_apply_bruch(a,b);\ 1031 }\ 1032 else if (S_O_K(a) == INTEGERVECTOR) erg += add_apply_integervector(a,b);\ 1033 else if (S_O_K(a) == POLYNOM) erg += add_apply_polynom(a,b);\ 1034 else if (S_O_K(a) == FF) erg += add_apply_ff(a,b);\ 1035 else\ 1036 erg += add_apply(a,b) 1037 1038 #define ADDINVERS_INTEGER(a,b) M_I_I(-S_I_I(a),b) 1039 1040 #define ADDINVERS(a,b) \ 1041 if (S_O_K(a) == INTEGER) ADDINVERS_INTEGER(a,b);\ 1042 else if (S_O_K(a) == LONGINT) erg += addinvers_longint(a,b);\ 1043 else if (S_O_K(a) == BRUCH) erg += addinvers_bruch(a,b);\ 1044 else erg += addinvers(a,b) 1045 1046 1047 #define ADDINVERS_APPLY_LONGINT(a) erg += (GANZNEG(S_O_S(a).ob_longint),OK) 1048 #define ADDINVERS_APPLY_INTEGER(a) M_I_I( - S_I_I(a),a) 1049 1050 #define ADDINVERS_APPLY(a)\ 1051 if (S_O_K(a) == INTEGER) ADDINVERS_APPLY_INTEGER(a);\ 1052 else if (S_O_K(a) == LONGINT) ADDINVERS_APPLY_LONGINT(a);\ 1053 else if (S_O_K(a) == BRUCH) erg += addinvers_apply_bruch(a);\ 1054 else if (S_O_K(a) == MONOM) erg += addinvers_apply_monom(a);\ 1055 else erg += addinvers_apply(a) 1056 1057 1058 #define BINOM_POSINTEGER_POSINTEGER(a,b,c)\ 1059 if (S_I_I(a) < BINOMLIMIT) {\ 1060 M_I_I( \ 1061 ( (S_I_I(b)>S_I_I(a)) ? 0 : binom_values [ S_I_I(a) ] [S_I_I(b)] )\ 1062 ,c);\ 1063 }\ 1064 else binom(a,b,c) 1065 1066 1067 /* 1068 #ifdef SYMMAGMA 1069 #define CALLOCOBJECT() \ 1070 ( (freeall_speicherposition >= 0L) ? \ 1071 freeall_speicher[freeall_speicherposition--] : \ 1072 mem_calloc(sizeof(struct object),1) ) 1073 #define CALLOCOBJECT() (OP)mem_calloc(sizeof(struct object),1) 1074 #else 1075 */ 1076 /* freeall_speicherposition is next free object */ 1077 #define CALLOCOBJECT() \ 1078 ( (freeall_speicherposition >= 0L) ? \ 1079 freeall_speicher[freeall_speicherposition--] : \ 1080 callocobject_fast() ) 1081 /* 1082 #endif 1083 */ 1084 1085 #define CALLOCOBJECT2(a,b) \ 1086 do { a=CALLOCOBJECT(); b=CALLOCOBJECT(); } while(0) 1087 1088 #define CALLOCOBJECT3(a,b,c) \ 1089 do { a=CALLOCOBJECT(); b=CALLOCOBJECT();c=CALLOCOBJECT(); } while(0) 1090 1091 #define CALLOCOBJECT4(a,b,c,d) \ 1092 do { a=CALLOCOBJECT(); b=CALLOCOBJECT();c=CALLOCOBJECT(); d=CALLOCOBJECT();} while(0) 1093 1094 #define CALLOCOBJECT5(a,b,c,d,e) \ 1095 do { a=CALLOCOBJECT(); b=CALLOCOBJECT();\ 1096 c=CALLOCOBJECT(); d=CALLOCOBJECT();\ 1097 e=CALLOCOBJECT();} while(0) 1098 1099 #define CALLOCOBJECT6(a,b,c,d,e,f) \ 1100 do { a=CALLOCOBJECT(); b=CALLOCOBJECT();\ 1101 c=CALLOCOBJECT(); d=CALLOCOBJECT();\ 1102 e=CALLOCOBJECT(); f=CALLOCOBJECT(); } while(0) 1103 1104 #define CALLOCOBJECT7(a,b,c,d,e,f,g) \ 1105 do { a=CALLOCOBJECT(); b=CALLOCOBJECT();\ 1106 c=CALLOCOBJECT(); d=CALLOCOBJECT();\ 1107 e=CALLOCOBJECT(); f=CALLOCOBJECT(); \ 1108 g=CALLOCOBJECT();} while(0) 1109 1110 #define CALLOCOBJECT8(a,b,c,d,e,f,g,h) \ 1111 do { a=CALLOCOBJECT(); b=CALLOCOBJECT();\ 1112 c=CALLOCOBJECT(); d=CALLOCOBJECT();\ 1113 e=CALLOCOBJECT(); f=CALLOCOBJECT();h=CALLOCOBJECT(); \ 1114 g=CALLOCOBJECT();} while(0) 1115 1116 #define CALLOCOBJECT9(a,b,c,d,e,f,g,h,i) \ 1117 do { a=CALLOCOBJECT(); b=CALLOCOBJECT(); h=CALLOCOBJECT(); i=CALLOCOBJECT();\ 1118 c=CALLOCOBJECT(); d=CALLOCOBJECT();\ 1119 e=CALLOCOBJECT(); f=CALLOCOBJECT(); \ 1120 g=CALLOCOBJECT();} while(0) 1121 1122 #define COMP_INTEGER(a,b)\ 1123 ( S_O_K(b) == INTEGER ? COMP_INTEGER_INTEGER(a,b) : \ 1124 (S_O_K(b) == LONGINT ? - comp_longint_integer(b,a) : comp_integer(a,b) )\ 1125 ) 1126 1127 #define COMP(a,b)\ 1128 ( S_O_K(a) == INTEGER ? COMP_INTEGER(a,b) :\ 1129 (S_O_K(a) == LONGINT ? comp_longint(a,b) : \ 1130 (S_O_K(a) == INTEGERMATRIX ? comp_integermatrix(a,b) : \ 1131 comp(a,b) \ 1132 )\ 1133 )\ 1134 ) 1135 1136 #define COPY(a,b) \ 1137 ( (S_O_K(a) == INTEGER) ? M_I_I(S_I_I(a),b):\ 1138 ( (S_O_K(a) == LONGINT) ? copy_longint(a,b): \ 1139 ( (S_O_K(a) == BRUCH) ? copy_bruch(a,b): \ 1140 ( (S_O_K(a) == MONOM) ? copy_monom(a,b): \ 1141 ( (S_O_K(a) == PARTITION) ? copy_partition(a,b): \ 1142 ( (S_O_K(a) == HASHTABLE)? copy_hashtable(a,b): \ 1143 ( (S_O_K(a) == MATRIX)? copy_matrix(a,b): \ 1144 ( (S_O_K(a) == INTEGERMATRIX)? copy_integermatrix(a,b): \ 1145 copy(a,b)\ 1146 )\ 1147 )\ 1148 )\ 1149 )\ 1150 )\ 1151 )\ 1152 )\ 1153 ) 1154 1155 #define CLEVER_COPY_INTEGER(a,b) \ 1156 do { switch(S_O_K(b)) {\ 1157 case INTEGER:\ 1158 case EMPTY:\ 1159 M_I_I(S_I_I(a),b);\ 1160 break;\ 1161 default:\ 1162 FREESELF(b);\ 1163 M_I_I(S_I_I(a),b);\ 1164 break;\ 1165 }\ 1166 } while (0) 1167 1168 #define CLEVER_COPY_FF(a,b) \ 1169 do { switch(S_O_K(b)) {\ 1170 case INTEGER:\ 1171 C_O_K(b,EMPTY);\ 1172 case EMPTY:\ 1173 erg += copy_ff(a,b);\ 1174 break;\ 1175 case FF:\ 1176 {\ 1177 INT *ap,*bp,i;\ 1178 COPY(S_FF_C(a),S_FF_C(b));\ 1179 COPY(S_FF_ME(a),S_FF_ME(b));\ 1180 ap =S_FF_IP(a);bp=S_FF_IP(b);\ 1181 if (*ap != *bp)\ 1182 bp = (INT*) SYM_realloc(bp,(S_FF_DI(a)+1)*sizeof(INT));\ 1183 for(i=0;i<=ap[0];i++) bp[i]=ap[i];\ 1184 C_FF_IP(b,bp);\ 1185 };\ 1186 break; \ 1187 default:\ 1188 FREESELF(b);\ 1189 erg += copy_ff(a,b);\ 1190 break;\ 1191 }\ 1192 } while (0) 1193 #define CLEVER_COPY_BRUCH(a,b) \ 1194 do { switch(S_O_K(b)) {\ 1195 case INTEGER:\ 1196 C_O_K(b,EMPTY);\ 1197 case EMPTY:\ 1198 erg += copy_bruch(a,b);\ 1199 break;\ 1200 case BRUCH:\ 1201 FREESELF(S_B_O(b));\ 1202 FREESELF(S_B_U(b));\ 1203 COPY(S_B_O(a),S_B_O(b));\ 1204 COPY(S_B_U(a),S_B_U(b));\ 1205 C_B_I(b,S_B_I(a));\ 1206 break;\ 1207 default:\ 1208 FREESELF(b);\ 1209 erg += copy_bruch(a,b);\ 1210 break;\ 1211 }\ 1212 } while (0) 1213 1214 #define CLEVER_COPY_LONGINT(a,b)\ 1215 do { switch(S_O_K(b)) {\ 1216 case INTEGER:\ 1217 C_O_K(b,EMPTY);\ 1218 case EMPTY:\ 1219 erg += copy_longint(a,b);\ 1220 break;\ 1221 default:\ 1222 FREESELF(b);\ 1223 erg += copy_longint(a,b);\ 1224 break;\ 1225 }\ 1226 } while(0) 1227 1228 #define CLEVER_COPY_PARTITION(a,b)\ 1229 do { switch(S_O_K(b)) {\ 1230 case INTEGER:\ 1231 C_O_K(b,EMPTY);\ 1232 case EMPTY:\ 1233 erg += copy_partition(a,b);\ 1234 break;\ 1235 case PARTITION:\ 1236 FREESELF(S_PA_S(b));\ 1237 if (S_O_K(S_PA_S(a))==INTEGERVECTOR) copy_integervector(S_PA_S(a),S_PA_S(b));\ 1238 else COPY(S_PA_S(a),S_PA_S(b));\ 1239 C_PA_K(b, S_PA_K(a));\ 1240 C_PA_HASH(b, S_PA_HASH(a));\ 1241 break;\ 1242 default:\ 1243 FREESELF(b);\ 1244 erg += copy_partition(a,b);\ 1245 break;\ 1246 }\ 1247 } while(0) 1248 1249 1250 1251 #define CLEVER_COPY(a,b) \ 1252 do { if (S_O_K(a) == INTEGER) CLEVER_COPY_INTEGER(a,b);\ 1253 else if (S_O_K(a) == LONGINT) CLEVER_COPY_LONGINT(a,b);\ 1254 else if (S_O_K(a) == BRUCH) CLEVER_COPY_BRUCH(a,b);\ 1255 else if (S_O_K(a) == PARTITION) CLEVER_COPY_PARTITION(a,b);\ 1256 else if (S_O_K(a) == FF) CLEVER_COPY_FF(a,b);\ 1257 else { erg += copy(a,b); }\ 1258 } while(0) 1259 1260 1261 1262 #define DEC(a)\ 1263 if (S_O_K(a) == INTEGER) DEC_INTEGER(a);\ 1264 else if (S_O_K(a) == LONGINT) erg+= dec_longint(a);\ 1265 else dec(a) 1266 1267 #define EINSP_LONGINT(a)\ 1268 (\ 1269 ((S_O_S(a).ob_longint) ->floc ->w0 == 1) \ 1270 &&\ 1271 ((S_O_S(a).ob_longint) ->floc ->w1 == 0)\ 1272 &&\ 1273 ((S_O_S(a).ob_longint) ->floc ->w2 == 0)\ 1274 &&\ 1275 ((S_O_S(a).ob_longint) ->signum == 1)\ 1276 &&\ 1277 ((S_O_S(a).ob_longint) ->laenge == 1)\ 1278 ) 1279 1280 1281 #define EINSP(a)\ 1282 ( S_O_K(a) == INTEGER ? EINSP_INTEGER(a): \ 1283 ( S_O_K(a) == LONGINT ? EINSP_LONGINT(a) : \ 1284 ( S_O_K(a) == BRUCH ? EINSP_BRUCH(a) : \ 1285 ( einsp(a) ) \ 1286 ) \ 1287 ) \ 1288 ) 1289 1290 #define EVEN_INTEGER(a) (S_I_I(a) % 2 == 0) 1291 #define EVEN_LONGINT(a) \ 1292 (\ 1293 ((S_O_S(a).ob_longint) ->signum == 0) \ 1294 ||\ 1295 ((S_O_S(a).ob_longint) ->floc ->w0 % 2 == 0)\ 1296 ) 1297 1298 #define EVEN(a) \ 1299 ( S_O_K(a) == INTEGER ? (EVEN_INTEGER(a)) : \ 1300 ( S_O_K(a) == LONGINT ? EVEN_LONGINT(a) : even(a) )\ 1301 ) 1302 1303 #define FREE_EMPTY_OBJECT(a)\ 1304 do {\ 1305 CTO(EMPTY,"FREE_EMPTY_OBJECT(1)",a);\ 1306 if (freeall_speichersize+SPEICHERSIZE <freeall_speichersize_max)\ 1307 {\ 1308 if (freeall_speicherposition+1 == freeall_speichersize) \ 1309 {\ 1310 freeall_speicher = (OP *) \ 1311 SYM_realloc(freeall_speicher,\ 1312 (freeall_speichersize+SPEICHERSIZE)*sizeof(OP));\ 1313 if (freeall_speicher == NULL) {\ 1314 erg += error("no more memory in freeall");\ 1315 goto endr_ende;\ 1316 }\ 1317 freeall_speichersize = freeall_speichersize+SPEICHERSIZE;\ 1318 }\ 1319 freeall_speicher[++freeall_speicherposition] = a;\ 1320 }\ 1321 else SYM_FREE(a);\ 1322 } while(0) 1323 1324 #define FREEALL_INTEGER(a) do { C_O_K(a,EMPTY); FREE_EMPTY_OBJECT(a); } while(0) 1325 #define FREESELF_INTEGERVECTOR(a) \ 1326 do {\ 1327 extern INT freevectorstruct();\ 1328 if (S_V_LI(a) == (INT)1) FREEALL_INTEGER(S_V_S(a));\ 1329 else if (S_V_LI(a) > (INT)0) SYM_free(S_V_S(a));\ 1330 FREEALL_INTEGER(S_V_L(a));\ 1331 freevectorstruct(S_O_S(a).ob_vector);\ 1332 C_O_K(a,EMPTY);\ 1333 } while(0) 1334 #define FREEALL_INTEGERVECTOR(a) do { \ 1335 FREESELF_INTEGERVECTOR(a); FREE_EMPTY_OBJECT(a); } while(0) 1336 1337 1338 #define FREESELF(a) \ 1339 if (S_O_K(a) == EMPTY);\ 1340 else if (S_O_K(a) == INTEGER) C_O_K(a,EMPTY);\ 1341 else if (S_O_K(a) == LONGINT) erg += freeself_longint(a); \ 1342 else if (S_O_K(a) == BRUCH) erg += freeself_bruch(a); \ 1343 else if (S_O_K(a) == PARTITION) erg += freeself_partition(a); \ 1344 else if (S_O_K(a) == MATRIX) erg += freeself_matrix(a); \ 1345 else if (S_O_K(a) == INTEGERMATRIX) erg += freeself_integermatrix(a); \ 1346 else if (S_O_K(a) == MONOM) FREESELF_MONOM(a); \ 1347 else if (S_O_K(a) == INTEGERVECTOR) FREESELF_INTEGERVECTOR(a); \ 1348 else if (S_O_K(a) == VECTOR) erg += freeself_vector(a); \ 1349 else if (S_O_K(a) == HASHTABLE) erg += freeself_hashtable(a); \ 1350 else if (LISTP(a)) erg += freeself_list(a); \ 1351 else if (S_O_K(a) == PERMUTATION) erg += freeself_permutation(a); \ 1352 else if (S_O_K(a) == SKEWPARTITION) erg += freeself_skewpartition(a); \ 1353 else if (S_O_K(a) == FF) erg += freeself_ff(a); \ 1354 else erg += freeself(a) 1355 1356 #define FREESELF2(a,b) do { FREESELF(a); FREESELF(b); } while(0) 1357 #define FREESELF2(a,b) do { FREESELF(a); FREESELF(b); } while(0) 1358 #define FREESELF3(a,b,c) do { FREESELF(a); FREESELF(b); FREESELF(c); } while(0) 1359 #define FREESELF4(a,b,c,d) do { FREESELF2(a,b); FREESELF2(c,d); } while(0) 1360 #define FREESELF5(a,b,c,d,e) do { FREESELF2(a,b); FREESELF3(c,d,e); } while(0) 1361 #define FREESELF6(a,b,c,d,e,f) do { FREESELF3(a,b,f); FREESELF3(c,d,e); } while(0) 1362 #define FREESELF7(a,b,c,d,e,f,g) do { FREESELF4(a,b,f,g); FREESELF3(c,d,e); } while(0) 1363 1364 #define FREEALL(a) do { FREESELF(a); FREE_EMPTY_OBJECT(a); } while(0) 1365 #define FREEALL2(a,b) do { FREEALL(a); FREEALL(b); } while(0) 1366 #define FREEALL3(a,b,c) do { FREEALL(a); FREEALL(b); FREEALL(c); } while(0) 1367 #define FREEALL4(a,b,c,d) do { FREEALL(a); FREEALL(b); FREEALL(c);FREEALL(d); } while(0) 1368 #define FREEALL5(a,b,c,d,e) do { FREEALL2(a,b); FREEALL3(c,d,e); } while(0) 1369 #define FREEALL6(a,b,c,d,e,f) do { FREEALL3(a,b,f); FREEALL3(c,d,e); } while(0) 1370 #define FREEALL7(a,b,c,d,e,f,g) do { FREEALL4(a,b,f,g); FREEALL3(c,d,e); } while(0) 1371 #define FREEALL8(a,b,c,d,e,f,g,h) do { FREEALL4(a,b,f,g); FREEALL4(c,d,e,h); } while(0) 1372 #define FREEALL9(a,b,c,d,e,f,g,h,i) do { FREEALL4(a,b,f,g); FREEALL5(c,d,e,h,i); } while(0) 1373 1374 #define GANZDIV_INTEGER(a,b,c) \ 1375 if (S_O_K(b) == INTEGER) M_I_I(S_I_I(a)/S_I_I(b),c);\ 1376 else if (S_O_K(b) == LONGINT) erg += ganzdiv_integer_longint(a,b,c);\ 1377 else erg += ganzdiv_integer(a,b,c) 1378 1379 #define GANZDIV_LONGINT(a,b,c) \ 1380 if (S_O_K(b) == INTEGER) erg += ganzdiv_longint_integer(a,b,c);\ 1381 else if (S_O_K(b) == LONGINT) erg += ganzdiv_longint_longint(a,b,c);\ 1382 else erg += ganzdiv_longint(a,b,c) 1383 1384 #define GANZDIV(a,b,c) \ 1385 if (S_O_K(a) == INTEGER) GANZDIV_INTEGER(a,b,c); \ 1386 else if (S_O_K(a) == LONGINT) GANZDIV_LONGINT(a,b,c); \ 1387 else\ 1388 erg += ganzdiv(a,b,c) 1389 1390 1391 #define GANZDIV_APPLY_INTEGER(a,b) \ 1392 if (S_O_K(b) == INTEGER) M_I_I(S_I_I(a)/S_I_I(b),a);\ 1393 else ganzdiv_apply_integer(a,b) 1394 1395 #define GANZDIV_APPLY_LONGINT(a,b) \ 1396 if (S_O_K(b) == INTEGER) erg += ganzdiv_apply_longint_integer(a,b);\ 1397 else if (S_O_K(b) == LONGINT) erg += ganzdiv_apply_longint_longint(a,b);\ 1398 else ganzdiv_apply_longint(a,b) 1399 1400 #define GANZDIV_APPLY(a,b) \ 1401 if (S_O_K(a) == INTEGER) GANZDIV_APPLY_INTEGER(a,b);\ 1402 else if (S_O_K(a) == LONGINT) GANZDIV_APPLY_LONGINT(a,b);\ 1403 else\ 1404 erg += ganzdiv_apply(a,b); 1405 1406 1407 #define GGT_INTEGER(a,b,c) \ 1408 if (S_O_K(b) == INTEGER) erg += ggt_integer_integer(a,b,c);\ 1409 else if (S_O_K(b) == LONGINT) erg += ggt_integer_longint(a,b,c);\ 1410 else erg += ggt_integer(a,b,c) 1411 1412 #define GGT_LONGINT(a,b,c) \ 1413 if (S_O_K(b) == INTEGER) erg += ggt_integer_longint(b,a,c);\ 1414 else if (S_O_K(b) == LONGINT) erg += ggt_longint_longint(a,b,c);\ 1415 else erg += ggt_longint(a,b,c) 1416 1417 #define GGT(a,b,c) \ 1418 if (S_O_K(a) == INTEGER) GGT_INTEGER(a,b,c); \ 1419 else if (S_O_K(a) == LONGINT) GGT_LONGINT(a,b,c); \ 1420 else\ 1421 erg += ggt(a,b,c) 1422 1423 #define HALF_APPLY_INTEGER(a) M_I_I((S_I_I(a) >> 1),a) 1424 1425 #define HALF_APPLY(a)\ 1426 if (S_O_K(a) == INTEGER)\ 1427 HALF_APPLY_INTEGER(a);\ 1428 else if (S_O_K(a) == LONGINT)\ 1429 half_apply_longint(a);\ 1430 else\ 1431 erg += half_apply(a)\ 1432 1433 1434 #define HASH_INTEGERVECTOR(a,res)\ 1435 if (S_V_LI(a) == 0) res=4711;\ 1436 else {\ 1437 INT hash_integer_vector_i;\ 1438 res = S_V_II(a,0);\ 1439 for (hash_integer_vector_i=1;hash_integer_vector_i<S_V_LI(a);hash_integer_vector_i++)\ 1440 {\ 1441 res *= 4711;\ 1442 res += S_V_II(a,hash_integer_vector_i);\ 1443 }\ 1444 } 1445 1446 #define HASH_MONOMPARTITION(a) \ 1447 ( S_PA_HASH(S_MO_S(a)) == -1 ? hash_partition(S_MO_S(a)) : S_PA_HASH(S_MO_S(a)) ) 1448 #define HASH_PARTITION(a) \ 1449 ( S_PA_HASH(a) == -1 ? hash_partition(a) : S_PA_HASH(a) ) 1450 #define HASH_MONOM(a) \ 1451 ( S_O_K(S_MO_S(a)) == PARTITION ? HASH_PARTITION(S_MO_S(a)) : hash(S_MO_S(a)) ) 1452 #define HASH(a) \ 1453 ( S_O_K(a) == MONOM ? HASH_MONOM(a): \ 1454 ( S_O_K(a) == INTEGER ? S_I_I(a) : hash(a) )\ 1455 ) 1456 1457 #define INC(a)\ 1458 if (S_O_K(a) == INTEGER) INC_INTEGER(a);\ 1459 else if (S_O_K(a) == LONGINT) erg+= inc_longint(a);\ 1460 else inc(a) 1461 1462 #define INSERT_BINTREE(a,b,eh,cf) insert_bintree(a,b,eh,cf) 1463 #define INSERT_HASHTABLE(a,b,eh,cf,hf) \ 1464 if (S_O_K(a) == HASHTABLE) insert_hashtable_hashtable(a,b,eh,cf,hf);\ 1465 else if (S_O_K(a) == SCHUR) insert_schur_hashtable(a,b,eh,cf,hf);\ 1466 else if (S_O_K(a) == MONOMIAL) insert_monomial_hashtable(a,b,eh,cf,hf);\ 1467 else if (S_O_K(a) == ELMSYM) insert_elmsym_hashtable(a,b,eh,cf,hf);\ 1468 else if (S_O_K(a) == POWSYM) insert_powsym_hashtable(a,b,eh,cf,hf);\ 1469 else if (S_O_K(a) == HOMSYM) insert_homsym_hashtable(a,b,eh,cf,hf);\ 1470 else insert_scalar_hashtable(a,b,eh,cf,hf) 1471 #define INSERT_LIST(a,b,eh,cf) \ 1472 if (LISTP(a)) insert_list_list(a,b,eh,cf); \ 1473 else insert_list(a,b,eh,cf) 1474 1475 #define INSERT(a,b,eh,cf) \ 1476 if (S_O_K(b) == HASHTABLE) INSERT_HASHTABLE(a,b,eh,cf,hash); \ 1477 else if (S_O_K(b) == BINTREE) INSERT_BINTREE(a,b,eh,cf); \ 1478 else INSERT_LIST(a,b,eh,cf) 1479 1480 #define INSERT_SCHURMONOM_(m,c)\ 1481 if (S_O_K(c) == HASHTABLE)\ 1482 INSERT_HASHTABLE(m,c,add_koeff,eq_monomsymfunc,hash_monompartition);\ 1483 else if (S_O_K(c) == SCHUR)\ 1484 INSERT_LIST(m,c,add_koeff,comp_monomschur);\ 1485 else if (S_O_K(c) == BINTREE)\ 1486 INSERT_BINTREE(m,c,add_koeff,comp_monomschur);\ 1487 else\ 1488 WTO("INSERT_SCHURMONOM_(2)",c) 1489 1490 #define INSERT_POWSYMMONOM_(m,c)\ 1491 if (S_O_K(c) == HASHTABLE)\ 1492 INSERT_HASHTABLE(m,c,add_koeff,eq_monomsymfunc,hash_monompartition);\ 1493 else if (S_O_K(c) == POWSYM)\ 1494 INSERT_LIST(m,c,add_koeff,comp_monompowsym);\ 1495 else if (S_O_K(c) == BINTREE)\ 1496 INSERT_BINTREE(m,c,add_koeff,comp_monompowsym);\ 1497 else\ 1498 WTO("INSERT_POWSYMMONOM_(2)",c) 1499 1500 #define INSERT_ELMSYMMONOM_(m,c)\ 1501 if (S_O_K(c) == HASHTABLE)\ 1502 INSERT_HASHTABLE(m,c,add_koeff,eq_monomsymfunc,hash_monompartition);\ 1503 else if (S_O_K(c) == ELMSYM)\ 1504 INSERT_LIST(m,c,add_koeff,comp_monomelmsym);\ 1505 else if (S_O_K(c) == BINTREE)\ 1506 INSERT_BINTREE(m,c,add_koeff,comp_monomelmsym);\ 1507 else\ 1508 WTO("INSERT_ELMSYMMONOM_(2)",c) 1509 1510 #define INSERT_HOMSYMMONOM_(m,c)\ 1511 if (S_O_K(c) == HASHTABLE)\ 1512 INSERT_HASHTABLE(m,c,add_koeff,eq_monomsymfunc,hash_monompartition);\ 1513 else if (S_O_K(c) == HOMSYM)\ 1514 INSERT_LIST(m,c,add_koeff,comp_monomhomsym);\ 1515 else if (S_O_K(c) == BINTREE)\ 1516 INSERT_BINTREE(m,c,add_koeff,comp_monomhomsym);\ 1517 else\ 1518 WTO("INSERT_HOMSYMMONOM_(2)",c) 1519 1520 1521 1522 1523 1524 #define INTLOGPOS5_4(ai) (( ai >= 10000L) ? 5 : 4) 1525 #define INTLOGPOS5_3(ai) (( ai >= 1000L) ? INTLOGPOS5_4(ai) : 3) 1526 #define INTLOGPOS2_1(ai) (( ai >= 10L) ? 2 : 1) 1527 #define INTLOGPOS5_1(ai) (( ai >= 100L) ? INTLOGPOS5_3(ai) : INTLOGPOS2_1(ai)) 1528 #define INTLOGPOS7_6(ai) (( ai >= 1000000L) ? 7 : 6) 1529 #define INTLOGPOS10_9(ai) (( ai >= 1000000000L)? 10 : 9) 1530 #define INTLOGPOS10_8(ai) (( ai >= 100000000L) ? INTLOGPOS10_9(ai) : 8) 1531 #define INTLOGPOS10_6(ai) (( ai >= 10000000L ) ? INTLOGPOS10_8(ai) : INTLOGPOS7_6(ai) ) 1532 #define INTLOGPOS(ai) (( ai >= 100000L ) ? INTLOGPOS10_6(ai) : INTLOGPOS5_1(ai) ) 1533 #define INTLOG(a) ( (S_I_I(a)) >= 0 ? INTLOGPOS(S_I_I(a)) : INTLOGPOS(-S_I_I(a)) ) 1534 1535 1536 #define INVERS_INTEGER(a,b) do {\ 1537 if (S_I_I(a)==1) M_I_I(1,b); else \ 1538 if (S_I_I(a)==-1) M_I_I(-1,b); else \ 1539 { b_ou_b(CALLOCOBJECT(),CALLOCOBJECT(),b); \ 1540 M_I_I(1,S_B_O(b)); \ 1541 M_I_I(S_I_I(a),S_B_U(b)); \ 1542 C_B_I(b,GEKUERZT); \ 1543 }\ 1544 } while(0) 1545 1546 #define INVERS_LONGINT(a,b) \ 1547 do { b_ou_b(CALLOCOBJECT(),CALLOCOBJECT(),b); M_I_I(1,S_B_O(b)); \ 1548 copy_longint(a,S_B_U(b)); C_B_I(b,GEKUERZT) ; } while(0) 1549 1550 #define INVERS_BRUCH(a,b) \ 1551 do { b_ou_b(CALLOCOBJECT(),CALLOCOBJECT(),b); COPY(S_B_O(a),S_B_U(b)); \ 1552 COPY(S_B_U(a), S_B_O(b)); C_B_I(b,S_B_I(a)) ;} while(0) 1553 1554 #define INVERS(a,b) \ 1555 if (S_O_K(a) == INTEGER) INVERS_INTEGER(a,b);\ 1556 else if (S_O_K(a) == LONGINT) INVERS_LONGINT(a,b);\ 1557 else if (S_O_K(a) == BRUCH) INVERS_BRUCH(a,b);\ 1558 else\ 1559 erg += invers(a,b) 1560 1561 #define KUERZEN(a)\ 1562 if (S_O_K(S_B_O(a)) == INTEGER) {\ 1563 if (S_O_K(S_B_U(b)) == INTEGER) erg += kuerzen_integer_integer(a);\ 1564 else if (S_O_K(S_B_U(b)) == LONGINT) erg += kuerzen_integer_longint(a);\ 1565 else erg += krz(a);\ 1566 }\ 1567 else if (S_O_K(S_B_O(a)) == LONGINT) {\ 1568 if (S_O_K(S_B_U(b)) == INTEGER) erg += kuerzen_longint_integer(a);\ 1569 else if (S_O_K(S_B_U(b)) == LONGINT) erg += kuerzen_longint_longint(a);\ 1570 else erg += krz(a);\ 1571 }\ 1572 else krz(a) 1573 1574 1575 #define MOD_APPLY_INTEGER(a,b) \ 1576 if (S_O_K(b) == INTEGER) M_I_I(S_I_I(a) % S_I_I(b), a);\ 1577 else if (S_O_K(b) == LONGINT) erg += mod_apply_integer_longint(a,b);\ 1578 else mod_apply(a,b) 1579 1580 #define MOD_APPLY(a,b) \ 1581 if (S_O_K(a) == INTEGER) MOD_APPLY_INTEGER(a,b);\ 1582 else if (S_O_K(a) == LONGINT) erg += mod_apply_longint(a,b);\ 1583 else erg += mod_apply(a,b) 1584 1585 1586 #define MULT_APPLY_INTEGER_INTEGER(a,b) \ 1587 if ( NULLP_INTEGER(a) || NULLP_INTEGER(b) ) \ 1588 { \ 1589 M_I_I(0,b); \ 1590 } \ 1591 else if ( (INTLOG(a) + INTLOG(b)) > 9L )\ 1592 {\ 1593 erg += t_int_longint(b,b);\ 1594 erg += mult_apply_integer_longint(a,b);\ 1595 }\ 1596 else M_I_I(S_I_I(a)*S_I_I(b),b) 1597 1598 #define MULT_APPLY_INTEGER(a,b) \ 1599 if (S_O_K(b) == INTEGER) MULT_APPLY_INTEGER_INTEGER(a,b);\ 1600 else if (S_O_K(b) == LONGINT) erg += mult_apply_integer_longint(a,b);\ 1601 else if (S_O_K(b) == BRUCH) erg += mult_apply_integer_bruch(a,b);\ 1602 else if (S_O_K(b) == MONOM) erg += mult_apply_integer_monom(a,b);\ 1603 else if (POLYP(b)) erg += mult_apply_integer_polynom(a,b);\ 1604 else if (S_O_K(b) == HASHTABLE) erg += mult_apply_integer_hashtable(a,b);\ 1605 else erg += mult_apply_integer(a,b) 1606 1607 #define MULT_APPLY_LONGINT(a,b)\ 1608 if (S_O_K(b) == INTEGER) erg += mult_apply_longint_integer(a,b);\ 1609 else if (S_O_K(b) == LONGINT) erg += mult_apply_longint_longint(a,b);\ 1610 else if (S_O_K(b) == BRUCH) erg += mult_apply_longint_bruch(a,b);\ 1611 else if (POLYP(b)) erg += mult_apply_longint_polynom(a,b);\ 1612 else erg += mult_apply_longint(a,b) 1613 1614 #define MULT_APPLY_BRUCH(a,b)\ 1615 if (S_O_K(b) == INTEGER) erg += mult_apply_bruch_integer(a,b);\ 1616 else if (S_O_K(b) == LONGINT) erg += mult_apply_bruch_longint(a,b);\ 1617 else if (S_O_K(b) == BRUCH) erg += mult_apply_bruch_bruch(a,b);\ 1618 else if (POLYP(b)) erg += mult_apply_bruch_polynom(a,b);\ 1619 else if (S_O_K(b) == HASHTABLE) erg += mult_apply_bruch_hashtable(a,b);\ 1620 else erg += mult_apply_bruch(a,b) 1621 1622 #define MULT_APPLY(a,b) \ 1623 if (S_O_K(a) == INTEGER) MULT_APPLY_INTEGER(a,b);\ 1624 else if (S_O_K(a) == LONGINT) MULT_APPLY_LONGINT(a,b);\ 1625 else if (S_O_K(a) == BRUCH) MULT_APPLY_BRUCH(a,b);\ 1626 else if (S_O_K(a) == POLYNOM) erg += mult_apply_polynom(a,b);\ 1627 else if (S_O_K(a) == FF) erg += mult_apply_ff(a,b);\ 1628 else\ 1629 erg += mult_apply(a,b) 1630 1631 #define MULT_INTEGER_INTEGER(a,b,c) \ 1632 if (INTLOG(a) + INTLOG(b) > 9) {\ 1633 OP mii_c= CALLOCOBJECT();\ 1634 erg += t_int_longint(a,mii_c);\ 1635 erg += mult_longint_integer(mii_c,b,c);\ 1636 FREEALL(mii_c);\ 1637 }\ 1638 else\ 1639 M_I_I(S_I_I(a)*S_I_I(b),c) 1640 1641 #define MULT_INTEGER(a,b,c) \ 1642 if (S_O_K(b) == INTEGER) MULT_INTEGER_INTEGER(a,b,c);\ 1643 else if (S_O_K(b) == LONGINT) erg += mult_longint_integer(b,a,c);\ 1644 else if (S_O_K(b) == BRUCH) erg += mult_bruch_integer(b,a,c);\ 1645 else if (S_O_K(b) == CYCLOTOMIC) erg += mult_scalar_cyclo(a,b,c);\ 1646 else erg += mult_integer(a,b,c) 1647 1648 #define MULT_LONGINT(a,b,c) \ 1649 if (S_O_K(b) == INTEGER) erg += mult_longint_integer(a,b,c);\ 1650 else if (S_O_K(b) == LONGINT) erg += mult_longint_longint(b,a,c);\ 1651 else if (S_O_K(b) == CYCLOTOMIC) erg += mult_scalar_cyclo(a,b,c);\ 1652 else erg += mult_longint(a,b,c) 1653 1654 #define MULT_BRUCH(a,b,c) \ 1655 if (S_O_K(b) == INTEGER) erg += mult_bruch_integer(a,b,c);\ 1656 else if (S_O_K(b) == LONGINT) erg += mult_bruch_longint(a,b,c);\ 1657 else if (S_O_K(b) == BRUCH) erg += mult_bruch_bruch(a,b,c);\ 1658 else if (S_O_K(b) == CYCLOTOMIC) erg += mult_scalar_cyclo(a,b,c);\ 1659 else erg += mult_bruch(a,b,c) 1660 1661 #define MULT(a,b,c) \ 1662 if (S_O_K(a) == INTEGER) MULT_INTEGER(a,b,c); \ 1663 else if (S_O_K(a) == LONGINT) MULT_LONGINT(a,b,c); \ 1664 else if (S_O_K(a) == BRUCH) MULT_BRUCH(a,b,c);\ 1665 else if (S_O_K(a) == CYCLOTOMIC) mult_cyclo(a,b,c);\ 1666 else if (S_O_K(a) == FF) mult_ff(a,b,c);\ 1667 else if (S_O_K(a) == SQ_RADICAL) mult_sqrad(a,b,c);\ 1668 else\ 1669 erg += mult(a,b,c) 1670 1671 #define MULT_SCALAR_MONOMLIST(a,b,c)\ 1672 if ((NULLP(a))|| (NULLP(b))) erg += init(S_O_K(b),c);\ 1673 else erg += trans2formlist(a,b,c,mult) 1674 1675 #define CLEVER_MULT_INTEGER(a,b,c)\ 1676 do {\ 1677 FREESELF(c); MULT_INTEGER(a,b,c);\ 1678 } while(0) 1679 1680 #define CLEVER_MULT_LONGINT(a,b,c)\ 1681 do {\ 1682 FREESELF(c); MULT_LONGINT(a,b,c);\ 1683 } while(0) 1684 1685 #define CLEVER_MULT_BRUCH(a,b,c)\ 1686 if (S_O_K(b) == BRUCH) {\ 1687 switch (S_O_K(c)) {\ 1688 case INTEGER: C_O_K(c,EMPTY);\ 1689 case EMPTY:\ 1690 case BRUCH: erg += mult_bruch_bruch(a,b,c); break;\ 1691 default: FREESELF(c); mult_bruch_bruch(a,b,c); break;\ 1692 }\ 1693 }\ 1694 else do { FREESELF(c); MULT_BRUCH(a,b,c); } while(0) 1695 1696 #define CLEVER_MULT_FF(a,b,c)\ 1697 if (S_O_K(b) == FF) {\ 1698 switch (S_O_K(c)) {\ 1699 case INTEGER: C_O_K(c,EMPTY);\ 1700 case EMPTY:\ 1701 case BRUCH: erg += mult_ff_ff(a,b,c); break;\ 1702 default: FREESELF(c); mult_ff_ff(a,b,c); break;\ 1703 }\ 1704 }\ 1705 else do { FREESELF(c); erg += mult_ff(a,b,c); } while(0) 1706 1707 #define CLEVER_MULT(a,b,c) \ 1708 if (S_O_K(a) == INTEGER) CLEVER_MULT_INTEGER(a,b,c); \ 1709 else if (S_O_K(a) == LONGINT) CLEVER_MULT_LONGINT(a,b,c); \ 1710 else if (S_O_K(a) == BRUCH) CLEVER_MULT_BRUCH(a,b,c);\ 1711 else if (S_O_K(a) == FF) CLEVER_MULT_FF(a,b,c);\ 1712 else\ 1713 do { FREESELF(c); MULT(a,b,c); } while(0) 1714 1715 1716 #define NEGEINSP_LONGINT(a)\ 1717 (\ 1718 ((S_O_S(a).ob_longint) ->floc ->w0 == 1) \ 1719 &&\ 1720 ((S_O_S(a).ob_longint) ->floc ->w1 == 0)\ 1721 &&\ 1722 ((S_O_S(a).ob_longint) ->floc ->w2 == 0)\ 1723 &&\ 1724 ((S_O_S(a).ob_longint) ->signum == -1)\ 1725 &&\ 1726 ((S_O_S(a).ob_longint) ->laenge == 1)\ 1727 ) 1728 1729 #define NEGEINSP(a)\ 1730 ( S_O_K(a) == INTEGER ? NEGEINSP_INTEGER(a): \ 1731 ( S_O_K(a) == LONGINT ? NEGEINSP_LONGINT(a) : \ 1732 ( negeinsp(a) ) \ 1733 ) \ 1734 ) 1735 1736 #define NEGP_LONGINT(a) (GANZSIGNUM(S_O_S(a).ob_longint) == (signed char)-1) 1737 1738 #define NEGP(a) \ 1739 ( S_O_K(a) == INTEGER ? (NEGP_INTEGER(a)) : \ 1740 ( S_O_K(a) == LONGINT ? NEGP_LONGINT(a) : negp(a) )\ 1741 ) 1742 1743 #define NEW_HASHTABLE(c)\ 1744 do { c = CALLOCOBJECT(); erg += init_hashtable(c); } while(0) 1745 1746 #define CLEAR_HASHTABLE(c) /* removes all entries in a hashtable */ \ 1747 do { OP z,zz;INT i,j;\ 1748 for (i=0,z=S_V_S(c);i<S_V_LI(c);i++,z++)\ 1749 { \ 1750 if (not EMPTYP(z)) {\ 1751 for (j=0,zz=S_V_S(z);j<S_V_LI(z);j++,zz++) FREESELF(zz);\ 1752 /*FREESELF_INTEGERVECTOR(z);*/ C_I_I(S_V_L(z),1);\ 1753 }\ 1754 /* C_I_I(z,-1);*/ \ 1755 else if (S_I_I(z) == -1) break;\ 1756 else { i = S_I_I(z)-1; z = S_V_I(c,i); }\ 1757 }\ 1758 M_I_I(0,S_V_I(c,S_V_LI(c)));} while(0) 1759 1760 1761 1762 #define NEW_INTEGER(m,i) do { m=CALLOCOBJECT(); M_I_I(i,m); } while(0) 1763 #define NEW_TABLEAU(t,um) do { t=CALLOCOBJECT(); m_u_t(a,t); } while(0) 1764 #define NEW_VECTOR(v,i)\ 1765 do { v = CALLOCOBJECT(); erg += m_il_v(i,v); } while(0) 1766 #define NEW_INTEGERVECTOR(v,i)\ 1767 do { v = CALLOCOBJECT(); erg += m_il_integervector(i,v); } while(0) 1768 #define NEW_HOMSYM(a)\ 1769 do { a = CALLOCOBJECT(); erg += b_sn_l(NULL,NULL,a); \ 1770 C_O_K(a,HOMSYM); } while(0) 1771 1772 1773 #define NULLP_LONGINT(a) (GANZSIGNUM(S_O_S(a).ob_longint) == (signed char) 0) 1774 #define NULLP_HASHTABLE(a) (S_V_II(a,S_V_LI(a)) == 0) 1775 #define NULLP_BRUCH(a) \ 1776 (S_O_K(S_B_O(a)) == INTEGER ? NULLP_INTEGER(S_B_O(a)) : \ 1777 ( S_O_K(S_B_O(a)) == LONGINT ? NULLP_LONGINT(S_B_O(a)) : nullp(S_B_O(a))\ 1778 )\ 1779 ) 1780 1781 1782 #define NULLP(a)\ 1783 ( S_O_K(a) == INTEGER ? NULLP_INTEGER(a) : \ 1784 ( S_O_K(a) == LONGINT ? NULLP_LONGINT(a) : \ 1785 ( S_O_K(a) == HASHTABLE ? NULLP_HASHTABLE(a) : \ 1786 ( S_O_K(a) == BRUCH ? nullp_bruch(a) : \ 1787 ( S_O_K(a) == FF ? nullp_ff(a): \ 1788 ( POLYP(a) ? nullp_polynom(a): nullp(a) ) \ 1789 )\ 1790 ) \ 1791 )\ 1792 ) \ 1793 ) 1794 1795 #define ODD_INTEGER(a) (S_I_I(a) % 2 == 1) 1796 #define ODD_LONGINT(a) \ 1797 ((S_O_S(a).ob_longint) ->floc ->w0 % 2 == 1) 1798 1799 #define ODD(a) \ 1800 ( S_O_K(a) == INTEGER ? (ODD_INTEGER(a)) : \ 1801 ( S_O_K(a) == LONGINT ? ODD_LONGINT(a) : odd(a) )\ 1802 ) 1803 1804 #define PARTITION_WEIGHT(a,i) \ 1805 do { \ 1806 OP z; \ 1807 INT j; \ 1808 for(j=S_PA_LI(a),i=0,z=S_V_S(S_PA_S(a));j>0;j--,z++) \ 1809 i+=S_I_I(z); \ 1810 } while(0) 1811 1812 #define MAXPARTI(a) ((S_PA_LI(a) == 0) ? 0 : S_PA_II(a,S_PA_LI(a)-1) ) 1813 1814 #define POSP_LONGINT(a) (GANZSIGNUM(S_O_S(a).ob_longint) == (signed char)1) 1815 1816 #define POSP(a) \ 1817 ( S_O_K(a) == INTEGER ? (POSP_INTEGER(a)) : \ 1818 ( S_O_K(a) == LONGINT ? POSP_LONGINT(a) : posp(a) )\ 1819 ) 1820 1821 #define SWAP(a,b) do { \ 1822 struct object swap_object; \ 1823 swap_object = *a; \ 1824 *a = *b; \ 1825 *b = swap_object; \ 1826 } while(0) 1827 1828 #define CE2(a,b,f) \ 1829 if (a==b) {\ 1830 OP checkequal2_c = CALLOCOBJECT();\ 1831 *checkequal2_c = *b;\ 1832 C_O_K(b,EMPTY);\ 1833 erg += (*f)(checkequal2_c,b);\ 1834 FREEALL(checkequal2_c);\ 1835 goto endr_ende;\ 1836 }\ 1837 else FREESELF(b) 1838 /* used for transfunctions */ 1839 #define TCE2(a,b,f,typ) \ 1840 if (a==b) {\ 1841 OP checkequal2_c = CALLOCOBJECT();\ 1842 *checkequal2_c = *b;\ 1843 C_O_K(b,EMPTY);\ 1844 erg += (*f)(checkequal2_c,b);\ 1845 FREEALL(checkequal2_c);\ 1846 goto endr_ende;\ 1847 }\ 1848 else if ( (S_O_K(b) != HASHTABLE) && (S_O_K(b) != typ) ) \ 1849 FREESELF(b) 1850 1851 #define ADD_KOEFF(a,b) \ 1852 ADD_APPLY(S_MO_K(a), S_MO_K(b));\ 1853 if (NULLP(S_MO_K(b)))\ 1854 FREESELF_MONOM(b) 1855 1856 1857 1858 #define M_FORALL_MONOMIALS_IN_AB(a,b,c,f,partf)\ 1859 {\ 1860 OP ff,z,y;\ 1861 ff = CALLOCOBJECT();\ 1862 FORALL (y,a, {\ 1863 FORALL (z,b, {\ 1864 FREESELF(ff);\ 1865 MULT(S_MO_K(z),S_MO_K(y),ff);\ 1866 if (not EINSP(f))\ 1867 {\ 1868 MULT_APPLY(f,ff);\ 1869 }\ 1870 erg += (*partf)(S_MO_S(y),S_MO_S(z),c,ff);\ 1871 } );\ 1872 } );\ 1873 FREEALL(ff);\ 1874 } 1875 1876 #define M2_FORALL_MONOMIALS_IN_AB(a,b,c,f,m,partf)\ 1877 {\ 1878 OP ff,z,y;\ 1879 ff = CALLOCOBJECT();\ 1880 FORALL (y,a, {\ 1881 FORALL (z,b, {\ 1882 FREESELF(ff);\ 1883 MULT(S_MO_K(z),S_MO_K(y),ff);\ 1884 if (not EINSP(f))\ 1885 {\ 1886 MULT_APPLY(f,ff);\ 1887 }\ 1888 erg += (*partf)(S_MO_S(y),S_MO_S(z),c,ff,m);\ 1889 } );\ 1890 } );\ 1891 FREEALL(ff);\ 1892 } 1893 1894 #define M3_FORALL_MONOMIALS_IN_AB(a,b,c,f,m,l,partf)\ 1895 {\ 1896 OP ff,z,y;\ 1897 ff = CALLOCOBJECT();\ 1898 FORALL (y,a, {\ 1899 FORALL (z,b, {\ 1900 FREESELF(ff);\ 1901 MULT(S_MO_K(z),S_MO_K(y),ff);\ 1902 if (not EINSP(f))\ 1903 {\ 1904 MULT_APPLY(f,ff);\ 1905 }\ 1906 erg += (*partf)(S_MO_S(y),S_MO_S(z),c,ff,m,l);\ 1907 } );\ 1908 } );\ 1909 FREEALL(ff);\ 1910 } 1911 1912 1913 1914 #define M_FORALL_MONOMIALS_IN_B(a,b,c,f,partf)\ 1915 {\ 1916 OP ff,z;\ 1917 if (not EINSP(f)) {\ 1918 ff = CALLOCOBJECT();\ 1919 FORALL (z,b, {\ 1920 FREESELF(ff);\ 1921 MULT(S_MO_K(z),f,ff);\ 1922 erg += (*partf)(a,S_MO_S(z),c,ff);\ 1923 } );\ 1924 FREEALL(ff);\ 1925 }\ 1926 else {\ 1927 FORALL (z,b, {\ 1928 erg += (*partf)(a,S_MO_S(z),c,S_MO_K(z));\ 1929 } );\ 1930 }\ 1931 } 1932 #define M2_FORALL_MONOMIALS_IN_B(a,b,c,f,m,partf)\ 1933 {\ 1934 OP ff,z;\ 1935 if (not EINSP(f)) {\ 1936 ff = CALLOCOBJECT();\ 1937 FORALL (z,b, {\ 1938 MULT(S_MO_K(z),f,ff);\ 1939 erg += (*partf)(a,S_MO_S(z),c,ff,m);\ 1940 FREESELF(ff);\ 1941 } );\ 1942 FREEALL(ff);\ 1943 }\ 1944 else {\ 1945 FORALL (z,b, {\ 1946 erg += (*partf)(a,S_MO_S(z),c,S_MO_K(z),m);\ 1947 } );\ 1948 }\ 1949 } 1950 1951 #define M3_FORALL_MONOMIALS_IN_B(a,b,c,f,m,l,partf)\ 1952 {\ 1953 OP ff,z;\ 1954 if (not EINSP(f)) {\ 1955 ff = CALLOCOBJECT();\ 1956 FORALL (z,b, {\ 1957 MULT(S_MO_K(z),f,ff);\ 1958 erg += (*partf)(a,S_MO_S(z),c,ff,m,l);\ 1959 FREESELF(ff);\ 1960 } );\ 1961 FREEALL(ff);\ 1962 }\ 1963 else {\ 1964 FORALL (z,b, {\ 1965 erg += (*partf)(a,S_MO_S(z),c,S_MO_K(z),m,l);\ 1966 } );\ 1967 }\ 1968 } 1969 1970 1971 1972 #define M_FORALL_MONOMIALS_IN_A(a,b,c,f,partf)\ 1973 {\ 1974 OP ff,z;\ 1975 if (not EINSP(f)) {\ 1976 ff = CALLOCOBJECT();\ 1977 FORALL (z,a, {\ 1978 MULT(S_MO_K(z),f,ff);\ 1979 erg += (*partf)(S_MO_S(z),b,c,ff);\ 1980 FREESELF(ff);\ 1981 } );\ 1982 FREEALL(ff);\ 1983 }\ 1984 else {\ 1985 FORALL (z,a, {\ 1986 erg += (*partf)(S_MO_S(z),b,c,S_MO_K(z));\ 1987 } );\ 1988 }\ 1989 } 1990 #define M2_FORALL_MONOMIALS_IN_A(a,b,c,f,m,partf)\ 1991 {\ 1992 OP ff,z;\ 1993 if (not EINSP(f)) {\ 1994 ff = CALLOCOBJECT();\ 1995 FORALL (z,a, {\ 1996 MULT(S_MO_K(z),f,ff);\ 1997 erg += (*partf)(S_MO_S(z),b,c,ff,m);\ 1998 FREESELF(ff);\ 1999 } );\ 2000 FREEALL(ff);\ 2001 }\ 2002 else {\ 2003 FORALL (z,a, {\ 2004 erg += (*partf)(S_MO_S(z),b,c,S_MO_K(z),m);\ 2005 } );\ 2006 }\ 2007 } 2008 2009 #define M3_FORALL_MONOMIALS_IN_A(a,b,c,f,m,l,partf)\ 2010 {\ 2011 OP ff,z;\ 2012 if (not EINSP(f)) {\ 2013 ff = CALLOCOBJECT();\ 2014 FORALL (z,a, {\ 2015 MULT(S_MO_K(z),f,ff);\ 2016 erg += (*partf)(S_MO_S(z),b,c,ff,m,l);\ 2017 FREESELF(ff);\ 2018 } );\ 2019 FREEALL(ff);\ 2020 }\ 2021 else {\ 2022 FORALL (z,a, {\ 2023 erg += (*partf)(S_MO_S(z),b,c,S_MO_K(z),m,l);\ 2024 } );\ 2025 }\ 2026 } 2027 2028 2029 2030 #define T_FORALL_MONOMIALS_IN_A(a,b,f,partf)\ 2031 {\ 2032 OP ff,z;\ 2033 if (not EINSP(f)) {\ 2034 ff = CALLOCOBJECT();\ 2035 FORALL (z,a, {\ 2036 MULT(S_MO_K(z),f,ff);\ 2037 erg += (*partf)(S_MO_S(z),b,ff);\ 2038 FREESELF(ff);\ 2039 } );\ 2040 FREEALL(ff);\ 2041 }\ 2042 else {\ 2043 FORALL (z,a, {\ 2044 erg += (*partf)(S_MO_S(z),b,S_MO_K(z));\ 2045 } );\ 2046 }\ 2047 } 2048 2049 #define _NULL_PARTITION_(b,c,f) \ 2050 do { OP m;\ 2051 CTO(PARTITION,"_NULL_PARTITION_(1)",b);\ 2052 m=CALLOCOBJECT(); \ 2053 erg += b_sk_mo(CALLOCOBJECT(),CALLOCOBJECT(),m);\ 2054 erg += copy_partition(b,S_MO_S(m));\ 2055 COPY(f,S_MO_K(m));\ 2056 if (S_O_K(c)==HASHTABLE)\ 2057 insert_scalar_hashtable(m,c,add_koeff,eq_monomsymfunc,hash_monompartition);\ 2058 else \ 2059 INSERT_LIST(m,c,add_koeff,comp_monommonomial);\ 2060 } while(0) 2061 2062 #define WEIGHT_HASHTABLE(a) S_V_II(a,S_V_LI(a)) 2063 2064 2065 2066 #define NEQ(a,b) (! EQ(a,b)) 2067 #define GR(a,b) (COMP(a,b) > (INT)0) 2068 #define GT(a,b) (COMP(a,b) > (INT)0) 2069 #define GE(a,b) (COMP(a,b) >= (INT)0) 2070 #define LE(a,b) (COMP(a,b) <= (INT)0) 2071 #define LT(a,b) (COMP(a,b) < (INT)0) 2072 2073 2074 /* speicher managment */ 2075 2076 #define FREE_MEMMANAGER(t,s,i,g,c,v)\ 2077 do {\ 2078 c--;\ 2079 if ((i+1) == g) {\ 2080 if (g+SPEICHERSIZE <freeall_speichersize_max)\ 2081 {\ 2082 if (g == 0) {\ 2083 s = (t*) SYM_MALLOC(SPEICHERSIZE * sizeof(t));\ 2084 SYMCHECK(s == NULL,"no memory");\ 2085 g = SPEICHERSIZE;\ 2086 }\ 2087 else {\ 2088 s = (t*) SYM_realloc (s, (g+SPEICHERSIZE) * sizeof(t));\ 2089 SYMCHECK(s == NULL,"no memory");\ 2090 g += SPEICHERSIZE;\ 2091 }\ 2092 s[++i] = (v);\ 2093 }\ 2094 else SYM_FREE(v);\ 2095 }\ 2096 else s[++i] = (v);\ 2097 } while(0) 2098 2099 #define CALLOC_MEMMANAGER(t,s,i,c,v)\ 2100 do {\ 2101 c++;\ 2102 if (i>=0) v = s[i--];\ 2103 else v = (t*) SYM_MALLOC(sizeof(t));\ 2104 } while(0) 2105 2106 #define ANFANG_MEMMANAGER(s,i,g,c) \ 2107 s = NULL; i = -1; c = 0; g = 0 2108 2109 #define ENDE_MEMMANAGER(s,i,g,c,text) \ 2110 if (no_banner != TRUE) { SYMCHECK(c, text);} \ 2111 if (s != NULL) { \ 2112 INT jj;\ 2113 for (jj = 0; jj<=i;jj++) SYM_FREE(s[jj]);\ 2114 SYM_FREE(s);\ 2115 s = NULL;\ 2116 }\ 2117 i = -1;\ 2118 g = 0 2119 2120 2121 #define MACRO_H 2122 #endif /* MACRO_H */ 2123