27#define HAVE_MAP_OPTIMIZE 0
35 int n_max_map_monomials, ring map_r,
38 int n = si_min(pi_r->N, n_max_map_monomials);
40 unsigned long e_i, e_j;
42 poly map_j = p_Init(map_r);
44 for (
i=1;
i <= n;
i++)
46 e_i = p_GetExp(pi_m,
i, pi_r);
48 m_i = max_map_monomials[
i-1];
49 if (m_i !=
NULL && ! p_IsConstantComp(m_i, map_r))
51 for (
j = 1;
j<= map_r->N;
j++)
53 e_j = p_GetExp(m_i,
j, map_r);
55 p_AddExp(map_j,
j, e_j*e_i, map_r);
63static unsigned long maGetMaxExp(ideal pi_id, ring pi_r, ideal map_id, ring map_r)
66 poly* max_map_monomials = (poly*)
omAlloc(
IDELEMS(map_id)*
sizeof(poly));
67 poly max_pi_i, max_map_i;
80 unsigned long temp = p_GetMaxExp(max_map_i, map_r);
81 if (temp >
max){
max=temp; }
83 p_LmFree(max_pi_i, pi_r);
84 p_LmFree(max_map_i, map_r);
88 p_LmFree(&max_map_monomials[
i], map_r);
103 p_wrp(monomial->src, src_r);
104 printf(
" ref:%d", monomial->ref);
108 p_wrp(monomial->dest, dest_r);
110 if (monomial->f1!=
NULL) { printf(
" f1:%lx", (
long)monomial->f1->src);
113 if (monomial->f2!=
NULL) { printf(
" f2:%lx",(
long)monomial->f2->src);
122 while (mpoly !=
NULL)
147 mp->coeff->bucket = bucket;
148 mp->coeff->n = pGetCoeff(
p);
158 p_LmFree(mp->src, src_r);
159 if (mp->coeff !=
NULL)
171 if (mp->dest !=
NULL)
174 p_Delete(&(mp->dest), dest_r);
220 iter->ref += what->ref;
224 while (coeff->next !=
NULL) coeff = coeff->next;
225 coeff->next =
iter->coeff;
226 iter->coeff = what->coeff;
264 for (
i=0;
i<mideal->n;
i++)
266 if (map_id->m[
i] !=
NULL)
282 ideal image_id, ring image_r,
283 ring &src_r, ring &dest_r,
BOOLEAN &simple)
286 int* weights = (
int*)
omAlloc0(map_r->N*
sizeof(
int));
288 int n = si_min(map_r->N,
IDELEMS(image_id));
292 weights[
i] = pLength(image_id->m[
i])+1;
300 unsigned long maxExp =
maGetMaxExp(map_id, map_r, image_id, image_r);
301 if (maxExp <= 1) maxExp = 2;
302 else if (maxExp > (
unsigned long) image_r->bitmask)
303 maxExp = (
unsigned long) image_r->bitmask;
314 if (image_r != dest_r)
328 for (
int i= 0;
i < m_id->n;
i++)
330 if (m_id->buckets[
i]!=
NULL)
367 if (dest_r != image_r)
382 Print(
"map[%ld:%d]{%d:", dest_r->bitmask, dest_r->ExpL_Size, length);
386#if HAVE_MAP_OPTIMIZE > 0
392 Print(
"%d}", length);
405 if (dest_r != image_r)
415 res_image_id = res_dest_id;
441 if (!zero_div) len=pLength(
p);
447 if (zero_div) len=pLength(t);
461 for(
i=1;
i<=src_r->N;
i++)
463 e=p_GetExp(src,
i,src_r);
478 p=p_Copy(
pp ,dest_r);
483 p=p_Mult_q(
p,p_Copy(
pp ,dest_r),dest_r);
500 if ((root!=
NULL) && (root->next!=
NULL))
516 int next_print_cost = total_cost;
531 if (
p->f1->ref>0) f1=p_Copy(f1,dest_r);
537 if (
p->f2->ref>0) f2=p_Copy(f2,dest_r);
545 p->dest=p_Mult_q(f1,f2,dest_r);
561 if (cost > next_print_cost)
564 next_print_cost += total_cost;
588static poly
maEggT(
const poly m1,
const poly m2, poly &q1, poly &q2,
const ring r)
593 poly ggt = p_Init(r);
597 for (
i=1;
i<=r->N;
i++)
599 unsigned long e1 = p_GetExp(m1,
i, r);
600 unsigned long e2 = p_GetExp(m2,
i, r);
601 if (e1 > 0 && e2 > 0)
603 unsigned long em = (e1 > e2 ? e2 : e1);
605 p_SetExp(ggt,
i, em, r);
606 p_SetExp(q1,
i, e1 - em, r);
607 p_SetExp(q2,
i, e2 - em, r);
611 p_SetExp(q1,
i, e1, r);
612 p_SetExp(q2,
i, e2, r);
658 if ((tmp_deg=
p_Deg(q,r)) > ggt_deg)
683 int dq =p_Totaldegree(fq_p,r);
void maMonomial_Destroy(mapoly mp, ring src_r, ring dest_r)
ideal fast_map_common_subexp(const ideal map_id, const ring map_r, const ideal image_id, const ring image_r)
void maMap_CreateRings(ideal map_id, ring map_r, ideal image_id, ring image_r, ring &src_r, ring &dest_r, BOOLEAN &simple)
static poly maGetMaxExpP(poly *max_map_monomials, int n_max_map_monomials, ring map_r, poly pi_m, ring pi_r)
STATIC_VAR omBin macoeffBin
static poly maEggT(const poly m1, const poly m2, poly &q1, poly &q2, const ring r)
void maMap_CreatePolyIdeal(ideal map_id, ring map_r, ring src_r, ring dest_r, mapoly &mp, maideal &mideal)
void maPoly_GetLength(mapoly mp, int &length)
mapoly maPoly_InsertMonomial(mapoly &into, mapoly what, ring src_r)
static void maPoly_InsertPoly(mapoly &into, poly what, ring src_r, sBucket_pt bucket)
mapoly maMonomial_Create(poly p, ring, sBucket_pt bucket)
ideal maIdeal_2_Ideal(maideal m_id, ring)
static poly maPoly_EvalMon(poly src, ring src_r, poly *dest_id, ring dest_r)
static int maPoly_Substitute(macoeff c, poly p, ring dest_r)
static mapoly maFindBestggT(mapoly mp, mapoly &choice, mapoly &fp, mapoly &fq, const ring r)
static unsigned long maGetMaxExp(ideal pi_id, ring pi_r, ideal map_id, ring map_r)
void maPoly_Eval(mapoly root, ring src_r, ideal dest_id, ring dest_r, int total_cost)
STATIC_VAR omBin mapolyBin
static void maMap_KillRings(ring map_r, ring image_r, ring src_r, ring dest_r)
void maPoly_Optimize(mapoly mpoly, ring src_r)
class macoeff_s * macoeff
void maMonomial_Out(mapoly monomial, ring src_r, ring dest_r=NULL)
class maideal_s * maideal
void maPoly_Out(mapoly mpoly, ring src_ring, ring dest_r=NULL)
mapoly maMonomial_Free(mapoly monomial, ring src_r, ring dest_r=NULL)
static bool Greater(mono_type m1, mono_type m2)
gmp_float max(const gmp_float &a, const gmp_float &b)
#define omFreeSize(addr, size)
#define omFreeBin(addr, bin)
#define omGetSpecBin(size)
poly p_GetMaxExpP(poly p, const ring r)
return monomial r such that GetExp(r,i) is maximum of all monomials in p; coeff == 0,...
poly p_ISet(long i, const ring r)
returns the poly representing the integer i
long p_Deg(poly a, const ring r)
#define __pp_Mult_nn(p, n, r)
#define p_LmCmpAction(p, q, r, actionE, actionG, actionS)
void p_wrp(poly p, ring lmRing, ring tailRing)
poly prShallowCopyR(poly p, ring r, ring dest_r)
ideal idrShallowCopyR(ideal id, ring src_r, ring dest_r)
poly prShallowCopyR_NoSort(poly p, ring r, ring dest_r)
void PrintS(const char *s)
ring rModifyRing_Wp(ring r, int *weights)
construct Wp, C ring
void rKillModifiedRing(ring r)
void rKillModified_Wp_Ring(ring r)
ring rModifyRing_Simple(ring r, BOOLEAN ommit_degree, BOOLEAN ommit_comp, unsigned long exp_limit, BOOLEAN &simple)
#define rField_is_Ring(R)
void sBucket_Add_p(sBucket_pt bucket, poly p, int length)
adds poly p to bucket destroys p!
sBucket_pt sBucketCreate(const ring r)
void sBucketDestroyAdd(sBucket_pt bucket, poly *p, int *length)
ideal idInit(int idsize, int rank)
initialise an ideal / module
void id_ShallowDelete(ideal *h, ring r)
Shallowdeletes an ideal/matrix.