1 #include "def.h"
2 #include "macro.h"
3 INT t_splitpart();
4 
tpm_integer__faktor(a,b,f)5 INT tpm_integer__faktor(a,b,f) OP a,b,f;
6 {
7     INT erg = OK;
8     OP m;
9     CTO(INTEGER,"tpm_integer__faktor(1)",a);
10     CTTO(HASHTABLE,MONOMIAL,"tpm_integer__faktor(2)",b);
11     SYMCHECK( (S_I_I(a) < 0), "tpm_integer__faktor:integer < 0");
12 
13     m = CALLOCOBJECT();
14     erg += b_sk_mo(CALLOCOBJECT(),CALLOCOBJECT(), m);
15     erg += first_partition(a,S_MO_S(m));
16     COPY(f,S_MO_K(m));
17 
18     if (S_O_K(b) == MONOMIAL)
19         INSERT_LIST(m,b,add_koeff,comp_monommonomial);
20     else
21         insert_scalar_hashtable(m,b,add_koeff,eq_monomsymfunc,hash_monompartition);
22 
23     ENDR("tpm_integer__faktor");
24 }
25 
26 INT mmm_hashtable_hashtable_();
tpm_partition__faktor(a,b,f)27 INT tpm_partition__faktor(a,b,f) OP a,b,f;
28 {
29     INT erg = OK;
30     CTO(PARTITION,"tpm_partition__faktor(1)",a);
31     CTTO(HASHTABLE,MONOMIAL,"tpm_partition__faktor(2)",b);
32     if (S_PA_LI(a) == 0) {
33         erg += tpm_integer__faktor(cons_null,b,f);
34         }
35     else if (S_PA_LI(a) == 1) {
36         erg += tpm_integer__faktor(S_PA_I(a,0),b,f);
37         }
38     else {
39         erg += t_splitpart(a,b,f,tpm_partition__faktor,mmm_hashtable_hashtable_);
40         }
41     ENDR("tpm_partition__faktor");
42 }
43 
tpm_powsym__faktor(a,b,f)44 INT tpm_powsym__faktor(a,b,f) OP a,b,f;
45 {
46     INT erg = OK;
47     CTTO(HASHTABLE,POWSYM,"tpm_powsym__faktor(1)",a);
48     CTTO(HASHTABLE,MONOMIAL,"tpm_powsym__faktor(2)",b);
49 
50     T_FORALL_MONOMIALS_IN_A(a,b,f,tpm_partition__faktor);
51 
52     ENDR("tpm_powsym__faktor");
53 }
54 
55 
tpm_hashtable__faktor(a,b,f)56 INT tpm_hashtable__faktor(a,b,f) OP a,b,f;
57 {
58     INT erg = OK;
59     CTO(HASHTABLE,"tpm_hashtable__faktor(1)",a);
60     CTTO(HASHTABLE,MONOMIAL,"tpm_hashtable__faktor(2)",b);
61     T_FORALL_MONOMIALS_IN_A(a,b,f,tpm_partition__faktor);
62     ENDR("tpm_hashtable__faktor");
63 }
64 
65 
tpm___faktor(a,b,f)66 INT tpm___faktor(a,b,f) OP a,b,f;
67 {
68     INT erg = OK;
69     CTTTTO(INTEGER,HASHTABLE,POWSYM,PARTITION,"tpm___faktor(1)",a);
70     CTTO(HASHTABLE,MONOMIAL,"tpm___faktor(2)",b);
71 
72     if (S_O_K(a) == INTEGER) {
73         erg += tpm_integer__faktor(a,b,f);
74         goto eee;
75         }
76     else if (S_O_K(a) == PARTITION) {
77         erg += tpm_partition__faktor(a,b,f);
78         goto eee;
79         }
80     else if (S_O_K(a) == POWSYM) {
81         erg += tpm_powsym__faktor(a,b,f);
82         goto eee;
83         }
84     else /* HASHTABLE */ {
85         erg += tpm_hashtable__faktor(a,b,f);
86         goto eee;
87         }
88 eee:
89     ENDR("tpm___faktor");
90 }
91 
t_POWSYM_MONOMIAL(a,b)92 INT t_POWSYM_MONOMIAL(a,b) OP a,b;
93 {
94     INT erg = OK;
95     INT t=0;
96     CTTTTO(HASHTABLE,INTEGER,PARTITION,POWSYM,"t_POWSYM_MONOMIAL",a);
97     TCE2(a,b,t_POWSYM_MONOMIAL,MONOMIAL);
98 
99     if (S_O_K(b) == EMPTY)
100         {
101         erg += init_hashtable(b);
102         t=1;
103         }
104     tpm___faktor(a,b,cons_eins);
105     if (t==1) t_HASHTABLE_MONOMIAL(b,b);
106 
107 
108     ENDR("t_POWSYM_MONOMIAL");
109 }
110