source: git/libfac/charset/csutil.cc @ 3e55bc

spielwiese
Last change on this file since 3e55bc was 3e55bc, checked in by Hans Schönemann <hannes@…>, 26 years ago
* hannes/michael: libfac 0.2.4 git-svn-id: file:///usr/local/Singular/svn/trunk@377 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 12.4 KB
Line 
1/* Copyright 1996 Michael Messollen. All rights reserved. */
2////////////////////////////////////////////////////////////
3// emacs edit mode for this file is -*- C++ -*-
4static char * rcsid = "$Id: csutil.cc,v 1.2 1997-06-09 15:55:54 Singular Exp $";
5/////////////////////////////////////////////////////////////
6// FACTORY - Includes
7#include <factory.h>
8// Factor - Includes
9#include <tmpl_inst.h>
10#include <Factor.h>
11#include <SqrFree.h>
12// Charset - Includes
13#include "csutil.h"
14
15static bool
16lowerRank ( const CanonicalForm & f, const CanonicalForm & g )
17{
18  int df, dg;
19  Variable vf = f.mvar(), vg = g.mvar();
20   
21  if ( f.inCoeffDomain() ) return true;//( vg > vf );
22  else 
23    if ( g.inCoeffDomain() ) return false;
24    else 
25      if ( vf < vg ) return true;
26      else 
27        if ( vf == vg ) {
28          df = degree( f ); dg = degree( g );
29          if ( df < dg ) return true;
30          else 
31            if ( df == dg ) return lowerRank( LC( f ), LC( g ) );
32            else return false;
33        }
34  return false;
35}
36
37CanonicalForm
38lowestRank( const CFList & F )
39{
40  CFListIterator i = F;
41  CanonicalForm f;
42  if ( ! i.hasItem() )  return f;
43  f = i.getItem(); ++i;
44  while ( i.hasItem() ) {
45    if ( lowerRank( i.getItem(), f ) ) f = i.getItem();
46    ++i;
47  }
48  return f;
49}
50
51// old version
52// CanonicalForm
53// prem ( const CanonicalForm &f, const CanonicalForm &g )
54// {
55//   CanonicalForm ff, gg, cg;
56//   int df, dg;
57//   bool reord;
58//   Variable vf, vg, v;
59//
60//   if ( (vf = f.mvar()) < (vg = g.mvar()) ) return f;
61//   else {
62//     if ( vf == vg ) {
63//       ff = f; gg = g;
64//       reord = false;
65//       v = vg;
66//     }
67//     else {
68//       v = Variable(level(f.mvar()) + 1);
69//       ff = swapvar(f,vg,v);
70//       gg = swapvar(g,vg,v);
71//       reord=true;
72//     }
73//     cg = ini( gg, v );
74//     dg = degree( gg, v );
75//     while ( ( df = degree( ff, v ) ) >= dg )
76//       ff = cg * ff - power( v, df-dg ) * gg * LC( ff, v );
77//     if ( reord ) {
78//       return swapvar( ff, vg, v );
79//     }
80//     else
81//       return ff;
82//   }
83// }
84
85CanonicalForm
86Prem ( const CanonicalForm &f, const CanonicalForm &g ){
87  CanonicalForm ff, gg, cg, l, test, lu, lv, t;
88  int df, dg;
89  bool reord;
90  Variable vf, vg, v;
91 
92  if ( (vf = f.mvar()) < (vg = g.mvar()) ) return f;
93  else {
94    if ( vf == vg ) {
95      ff = f; gg = g;
96      reord = false;
97      v = vg;
98    }
99    else { 
100      v = Variable(level(f.mvar()) + 1);
101      ff = swapvar(f,vg,v);
102      gg = swapvar(g,vg,v);
103      reord=true;
104    }
105    cg = LC( gg, v );
106    dg = degree( gg, v );
107    df = degree( ff, v );
108    if (dg <= df) {l=LC(gg); gg = gg -LC(gg)*power(v,dg);}
109    else { l = 1; }
110    while ( ( dg <= df  ) && ( ff != ff.genZero()) ){
111      // cout << "Start gcd..." << endl;
112      test = gcd(l,LC(ff));
113      // cout << "End gcd..." << endl;
114      lu = l/test; lv = LC(ff)/test;
115      t = power(v,df-dg) * gg * lv;
116      if ( df == 0 ){ ff = ff.genZero(); }
117      else { ff = ff - LC(ff)*power(v,df); }
118      ff = lu*ff - t;
119      df = degree( ff, v );
120    }
121    if ( reord ) return swapvar( ff, vg, v );
122    else return ff;
123  }
124}
125
126CanonicalForm
127Prem( const CanonicalForm &f, const CFList &L ){
128  CanonicalForm rem = f;
129  CFListIterator i = L;
130  for ( i.lastItem(); i.hasItem(); i-- ){
131//cout << "   PREM: Prem(" << rem << "," ;
132    rem = Prem( rem, i.getItem() );
133//cout << i.getItem() << ")  = " << rem << endl;
134  }
135  if ( rem!=0 )
136   return num(rem/lc(rem));
137  else
138   return rem;
139}
140
141CFList
142Prem( const CFList &AS, const CFList &L ){
143  CFList Output;
144  for ( CFListIterator i=AS; i.hasItem(); i++ )
145    Output = Union(CFList(Prem(i.getItem(),L)), Output);
146  return Output;
147}
148
149// for characteristic sets
150//////////////////////////////////
151// replace the power of factors of polys in as by 1 if any
152static CFList
153nopower( const CanonicalForm & init ){
154  CFFList sqrfreelist;// = Factorize(init);//SqrFree(init);
155  CFList output;
156  CanonicalForm elem;
157  int count=0;
158 
159  for ( CFIterator j=init; j.hasTerms(); j++ )
160    if (j.coeff() != 1 ) count += 1;
161  //  if ( init != 1 ){
162  //  cout << "nopower: f is " << init << endl;
163  //  cout << "nopower: count is " << count << endl;}
164  if ( count > 1 ) sqrfreelist = CFFList( CFFactor(init,1));
165  else { 
166    sqrfreelist = Factorize(init);
167    //sqrfreelist.removeFirst();
168  }
169  for ( CFFListIterator i=sqrfreelist; i.hasItem(); i++ ){
170    elem=i.getItem().factor();
171    if ( cls(elem) > 0 ) output.append(elem);
172  }
173  return output;
174}
175
176// remove the content of polys in PS; add the removed content to
177// Remembern.FS2 ( the set of removed factors )
178CFList
179removecontent ( const CFList & PS, PremForm & Remembern ){
180  CFList output;
181  CanonicalForm cc,elem;
182
183  if ( cls(PS.getFirst()) == 0 ) return PS;
184
185  for (CFListIterator i=PS; i.hasItem(); i++){
186    elem = i.getItem();
187    cc = content(elem, elem.mvar());
188    if ( cls(cc) > 0 ) { 
189      output.append(elem/cc); 
190      Remembern.FS2 = Union(CFList(cc), Remembern.FS2); 
191    }
192    else{ output.append(elem); }
193  }
194  return output;
195}
196
197// remove possible factors in Remember.FS1 from poly r
198// Remember.FS2 contains all factors removed before
199void 
200removefactor( CanonicalForm & r , PremForm & Remembern){
201  int test;
202  CanonicalForm a,b,testelem;
203  CFList testlist;
204  int n=level(r);
205  CFListIterator j ;
206
207  for ( int J=1; J<= n ; J++ ){
208    testlist.append(CanonicalForm(Variable(J)));
209  }
210
211  // remove already removed factors
212  for ( j = Remembern.FS2 ; j.hasItem(); j++ ){
213    testelem = j.getItem();
214    while ( 1 ){
215      test = divremt(r,testelem,a,b);
216      if ( test && b == r.genZero() ) r = a;
217      else break;
218    }
219  }
220 
221  // Let's look if we have other canditates to remove
222  for ( j = testlist ; j.hasItem(); j++ ){
223    testelem = j.getItem();
224    if ( testelem != r ){
225      while ( 1 ){
226        test = divremt(r,testelem,a,b);
227      test = divremt(r,testelem,a,b);
228      if ( test && b == r.genZero() ) r = a;
229        if ( test && b == r.genZero() ){
230            Remembern.FS2= Union(Remembern.FS2, CFList(testelem));
231              r = a;
232              if ( r == 1 ) break;
233        }
234        else break;
235      }
236    }
237  }
238}
239
240
241// all irreducible nonconstant factors of a set of polynomials
242CFList
243factorps( const CFList &ps ){
244  CFList qs;
245  CFFList q;
246  CanonicalForm elem;
247 
248  for ( CFListIterator i=ps; i. hasItem(); i++ ){
249    q=Factorize(i.getItem());
250    q.removeFirst();
251    // Next can be simplified ( first (already removed) elem in q is the only constant
252    for ( CFFListIterator j=q; j.hasItem(); j++ ){
253      elem = j.getItem().factor();
254      if ( getNumVars(elem) > 0 )
255        qs= Union(qs, CFList(num(elem/lc(elem))));
256    }
257  }
258  return qs;
259}
260
261// the initial of poly f wrt to the order of the variables
262static CanonicalForm
263inital( const CanonicalForm &f ){
264  CanonicalForm leadcoeff;
265
266  if ( cls(f) == 0 ) {return f.genOne(); }
267  else { 
268    leadcoeff = LC(f,lvar(f));
269    if ( leadcoeff != 0 ) 
270      return num(leadcoeff/lc(leadcoeff));
271    else return leadcoeff;
272  }
273}
274
275// the set of all nonconstant factors of initals of polys in as
276// CFList
277// initalset(const CFList &as){
278//   CanonicalForm elem;
279//   CFList is, iss,iniset;
280
281//   for ( CFListIterator i=as ; i.hasItem(); i++ ){
282//     elem = inital(i.getItem());
283//     if ( cls(elem) > 0 ) is.append(elem);
284//   }
285//   iss = factorps(is);
286//   for ( CFListIterator j=iss; j.hasItem();j++ ){
287//     elem = j.getItem();
288//     if ( cls(elem) > 0 ) iniset.append(num(elem/lc(elem)));
289//   }
290//   return iniset;
291// }
292
293// the set of nonconstant initials of CS
294// with certain repeated factors cancelled
295CFList
296initalset1(const CFList & CS){
297  CFList temp;
298  CFList initals;
299  CanonicalForm init;
300
301  for ( CFListIterator i = CS ; i.hasItem(); i++ ){
302    initals= nopower( inital(i.getItem()) );
303    //    init= inital(i.getItem());
304    for ( CFListIterator j = initals; j.hasItem(); j++){
305      init = j.getItem();
306      if ( cls(init) > 0 )
307        temp= Union(temp, CFList(init));
308    }
309  }
310  return temp;
311}
312
313// the set of nonconstant initials of CS of those polys
314// not having their cls higher than reducible
315// with certain repeated factors cancelled
316CFList
317initalset2(const CFList & CS, const CanonicalForm & reducible){
318  CFList temp;
319  CFList initals;
320  CanonicalForm init;
321  int clsred = cls(reducible);
322
323  for ( CFListIterator i = CS ; i.hasItem(); i++ ){
324    init = i.getItem();
325    if ( cls(init) < clsred ){
326      initals= nopower( inital(init) );
327      //    init= inital(i.getItem());
328      for ( CFListIterator j = initals; j.hasItem(); j++){
329        init = j.getItem();
330        if ( cls(init) > 0 )
331          temp= Union(temp, CFList(init));
332      }
333    }
334  }
335  return temp;
336}
337
338//replace the power of factors of poly in CF init by 1 if any
339// and return the sqrfree poly
340// static CanonicalForm
341// nopower1( const CanonicalForm & init ){
342//   CFFList returnlist=Factorize(init);
343//   CanonicalForm elem, test=init.genOne();
344//   for ( CFFListIterator i= returnlist; i.hasItem(); i++){
345//     elem = i.getItem().factor();
346//     if ( cls(elem)>0 ) test *= elem;
347//   }
348//   return test;
349// }
350
351// the sequence of distinct factors of f
352//CF pfactor( ..... )
353
354//////////////////////////////////////////
355// for IrrCharSeries
356
357#ifdef IRRCHARSERIESDEBUG
358#  define DEBUGOUTPUT
359#else
360#  undef DEBUGOUTPUT
361#endif
362#include "debug.h"
363// examine the irreducibility of as for IrrCharSeries
364int
365irreducible( const CFList & AS){
366// AS is given by AS = { A1, A2, .. Ar }, d_i = degree(Ai)
367
368  DEBOUTMSG(cout, rcsid);
369// 1) we test: if d_i > 1, d_j =1 for all j<>i, then AS is irreducible.
370  bool deg1=1;
371  for ( CFListIterator i = AS ; i.hasItem(); i++ ){
372    if ( degree(i.getItem()) > 1 ){
373      if ( deg1 ) deg1=0;
374      else return 0; // found 2nd poly with deg > 1
375    }
376  }
377  return 1;
378}
379
380
381// select an item from PS for irras
382CFList
383select( const ListCFList & PS){
384
385  return PS.getFirst();
386}
387
388// divide list ppi in elems having length <= and > length
389void
390select( const ListCFList & ppi, int length, ListCFList & ppi1, ListCFList & ppi2){
391  CFList elem;
392  for ( ListCFListIterator i=ppi ; i.hasItem(); i++ ){
393    elem = i.getItem();
394    if ( ! elem.isEmpty() )
395      if ( length <= elem.length() ){ ppi2.append(elem); }
396      else { ppi1.append(elem); }
397  }
398}
399
400
401//////////////////////////////////////////////////////////////
402// help-functions for sets
403
404// is f in F ?
405static bool
406member( const CanonicalForm &f, const CFList &F){
407
408  for ( CFListIterator i=F; i.hasItem(); i++ )
409    if ( i.getItem() == f ) return 1;
410  return 0;
411}
412
413// are list A and B the same?
414bool
415same( const CFList &A, const CFList &B ){
416  CFListIterator i;
417
418  for (i = A; i.hasItem(); i++)
419    if (! member(i.getItem(), B) )  return 0;
420  for (i = B; i.hasItem(); i++)
421    if (! member(i.getItem(), A) )  return 0;
422  return 1;
423}
424
425
426// is List cs contained in List of lists pi?
427bool
428member( const CFList & cs, const ListCFList & pi ){
429  ListCFListIterator i;
430  CFList elem;
431
432  for ( i=pi; i.hasItem(); i++){
433    elem = i.getItem();
434    if ( same(cs,elem) ) return 1;
435  }
436  return 0;
437}
438
439// is PS a subset of CS ?
440bool
441subset( const CFList &PS, const CFList &CS ){
442
443  //  cout << "subset: called with: " << PS << "   " << CS << endl;
444  for ( CFListIterator i=PS; i.hasItem(); i++ )
445    if ( ! member(i.getItem(), CS) ) { 
446      //      cout << "subset: " << i.getItem() << "  is not a member of " << CS << endl;
447      return 0;
448    }
449  return 1;
450}
451
452// Union of two List of Lists
453ListCFList
454MyUnion( const ListCFList & a, const ListCFList &b ){
455  ListCFList output;
456  ListCFListIterator i;
457  CFList elem;
458 
459  for ( i = a ; i.hasItem(); i++ ){
460    elem=i.getItem();
461    // if ( ! member(elem,output) ){
462    if ( (! elem.isEmpty()) && ( ! member(elem,output)) ){
463      output.append(elem);
464    }
465  }
466 
467  for ( i = b ; i.hasItem(); i++ ){
468    elem=i.getItem();
469    // if ( ! member(elem,output) ){
470    if ( (! elem.isEmpty()) && ( ! member(elem,output)) ){
471      output.append(elem);
472    }
473  }
474  return output;
475}
476
477//if list b is member of the list of lists remove b and return the rest
478ListCFList
479MyDifference( const ListCFList & a, const CFList &b){
480  ListCFList output;
481  ListCFListIterator i;
482  CFList elem;
483
484  for ( i = a ; i.hasItem(); i++ ){
485    elem=i.getItem();
486    if ( (! elem.isEmpty()) && ( ! same(elem,b)) ){
487      output.append(elem);
488    }
489  }
490return output;
491}
492
493// remove all elements of b from list of lists a and return the rest
494ListCFList
495Minus( const ListCFList & a, const ListCFList & b){
496  ListCFList output=a;
497
498  for ( ListCFListIterator i=b; i.hasItem(); i++ )
499    output = MyDifference(output, i.getItem() );
500
501  return output;
502}
503
504/*
505$Log: not supported by cvs2svn $
506Revision 1.3  1997/04/25 22:55:00  michael
507Version for libfac-0.2.1
508
509Revision 1.2  1996/12/13 05:53:42  michael
510fixed a typo in nopower
511
512*/
Note: See TracBrowser for help on using the repository browser.