My Project
Macros | Functions
cfCharSetsUtil.cc File Reference

This file provides utility functions to compute characteristic sets. More...

#include "config.h"
#include "canonicalform.h"
#include "cf_algorithm.h"
#include "cfCharSetsUtil.h"

Go to the source code of this file.

Macros

#define __ARRAY_INIT__   -1
 
#define __INIT_GAP__   3
 

Functions

int degpsmax (const CFList &PS, const Variable &x, Intarray &A, Intarray &C)
 
int degpsmin (const CFList &PS, const Variable &x, Intarray &A, Intarray &B, Intarray &C, Intarray &D)
 
int Tdeg (const CFList &PS, const Variable &x, Intarray &A, Intarray &B, Intarray &C, Intarray &D, Intarray &E, Intarray &F)
 
int nr_of_poly (const CFList &PS, const Variable &x, Intarray &G)
 
int degord (const Variable &x, const Variable &y, const CFList &PS, Intarray &A, Intarray &B, Intarray &C, Intarray &D, Intarray &E, Intarray &F, Intarray &G)
 
Variable get_max_var (const CFList &PS)
 
CFList only_in_one (const CFList &PS, const Variable &x)
 
void initArray (const int highest_level, Intarray &A, Intarray &B, Intarray &C, Intarray &D, Intarray &E, Intarray &F, Intarray &G)
 
Varlist reorderb (const Varlist &difference, const CFList &PS, const int highest_level)
 
CFList swapvar (const CFList &PS, const Variable &x, const Variable &y)
 swapvar a whole list of CanonicalForms More...
 
CFFList swapvar (const CFFList &PS, const Variable &x, const Variable &y)
 
bool lowerRank (const CanonicalForm &F, const CanonicalForm &G, int &ind)
 
CanonicalForm lowestRank (const CFList &L)
 
int minLevel (const CFList &L)
 
void sortListCFList (ListCFList &list)
 sort in descending order of length of elements More...
 
void sortCFListByLevel (CFList &list)
 sort in descending order of level of elements More...
 
bool isSubset (const CFList &PS, const CFList &Cset)
 is PS a subset of Cset ? More...
 
void inplaceUnion (const ListCFList &a, ListCFList &b)
 Union of a and b stored in b. More...
 
ListCFList adjoin (const CFList &is, const CFList &qs, const ListCFList &qh)
 
ListCFList adjoinb (const CFList &is, const CFList &qs, const ListCFList &qh, const CFList &cs)
 
void select (const ListCFList &ppi, int length, ListCFList &ppi1, ListCFList &ppi2)
 
CanonicalForm normalize (const CanonicalForm &F)
 normalize a poly, i.e. in char 0 clear denominators, remove integer content in char p divide by leading coeff More...
 
CanonicalForm Prem (const CanonicalForm &F, const CanonicalForm &G)
 pseudo remainder of F by G with certain factors of LC (g) cancelled More...
 
CanonicalForm Premb (const CanonicalForm &f, const CFList &L)
 pseudo remainder of f by L with faster test for remainder being zero More...
 
CanonicalForm Prem (const CanonicalForm &f, const CFList &L)
 pseudo remainder of f by L More...
 
CFList uniGcd (const CFList &L)
 
CFList initials (const CFList &L)
 
CFList factorsOfInitials (const CFList &L)
 
void removeContent (CanonicalForm &F, CanonicalForm &cF)
 
CFList factorPSet (const CFList &PS)
 
void removeFactors (CanonicalForm &r, StoreFactors &StoredFactors, CFList &removedFactors)
 
CFList removeContent (const CFList &PS, StoreFactors &StoredFactors)
 
bool contractsub (const CFList &cs1, const CFList &cs2)
 
ListCFList contract (const ListCFList &cs)
 

Detailed Description

This file provides utility functions to compute characteristic sets.

Note
some of the code is code from libfac or derived from code from libfac. Libfac is written by M. Messollen. See also COPYING for license information and README for general information on characteristic sets.
Authors
Martin Lee

Definition in file cfCharSetsUtil.cc.

Macro Definition Documentation

◆ __ARRAY_INIT__

#define __ARRAY_INIT__   -1

Definition at line 23 of file cfCharSetsUtil.cc.

◆ __INIT_GAP__

#define __INIT_GAP__   3

Definition at line 257 of file cfCharSetsUtil.cc.

Function Documentation

◆ adjoin()

ListCFList adjoin ( const CFList is,
const CFList qs,
const ListCFList qh 
)

Definition at line 495 of file cfCharSetsUtil.cc.

496{
497 ListCFList iss, qhi;
499 CFList iscopy, itt;
501 int ind, length;
502
503 for (i= is; i.hasItem(); i++)
504 {
505 if (i.getItem().level() > 0)
506 iscopy= Union (CFList (i.getItem()), iscopy);
507 }
508 if (iscopy.isEmpty())
509 return iss;
510
511 qhi= Difference (qh, qs);
512 length= qhi.length();
513
514 for (i= iscopy; i.hasItem(); i++)
515 {
516 itt= Union (qs, CFList (i.getItem()));
517 ind= 0;
518 if (length > 0)
519 {
520 for (j= qhi; j.hasItem(); j++)
521 {
522 if (isSubset (j.getItem(), itt))
523 ind= 1;
524 }
525 }
526 if (ind == 0)
527 iss.append (itt);
528 }
529 return iss;
530}
bool isSubset(const CFList &PS, const CFList &Cset)
is PS a subset of Cset ?
int i
Definition: cfEzgcd.cc:132
int length() const
Definition: ftmpl_list.cc:273
void append(const T &)
Definition: ftmpl_list.cc:256
int isEmpty() const
Definition: ftmpl_list.cc:267
int j
Definition: facHensel.cc:110
template List< Variable > Union(const List< Variable > &, const List< Variable > &)
template List< Variable > Difference(const List< Variable > &, const List< Variable > &)
static BOOLEAN length(leftv result, leftv arg)
Definition: interval.cc:257

◆ adjoinb()

ListCFList adjoinb ( const CFList is,
const CFList qs,
const ListCFList qh,
const CFList cs 
)

Definition at line 533 of file cfCharSetsUtil.cc.

535{
536 ListCFList iss, qhi;
538 CFList iscopy, itt;
540 int ind, length;
541
542 for (i= is ; i.hasItem(); i++)
543 {
544 if (i.getItem().level() > 0)
545 iscopy= Union (CFList (i.getItem()), iscopy);
546 }
547 if (iscopy.isEmpty())
548 return iss;
549 qhi= Difference (qh, qs);
550 length= qhi.length();
551 for (i= iscopy; i.hasItem(); i++)
552 {
553 itt= Union (Union (qs, CFList (i.getItem())), cs);
554 ind= 0;
555 if (length > 0)
556 {
557 for (j= qhi; j.hasItem(); j++)
558 {
559 if (isSubset (j.getItem(), itt))
560 ind= 1;
561 }
562 }
563 if (ind == 0)
564 iss.append(itt);
565 }
566 return iss;
567}

◆ contract()

ListCFList contract ( const ListCFList cs)

Definition at line 926 of file cfCharSetsUtil.cc.

927{
928 ListCFList mem, ts;
929 CFList iitem, jitem;
930
931 if (cs.length() < 2)
932 return cs;
933
934 int l= cs.length();
935 int ii= 1;
937 for (ListCFListIterator i= cs; i.hasItem() && ii < l; i++, ii++)
938 {
939 iitem= i.getItem();
940 if (!find (mem, iitem))
941 {
942 j= i;
943 j++;
944 for (; j.hasItem(); j++)
945 {
946 jitem= j.getItem();
947 if (!find (mem, jitem))
948 {
949 if (contractsub (iitem, jitem))
950 {
951 ts.append (jitem);
952 mem.append (jitem);
953 }
954 else
955 {
956 if (contractsub (jitem, iitem))
957 ts.append (iitem); // no mem.append (item) because we assume cs does not contain duplicate entries
958 }
959 }
960 }
961 }
962 }
963 return Difference (cs,ts);
964}
bool contractsub(const CFList &cs1, const CFList &cs2)
int l
Definition: cfEzgcd.cc:100
template bool find(const List< CanonicalForm > &, const CanonicalForm &)

◆ contractsub()

bool contractsub ( const CFList cs1,
const CFList cs2 
)

Definition at line 904 of file cfCharSetsUtil.cc.

905{
907
909 for (i= cs1; i.hasItem(); i++)
910 {
911 if (Prem (i.getItem(), cs2) != 0)
912 return false;
913 }
914
915 CFList is= factorsOfInitials (cs1);
916
917 for (i= is; i.hasItem(); i++)
918 {
919 if (Prem (i.getItem(), cs2) == 0)
920 return false;
921 }
922 return true;
923}
CanonicalForm Prem(const CanonicalForm &F, const CanonicalForm &G)
pseudo remainder of F by G with certain factors of LC (g) cancelled
CFList factorsOfInitials(const CFList &L)
factory's main class
Definition: canonicalform.h:86

◆ degord()

int degord ( const Variable x,
const Variable y,
const CFList PS,
Intarray A,
Intarray B,
Intarray C,
Intarray D,
Intarray E,
Intarray F,
Intarray G 
)

Definition at line 162 of file cfCharSetsUtil.cc.

165{
166 int xlevel= level(x), ylevel= level(y);
167
168 if (degpsmax(PS,y,A,C) < degpsmax(PS,x,A,C)) return 1;
169 else if (degpsmax(PS,x,A,C) < degpsmax(PS,y,A,C) ) return 0;
170 else if (C[ylevel] < C[xlevel]) return 1;
171 else if (C[xlevel] < C[ylevel]) return 0;
172 else if (degpsmin(PS,x,A,B,C,D) < degpsmin(PS,y,A,B,C,D)) return 1;
173 else if (degpsmin(PS,y,A,B,C,D) < degpsmin(PS,x,A,B,C,D)) return 0;
174 else if (D[ylevel] < D[xlevel]) return 1;
175 else if (D[xlevel] < D[ylevel]) return 0;
176 else if (Tdeg(PS,y,A,B,C,D,E,F) < Tdeg(PS,x,A,B,C,D,E,F)) return 1;
177 else if (Tdeg(PS,x,A,B,C,D,E,F) < Tdeg(PS,y,A,B,C,D,E,F)) return 0;
178 else if (F[ylevel] < F[xlevel]) return 1;
179 else if (F[xlevel] < F[ylevel]) return 0;
180 else if (nr_of_poly(PS,x,G) <= nr_of_poly(PS,y,G)) return 1;
181 else return 0;
182}
int level(const CanonicalForm &f)
int nr_of_poly(const CFList &PS, const Variable &x, Intarray &G)
int Tdeg(const CFList &PS, const Variable &x, Intarray &A, Intarray &B, Intarray &C, Intarray &D, Intarray &E, Intarray &F)
int degpsmin(const CFList &PS, const Variable &x, Intarray &A, Intarray &B, Intarray &C, Intarray &D)
int degpsmax(const CFList &PS, const Variable &x, Intarray &A, Intarray &C)
Variable x
Definition: cfModGcd.cc:4082
const CanonicalForm int const CFList const Variable & y
Definition: facAbsFact.cc:53
REvaluation E(1, terms.length(), IntRandom(25))
b *CanonicalForm B
Definition: facBivar.cc:52
#define D(A)
Definition: gentable.cc:131
STATIC_VAR TreeM * G
Definition: janet.cc:31
#define A
Definition: sirandom.c:24

◆ degpsmax()

int degpsmax ( const CFList PS,
const Variable x,
Intarray A,
Intarray C 
)

Definition at line 27 of file cfCharSetsUtil.cc.

29{
30 int varlevel= level(x);
31 if (A[varlevel] != __ARRAY_INIT__)
32 return A[varlevel];
33 int max= 0, temp, count= 0;
34
35 for (CFListIterator i= PS; i.hasItem(); i++)
36 {
37 temp= degree (i.getItem(), x);
38 if (temp > max)
39 {
40 max= temp;
41 count = 0;
42 }
43 if (temp == max)
44 count += max; // we count the number of polys
45 }
46 A[varlevel]= max;
47 C[varlevel]= count;
48 return max;
49}
int degree(const CanonicalForm &f)
#define __ARRAY_INIT__
static int max(int a, int b)
Definition: fast_mult.cc:264
int status int void size_t count
Definition: si_signals.h:59

◆ degpsmin()

int degpsmin ( const CFList PS,
const Variable x,
Intarray A,
Intarray B,
Intarray C,
Intarray D 
)

Definition at line 54 of file cfCharSetsUtil.cc.

56{
57 int varlevel= level(x);
58 if (B[varlevel] != __ARRAY_INIT__ )
59 return B[varlevel];
60 int min= degpsmax (PS, x, A, C), temp, count= 0;
61
62 if (min == 0)
63 {
64 B[varlevel]= min;
65 D[varlevel]= min;
66 return min;
67 }
68 else
69 {
70 for (CFListIterator i= PS; i.hasItem(); i++)
71 {
72 temp= degree (i.getItem(), x);
73 if (temp < min && temp != 0)
74 {
75 min= temp;
76 count= 0;
77 }
78 if (temp == min)
79 count += min; // we count the number of polys
80 }
81 }
82 B[varlevel]= min;
83 D[varlevel]= count;
84 return min;
85}
static int min(int a, int b)
Definition: fast_mult.cc:268

◆ factorPSet()

CFList factorPSet ( const CFList PS)

Definition at line 805 of file cfCharSetsUtil.cc.

806{
808 CFFList factors;
810
811 for (CFListIterator i= PS; i. hasItem(); i++)
812 {
813 factors= factorize (i.getItem());
814 if (factors.getFirst().factor().inCoeffDomain())
815 factors.removeFirst();
816 for (j= factors; j.hasItem(); j++ )
817 result= Union (result, CFList (normalize (j.getItem().factor())));
818 }
819 return result;
820}
CanonicalForm normalize(const CanonicalForm &F)
normalize a poly, i.e. in char 0 clear denominators, remove integer content in char p divide by leadi...
CFFList FACTORY_PUBLIC factorize(const CanonicalForm &f, bool issqrfree=false)
factorization over or
Definition: cf_factor.cc:405
T getFirst() const
Definition: ftmpl_list.cc:279
void removeFirst()
Definition: ftmpl_list.cc:287
return result
Definition: facAbsBiFact.cc:75

◆ factorsOfInitials()

CFList factorsOfInitials ( const CFList L)

Definition at line 755 of file cfCharSetsUtil.cc.

756{
758 CFFList factors;
759 CanonicalForm tmp;
760
761 for (CFListIterator i= L; i.hasItem(); i++)
762 {
763 factors= factorize (LC (i.getItem()));
764 for (CFFListIterator j= factors; j.hasItem(); j++)
765 {
766 tmp= j.getItem().factor();
767 if (!tmp.inCoeffDomain())
768 result= Union (result, CFList (normalize (tmp)));
769 }
770 }
771
772 return result;
773}
CanonicalForm LC(const CanonicalForm &f)
bool inCoeffDomain() const

◆ get_max_var()

Variable get_max_var ( const CFList PS)

Definition at line 196 of file cfCharSetsUtil.cc.

197{
198 Variable x= PS.getFirst().mvar(), y;
199 for (CFListIterator i= PS; i.hasItem(); i++)
200 {
201 y= i.getItem().mvar();
202 if (y > x)
203 x= y;
204 }
205 return x;
206}
Variable mvar() const
mvar() returns the main variable of CO or Variable() if CO is in a base domain.
factory's class for variables
Definition: factory.h:127

◆ initArray()

void initArray ( const int  highest_level,
Intarray A,
Intarray B,
Intarray C,
Intarray D,
Intarray E,
Intarray F,
Intarray G 
)

Definition at line 228 of file cfCharSetsUtil.cc.

230{
231 for (int i=1 ; i <= highest_level; i ++)
232 {
235 C[i]= __ARRAY_INIT__;
238 F[i]= __ARRAY_INIT__;
240 }
241}

◆ initials()

CFList initials ( const CFList L)

Definition at line 743 of file cfCharSetsUtil.cc.

744{
746 for (CFListIterator iter= L; iter.hasItem(); iter++)
747 {
748 if (!LC(iter.getItem()).inCoeffDomain())
749 result.append (LC (iter.getItem()));
750 }
751 return result;
752}
T & getItem() const
Definition: ftmpl_list.cc:431
CFFListIterator iter
Definition: facAbsBiFact.cc:53

◆ inplaceUnion()

void inplaceUnion ( const ListCFList a,
ListCFList b 
)

Union of a and b stored in b.

Definition at line 473 of file cfCharSetsUtil.cc.

474{
475 if (a.isEmpty())
476 return;
477 if (b.isEmpty())
478 {
479 b= a;
480 return;
481 }
482
484 CFList elem;
485
486 for (i= a; i.hasItem(); i++)
487 {
488 elem= i.getItem();
489 if ((!elem.isEmpty()) && (!find (b, elem)))
490 b.insert(elem);
491 }
492}
CanonicalForm b
Definition: cfModGcd.cc:4103

◆ isSubset()

bool isSubset ( const CFList PS,
const CFList Cset 
)

is PS a subset of Cset ?

Definition at line 461 of file cfCharSetsUtil.cc.

462{
463 for (CFListIterator i= PS; i.hasItem(); i++)
464 {
465 if (!find (Cset, i.getItem()))
466 return 0;
467 }
468 return 1;
469}

◆ lowerRank()

bool lowerRank ( const CanonicalForm F,
const CanonicalForm G,
int &  ind 
)

Definition at line 325 of file cfCharSetsUtil.cc.

326{
327 int degF, degG, levelF, levelG;
328
329 levelF= F.level();
330 levelG= G.level();
331 if (F.inCoeffDomain())
332 {
333 if (G.inCoeffDomain())
334 ind= 1;
335 return true;
336 }
337 else if (G.inCoeffDomain())
338 return false;
339 else if (levelF < levelG)
340 return true;
341 else if (levelF == levelG)
342 {
343 degF= degree(F);
344 degG= degree(G);
345 if (degF < degG)
346 return true;
347 else if (degF == degG)
348 return lowerRank (LC (F), LC (G), ind);
349 else
350 return false;
351 }
352 return false;
353}
bool lowerRank(const CanonicalForm &F, const CanonicalForm &G, int &ind)
int level() const
level() returns the level of CO.

◆ lowestRank()

CanonicalForm lowestRank ( const CFList L)

Definition at line 357 of file cfCharSetsUtil.cc.

358{
359 CFListIterator i= L;
361 int ind= 0;
362 if (!i.hasItem())
363 return f;
364
365 f= i.getItem();
366 i++;
367
368 while (i.hasItem())
369 {
370 if (lowerRank (i.getItem(), f, ind))
371 {
372 if (ind)
373 {
374 if (size (i.getItem()) < size (f))
375 f= i.getItem();
376 ind= 0;
377 }
378 else
379 f= i.getItem();
380 }
381 i++;
382 }
383 return f;
384}
int size(const CanonicalForm &f, const Variable &v)
int size ( const CanonicalForm & f, const Variable & v )
Definition: cf_ops.cc:600
FILE * f
Definition: checklibs.c:9

◆ minLevel()

int minLevel ( const CFList L)

Definition at line 386 of file cfCharSetsUtil.cc.

387{
388 if (L.isEmpty())
389 return 0;
390 int min= size (L.getFirst());
391 return min;
392}

◆ normalize()

CanonicalForm normalize ( const CanonicalForm F)

normalize a poly, i.e. in char 0 clear denominators, remove integer content in char p divide by leading coeff

Definition at line 590 of file cfCharSetsUtil.cc.

591{
592 if (F.isZero())
593 return F;
594 if (getCharacteristic() == 0)
595 {
597 bool isRat= isOn (SW_RATIONAL);
598 if (!isRat)
599 On (SW_RATIONAL);
600 G= F;
601 G *= bCommonDen (G);
603 G /= icontent (G);
604 if (isRat)
605 On (SW_RATIONAL);
606 if (lc(G) < 0)
607 G= -G;
608 return G;
609 }
610
611 return F/lc (F);
612}
bool isOn(int sw)
switches
void On(int sw)
switches
void Off(int sw)
switches
CanonicalForm lc(const CanonicalForm &f)
CanonicalForm FACTORY_PUBLIC icontent(const CanonicalForm &f)
CanonicalForm icontent ( const CanonicalForm & f )
Definition: cf_gcd.cc:74
int FACTORY_PUBLIC getCharacteristic()
Definition: cf_char.cc:70
CanonicalForm bCommonDen(const CanonicalForm &f)
CanonicalForm bCommonDen ( const CanonicalForm & f )
static const int SW_RATIONAL
set to 1 for computations over Q
Definition: cf_defs.h:31
CF_NO_INLINE bool isZero() const

◆ nr_of_poly()

int nr_of_poly ( const CFList PS,
const Variable x,
Intarray G 
)

Definition at line 146 of file cfCharSetsUtil.cc.

147{
148 int min= 0, varlevel= level(x);
149 if (G[varlevel] != __ARRAY_INIT__)
150 return G[varlevel];
151 for (CFListIterator i= PS; i.hasItem(); i++)
152 {
153 min += 1;
154 if (degree (i.getItem(), x) > 0)
155 break;
156 }
157 G[varlevel]= min;
158 return min;
159}

◆ only_in_one()

CFList only_in_one ( const CFList PS,
const Variable x 
)

Definition at line 212 of file cfCharSetsUtil.cc.

213{
214 CFList output;
215
216 for (CFListIterator i= PS; i.hasItem(); i++ )
217 {
218 if (degree (i.getItem(), x) >= 1)
219 output.insert (i.getItem());
220 if (output.length() >= 2)
221 break;
222 }
223 return output;
224}
void insert(const T &)
Definition: ftmpl_list.cc:193

◆ Prem() [1/2]

pseudo remainder of F by G with certain factors of LC (g) cancelled

Definition at line 616 of file cfCharSetsUtil.cc.

617{
618 CanonicalForm f, g, l, test, lu, lv, t, retvalue;
619 int degF, degG, levelF, levelG;
620 bool reord;
621 Variable v, vg= G.mvar();
622
623 if ( (levelF= F.level()) < (levelG= G.level()))
624 return F;
625 else
626 {
627 if ( levelF == levelG )
628 {
629 f= F;
630 g= G;
631 reord= false;
632 v= F.mvar();
633 }
634 else
635 {
636 v= Variable (levelF + 1);
637 f= swapvar (F, vg, v);
638 g= swapvar (G, vg, v);
639 reord= true;
640 }
641 degG= degree (g, v );
642 degF= degree (f, v );
643 if (degG <= degF)
644 {
645 l= LC (g);
646 g= g - l*power (v, degG);
647 }
648 else
649 l= 1;
650 while ((degG <= degF) && (!f.isZero()))
651 {
652 test= gcd (l, LC(f));
653 lu= l / test;
654 lv= LC(f) / test;
655 t= g*lv*power (v, degF - degG);
656
657 if (degF == 0)
658 f= 0;
659 else
660 f= f - LC (f)*power (v, degF);
661
662 f= f*lu - t;
663 degF= degree (f, v);
664 }
665
666 if (reord)
667 retvalue= swapvar (f, vg, v);
668 else
669 retvalue= f;
670
671 return retvalue;
672 }
673}
CanonicalForm power(const CanonicalForm &f, int n)
exponentiation
CFList swapvar(const CFList &PS, const Variable &x, const Variable &y)
swapvar a whole list of CanonicalForms
g
Definition: cfModGcd.cc:4090
CanonicalForm test
Definition: cfModGcd.cc:4096
const Variable & v
< [in] a sqrfree bivariate poly
Definition: facBivar.h:39
static CanonicalForm * retvalue
Definition: readcf.cc:126
int gcd(int a, int b)
Definition: walkSupport.cc:836

◆ Prem() [2/2]

CanonicalForm Prem ( const CanonicalForm f,
const CFList L 
)

pseudo remainder of f by L

Definition at line 710 of file cfCharSetsUtil.cc.

711{
713 CFListIterator i= L;
714
715 for (i.lastItem(); i.hasItem(); i--)
716 rem= normalize (Prem (rem, i.getItem()));
717
718 return rem;
719}
void rem(unsigned long *a, unsigned long *q, unsigned long p, int &dega, int degq)
Definition: minpoly.cc:572

◆ Premb()

CanonicalForm Premb ( const CanonicalForm f,
const CFList L 
)

pseudo remainder of f by L with faster test for remainder being zero

Definition at line 677 of file cfCharSetsUtil.cc.

678{
680 CFList l= L;
681 l.removeFirst();
683
684 for (i.lastItem(); i.hasItem(); i--)
685 rem= normalize (Prem (rem, i.getItem()));
686
687 CanonicalForm tmp= L.getFirst()/content (L.getFirst());
688
689 bool isRat= isOn (SW_RATIONAL);
690 int ch=getCharacteristic();
691 if (ch == 0 && !isRat)
692 On (SW_RATIONAL);
693 if (fdivides (tmp, rem))
694 {
695 if (ch == 0 && !isRat)
697 return 0;
698 }
699
700 if (ch == 0 && !isRat)
702
703 rem= normalize (Prem (rem, L.getFirst()));
704
705 return rem;
706}
CanonicalForm FACTORY_PUBLIC content(const CanonicalForm &)
CanonicalForm content ( const CanonicalForm & f )
Definition: cf_gcd.cc:603
bool fdivides(const CanonicalForm &f, const CanonicalForm &g)
bool fdivides ( const CanonicalForm & f, const CanonicalForm & g )

◆ removeContent() [1/2]

void removeContent ( CanonicalForm F,
CanonicalForm cF 
)

Definition at line 776 of file cfCharSetsUtil.cc.

777{
778 if (size (F) == 1)
779 {
780 CanonicalForm tmp= F;
781 F= F.mvar();
782 cF= tmp/F;
783 if (!cF.inCoeffDomain())
784 cF= normalize (cF);
785 else
786 cF= 0;
787 F= normalize (F);
788
789 return;
790 }
791
792 cF= content (F);
793
794 if (cF.inCoeffDomain())
795 cF= 0;
796 else
797 {
798 cF= normalize (cF);
799 F /= cF;
800 F= normalize (F);
801 }
802}

◆ removeContent() [2/2]

CFList removeContent ( const CFList PS,
StoreFactors StoredFactors 
)

Definition at line 879 of file cfCharSetsUtil.cc.

880{
881 CFListIterator i= PS;
882 if ((!i.hasItem()) || (PS.getFirst().level() == 0 ))
883 return PS;
884
885 CFList output;
886 CanonicalForm cc,elem;
887
888 for (; i.hasItem(); i++)
889 {
890 elem= i.getItem();
891 cc= content (elem, elem.mvar());
892 if (cc.level() > 0 )
893 {
894 output.append (normalize (elem / cc));
895 StoredFactors.FS1 = Union (CFList (normalize (cc)), StoredFactors.FS1);
896 }
897 else
898 output.append(normalize (elem));
899 }
900 return output;
901}
CFList FS1
factors that were removed

◆ removeFactors()

void removeFactors ( CanonicalForm r,
StoreFactors StoredFactors,
CFList removedFactors 
)

Definition at line 823 of file cfCharSetsUtil.cc.

825{
826 CanonicalForm quot;
827 CFList testlist;
828 int n= level(r);
829 bool divides;
831
832 for (int i=1; i<= n; i++)
833 testlist.append (CanonicalForm (Variable (i)));
834
835 // remove already removed factors
836 for (j= StoredFactors.FS1; j.hasItem(); j++)
837 {
838 while (fdivides (j.getItem(), r, quot))
839 {
840 r= quot;
841 }
842 }
843
844 for (j= StoredFactors.FS2; j.hasItem(); j++)
845 {
846 divides= false;
847 if (j.getItem() != r)
848 {
849 while (fdivides (j.getItem(), r, quot))
850 {
851 divides= true;
852 r= quot;
853 }
854 if (divides)
855 removedFactors= Union (removedFactors, CFList (j.getItem()));
856 }
857 }
858 r= normalize (r);
859
860 // remove variables
861 for (j= testlist; j.hasItem() && !r.isOne(); j++)
862 {
863 divides= false;
864 if (j.getItem() != r)
865 {
866 while (fdivides (j.getItem(), r, quot))
867 {
868 divides= true;
869 r= quot;
870 }
871 if (divides)
872 removedFactors= Union (removedFactors, CFList (j.getItem()));
873 }
874 }
875 r= normalize (r);
876}
CF_NO_INLINE bool isOne() const
CFList FS2
candidate factors that might get removed

◆ reorderb()

Varlist reorderb ( const Varlist difference,
const CFList PS,
const int  highest_level 
)

Definition at line 259 of file cfCharSetsUtil.cc.

261{
262 Intarray A(1, highest_level), B(1, highest_level), C(1, highest_level),
263 D(1, highest_level), E(1, highest_level), F(1, highest_level),
264 G(1, highest_level);
265 initArray (highest_level, A, B, C, D, E, F, G);
266 int i= 0, j, n= difference.length(), gap= 1 + __INIT_GAP__;
267 Variable temp;
268 Array<Variable> v(0, n);
270
271 for (J= difference; J.hasItem(); J++ )
272 {
273 v[i]= J.getItem();
274 i++;
275 }
276
277 while (gap <= n)
278 gap = __INIT_GAP__ * gap + 1;
279 gap /= __INIT_GAP__;
280
281 while (gap > 0)
282 {
283 for (i= gap; i <= n - 1; i++)
284 {
285 temp= v[i];
286 for (j= i - gap; j >=0 ; j -= gap)
287 {
288 if (degord (v[j], temp, PS, A, B, C, D, E, F, G))
289 break;
290 v[j + gap]= v[j];
291 }
292 v[j + gap]= temp;
293 }
294 gap /= __INIT_GAP__;
295 }
296 Varlist output;
297 for (i= 0; i <= n - 1; i++)
298 output.append (v[i]);
299 return output;
300}
int degord(const Variable &x, const Variable &y, const CFList &PS, Intarray &A, Intarray &B, Intarray &C, Intarray &D, Intarray &E, Intarray &F, Intarray &G)
#define __INIT_GAP__
void initArray(const int highest_level, Intarray &A, Intarray &B, Intarray &C, Intarray &D, Intarray &E, Intarray &F, Intarray &G)

◆ select()

void select ( const ListCFList ppi,
int  length,
ListCFList ppi1,
ListCFList ppi2 
)

Definition at line 570 of file cfCharSetsUtil.cc.

571{
572 CFList elem;
573 for (ListCFListIterator i= ppi; i.hasItem(); i++)
574 {
575 elem= i.getItem();
576 if (!elem.isEmpty())
577 {
578 if (length <= elem.length())
579 ppi2.append(elem);
580 else
581 ppi1.append(elem);
582 }
583 }
584}

◆ sortCFListByLevel()

void sortCFListByLevel ( CFList list)

sort in descending order of level of elements

Definition at line 428 of file cfCharSetsUtil.cc.

429{
430 int l= 1;
431 int k= 1;
434 for (CFListIterator i= list; l <= list.length(); i++, l++)
435 {
436 for (CFListIterator j= list; k <= list.length() - l; k++)
437 {
438 m= j;
439 m++;
440 if ((size (j.getItem()) < size (m.getItem())) ||
441 ((size (j.getItem()) == size (m.getItem()))
442 && (j.getItem().level() < m.getItem().level())))
443 {
444 buf= m.getItem();
445 m.getItem()= j.getItem();
446 j.getItem()= buf;
447 j++;
448 j.getItem()= m.getItem();
449 }
450 else
451 j++;
452 }
453 k= 1;
454 }
455}
int m
Definition: cfEzgcd.cc:128
int k
Definition: cfEzgcd.cc:99
int status int void * buf
Definition: si_signals.h:59

◆ sortListCFList()

void sortListCFList ( ListCFList list)

sort in descending order of length of elements

Definition at line 396 of file cfCharSetsUtil.cc.

397{
398 int l= 1;
399 int k= 1;
400 CFList buf;
402 for (ListCFListIterator i= list; l <= list.length(); i++, l++)
403 {
404 for (ListCFListIterator j= list; k <= list.length() - l; k++)
405 {
406 m= j;
407 m++;
408 if ((j.getItem().length() < m.getItem().length()) ||
409 (j.getItem().length() == m.getItem().length() &&
410 minLevel (j.getItem()) > minLevel (m.getItem())))
411 {
412 buf= m.getItem();
413 m.getItem()= j.getItem();
414 j.getItem()= buf;
415 j++;
416 j.getItem()= m.getItem();
417 }
418 else
419 j++;
420 }
421 k= 1;
422 }
423}
int minLevel(const CFList &L)

◆ swapvar() [1/2]

CFFList swapvar ( const CFFList PS,
const Variable x,
const Variable y 
)

Definition at line 314 of file cfCharSetsUtil.cc.

315{
316 CFFList ps;
317
318 for (CFFListIterator i= PS; i.hasItem(); i++)
319 ps.append (CFFactor (swapvar (i.getItem().factor(), x, y),
320 i.getItem().exp()));
321 return ps;
322}

◆ swapvar() [2/2]

CFList swapvar ( const CFList PS,
const Variable x,
const Variable y 
)

swapvar a whole list of CanonicalForms

Definition at line 304 of file cfCharSetsUtil.cc.

305{
306 CFList ps;
307
308 for (CFListIterator i= PS; i.hasItem(); i++)
309 ps.append (swapvar (i.getItem(), x, y));
310 return ps;
311}

◆ Tdeg()

int Tdeg ( const CFList PS,
const Variable x,
Intarray A,
Intarray B,
Intarray C,
Intarray D,
Intarray E,
Intarray F 
)

Definition at line 91 of file cfCharSetsUtil.cc.

93{
94 int k= degpsmin (PS, x, A, B, C, D), varlevel= level(x), min= 0;
95
96 if (E[varlevel] != __ARRAY_INIT__)
97 return E [varlevel];
98 if (k == 0)
99 {
100 E[varlevel]= 0;
101 F[varlevel]= 0;
102 }
103 else
104 {
105 int nopslc= 0;
106 CFList LCdegList;
107 CanonicalForm elem;
109
110 for (i= PS; i.hasItem(); i++)
111 {
112 elem= i.getItem();
113 if (degree (elem, x) == k)
114 LCdegList.append (LC (elem, x));
115 }
116
117 if (LCdegList.length() > 0)
118 {
119 CFList TermList;
120 int newmin, newnopslc;
121
122 min= totaldegree (LCdegList.getFirst());
123 TermList= get_Terms (LCdegList.getFirst());
124 nopslc= TermList.length();
125 for (i= LCdegList; i.hasItem(); i++)
126 {
127 elem= i.getItem();
128 newmin= totaldegree(elem);
129 TermList= get_Terms(elem);
130 newnopslc= TermList.length();
131 if (newmin < min)
132 min= newmin;
133 if (newnopslc < nopslc)
134 nopslc= newnopslc;
135 }
136
137 }
138 E[varlevel]= min;
139 F[varlevel]= nopslc;
140 }
141 return min;
142}
int totaldegree(const CanonicalForm &f)
int totaldegree ( const CanonicalForm & f )
Definition: cf_ops.cc:523
CFList get_Terms(const CanonicalForm &f)
Definition: cf_factor.cc:289

◆ uniGcd()

CFList uniGcd ( const CFList L)

Definition at line 721 of file cfCharSetsUtil.cc.

722{
723 CFList tmp;
726 for (i= L; i.hasItem(); i++)
727 {
728 if (i.getItem().isUnivariate() && i.getItem().level() == 1)
729 tmp.append (i.getItem());
730 }
731 if (tmp.length() <= 2)
732 return L;
733 i= tmp;
734 g= i.getItem();
735 i++;
736 g= gcd (g,i.getItem());
737 i++;
738 for (; i.hasItem(); i++)
739 g= gcd (g, i.getItem());
740 return Union (Difference (L, tmp), CFList (g));
741}