source: git/libfac/charset/charset.cc @ 36b7a3

spielwiese
Last change on this file since 36b7a3 was 36b7a3, checked in by Hans Schönemann <hannes@…>, 16 years ago
*hannes: gcc 4.2 git-svn-id: file:///usr/local/Singular/svn/trunk@10633 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 18.0 KB
Line 
1/* Copyright 1996 Michael Messollen. All rights reserved. */
2////////////////////////////////////////////////////////////
3// emacs edit mode for this file is -*- C++ -*-
4/* $Id: charset.cc,v 1.13 2008-03-18 17:46:14 Singular Exp $ */
5/////////////////////////////////////////////////////////////
6// FACTORY - Includes
7#include <factory.h>
8#ifdef HAVE_IOSTREAM
9#define CIN std::cin
10#else
11#define CIN cin
12#endif
13// Factor - Includes
14#include <SqrFree.h>
15#include <Factor.h>
16#include <interrupt.h>
17// Charset - Includes
18#include "csutil.h"
19#include "algfactor.h"
20#include "alg_factor.h"
21// Some CC's need this:
22#include "charset.h"
23
24#ifdef BASICSETDEBUG
25#  define DEBUGOUTPUT
26#else
27#  undef DEBUGOUTPUT
28#endif
29
30#include "debug.h"
31#include "timing.h"
32TIMING_DEFINE_PRINT(subfactorize_time);
33
34
35// forward declarations:
36static CFList     irras(CFList & AS, int &ja, CanonicalForm & reducible);
37
38#ifdef BASICSETDEBUG
39#  define DEBUGOUTPUT
40#else
41#  undef DEBUGOUTPUT
42#endif
43#include "debug.h"
44
45#ifdef SINGULAR
46#define HAVE_SINGULAR_ERROR
47#endif
48
49#ifdef HAVE_SINGULAR_ERROR
50   extern "C" { void WerrorS(const char *); }
51   extern "C" { void WarnS(const char *); }
52#endif
53
54// the next computes a characteristic set (a basic set in Wang's sense)
55CFList
56BasicSet( const CFList &PS )
57{
58    CFList QS = PS, BS, RS;
59    CanonicalForm b;
60    int cb;
61
62    DEBOUTLN(CERR, "BasicSet: called with ps= ", PS);
63    if ( PS.length() < 2 ) return PS;
64    while ( ! QS.isEmpty() ) {
65        b = lowestRank( QS );
66        cb = rank( b );
67        DEBOUTLN(CERR, "BasicSet: choose b  = ", b);
68        DEBOUTLN(CERR, "BasicSet: it's rank = ", cb);
69        BS=Union(CFList(b),BS);//BS.append( b );
70        if ( rank( b ) == 0 )
71            return Union(PS, CFList(b)) ; // b should be the first elem!
72        else {
73            RS = CFList();
74            // QS:= {q \in QS -{B} | q is reduced wrt b}
75            // We can process whole QS, because b is not reduced wrt. b
76            for ( CFListIterator i = QS; i.hasItem(); ++i )
77                if ( degree( i.getItem(), cb ) < degree( b ) )
78                    //RS.append( i.getItem() );
79                    RS = Union(CFList(i.getItem()),RS);
80            QS = RS;
81        }
82    }
83    DEBOUTLN(CERR, "BasicSet: returning bs= ", BS);
84    return BS;
85}
86
87int
88checkok( const CFList & PS, CFList & FS2){
89  CanonicalForm elem;
90
91  for ( CFListIterator i=PS; i.hasItem(); i++){
92    elem= i.getItem();
93    for (CFListIterator j=FS2; j.hasItem(); j++){
94      if (elem == j.getItem()){
95         //        FS2= Difference(FS2,CFList(elem));
96         return 0;
97      }
98    }
99  }
100  return 1;
101}
102
103#ifdef MCHARSETNDEBUG
104#  define DEBUGOUTPUT
105#else
106#  undef DEBUGOUTPUT
107#endif
108#include "debug.h"
109
110// The modified CharSet (an extended characteristic set with certain factors
111// canceled; this is a characteristic set in Wang's sense)
112CFList
113MCharSetN( const CFList &PS, PremForm & Remembern ){
114  CFList QS = PS, RS = PS, CSet, OLDCS;
115
116  DEBOUTLN(CERR, "MCharSetN: called with ps= ", PS);
117  while ( ! RS.isEmpty() ) {
118    CSet = BasicSet( QS );
119    OLDCS=CSet;
120    DEBOUTLN(CERR, "MCharSetN: CS= ", CSet);
121//     if ( getNumVars(CSet.getFirst()) > 1 ){
122//       //CSet = removecontent(CSet, Remembern);
123// #ifdef MCHARSETNDEBUG
124//       CERR << "MCharSetN: CSet= " << CSet << "\n";
125// #endif
126//     }
127    Remembern.FS1 = Union(Remembern.FS1, initalset1(CSet));
128    DEBOUTLN(CERR, "MCharSetN: Remembern.FS1= ", Remembern.FS1);
129    DEBOUTLN(CERR, "MCharSetN: Remembern.FS2= ", Remembern.FS2);
130    RS = CFList();
131    if ( rank( CSet.getFirst() ) != 0 ) {
132      CFList D = Difference( QS, CSet );
133      DEBOUT(CERR, "MCharSetN: Difference( ", QS);
134      DEBOUT(CERR, " , ", CSet);
135      DEBOUTLN(CERR, " ) = ", D);
136//CERR << "MCharSetN: Difference( " << QS << " , " << CSet << " ) = " << D << "\n";
137      //PremForm Oldremember=Remembern;
138      //PremForm Newremember=Remembern;
139      for ( CFListIterator i = D; i.hasItem(); ++i ) {
140        CanonicalForm r = Prem( i.getItem(), CSet );
141        DEBOUT(CERR,"MCharSetN: Prem(", i.getItem()  );
142        DEBOUT(CERR, ",", CSet);
143        DEBOUTLN(CERR,") = ", r);
144//CERR << "MCharSetN: Prem("<< i.getItem() << "," << CSet << ") = " << r << "\n";
145        if ( r != 0 ){
146          //removefactor( r, Newremember );
147          removefactor( r, Remembern );
148          //Remembern.FS2 = Union(Remembern.FS2, Newremember.FS2);
149          //Newremember = Oldremember;
150          //if ( cls(r) > 0 )
151            //RS=Union(CFList(r),RS);//RS.append( r );
152            RS=Union(RS,CFList(r));
153        }
154      }
155      if ( ! checkok(RS,Remembern.FS2)) return CFList(CanonicalForm(1));
156      DEBOUTLN(CERR, "MCharSetN: RS= ", RS);
157      //QS = Union( QS, RS );
158      QS = Union(OLDCS,RS);
159      DEBOUTLN(CERR, "MCharSetN: QS= Union(QS,RS)= ", QS);
160    }
161    else{ return CFList(CanonicalForm(1)); }
162  }
163  DEBOUTLN(CERR, "MCharSetN: Removed factors: ", Remembern.FS2);
164  DEBOUTLN(CERR, "MCharSetN: Remembern.FS1: ", Remembern.FS1);
165
166  return CSet;
167}
168
169
170CFList
171mcharset( const CFList &PS, PremForm & Remembern ){
172  CFList cs= MCharSetN(PS, Remembern );
173  CFList rs= remsetb(Difference(PS,cs),cs);
174
175  DEBOUTLN(CERR, "mcharset: cs= ", cs);
176  DEBOUTLN(CERR, "mcharset: rs= ", rs);
177  if ( rs.length() > 0 )
178    cs= mcharset(Union(PS,Union(cs,rs)), Remembern);
179  return cs;
180}
181
182// the "original" extended characteristic set
183CFList
184CharSet( const CFList &PS ){
185  CFList QS = PS, RS = PS, CSet;
186
187  while ( ! RS.isEmpty() ) {
188    CSet = BasicSet( QS );
189    DEBOUTLN(CERR, "CharSet: CSet= ", CSet);
190    RS = CFList();
191    if ( rank( CSet.getFirst() ) != 0 ) {
192      CFList D = Difference( QS, CSet );
193      for ( CFListIterator i = D; i.hasItem(); ++i ) {
194        CanonicalForm r = Prem( i.getItem(), CSet );
195        if ( r != 0 )  RS=Union(CFList(r),RS);//RS.append( r );
196      }
197      QS = Union( QS, RS );
198    }
199  }
200  return CSet;
201}
202
203static CFList
204charseta( const CFList & PS ){
205  CFList QS = PS, RS = PS, CSet;
206
207  while ( ! RS.isEmpty() ) {
208    CSet = CharSet( QS );
209    RS = CFList();
210    if ( rank( CSet.getFirst() ) != 0 ) {
211      CFList D = Difference( QS, CSet );
212      for ( CFListIterator i = D; i.hasItem(); ++i ) {
213        CanonicalForm r = Prem( i.getItem(), CSet );
214        if ( r != 0 )  RS=Union(CFList(r),RS);//RS.append( r );
215      }
216      QS = Union(CSet,Union( QS, RS ));
217    }
218    else return CFList(CanonicalForm(1));
219  }
220  return CSet;
221}
222
223static bool
224contractsub( const CFList & cs1, const CFList & cs2 ){
225  CFListIterator i;
226
227  for ( i=cs1; i.hasItem(); i++ )
228    if ( Prem(i.getItem(),cs2 ) != 0 ) return false;
229  CFList is=initalset1(cs1);
230  for ( i=is; i.hasItem(); i++ )
231    if ( Prem(i.getItem(),cs2 ) == 0 ) return false;
232  return true;
233}
234
235static ListCFList
236contract( const ListCFList & cs){
237  ListCFList mem,ts;
238  CFList iitem,jitem;
239
240  if ( cs.length() < 2 ) return cs;
241
242  for ( ListCFListIterator i=cs; i.hasItem(); i++ ){
243    iitem=i.getItem();
244    if ( ! member(iitem, mem))
245      for ( ListCFListIterator j=i; j.hasItem(); j++){
246        jitem=j.getItem();
247        if ( ! same( iitem, jitem ) )
248          if ( ! member(jitem, mem))
249            if ( contractsub(iitem, jitem) ){
250              ts.append(jitem); mem.append(jitem);
251            }
252            else
253              if ( contractsub(jitem, iitem) ){
254                ts.append(iitem);
255              }
256      }
257  }
258  return Minus(cs,ts);
259}
260
261static ListCFList
262adjoin(const CFList & is, const CFList & qs, const ListCFList & qh ){
263  ListCFList iss,qhi;
264  ListCFListIterator j;
265  CFList iscopy,itt;
266  CFListIterator i;
267  CanonicalForm elem;
268  int ind, length;
269
270  for ( i=is ; i.hasItem(); i++ ){
271    elem=i.getItem();
272    if ( cls(elem) > 0 ) iscopy=Union(CFList(elem),iscopy);
273  }
274  if ( iscopy.isEmpty() ) return iss;
275  qhi = MyDifference(qh,qs);
276  length = qhi.length();
277  for ( i =iscopy; i.hasItem(); i++){
278    itt = Union(qs,CFList(i.getItem()));
279    ind = 0;
280    if ( length > 0 )
281      for ( j=qhi; j.hasItem(); j++ )
282        if ( subset(j.getItem(),itt )) ind=1;
283    if ( ind == 0 ) iss.append(itt);
284  }
285  return iss;
286}
287
288static ListCFList
289adjoinb(const CFList & is, const CFList & qs, const ListCFList & qh ,const CFList & cs){
290  ListCFList iss,qhi;
291  ListCFListIterator j;
292  CFList iscopy,itt;
293  CFListIterator i;
294  CanonicalForm elem;
295  int ind, length;
296
297  for ( i=is ; i.hasItem(); i++ ){
298    elem=i.getItem();
299    if ( cls(elem) > 0 ) iscopy=Union(CFList(elem),iscopy);
300  }
301  if ( iscopy.isEmpty() ) return iss;
302  qhi = MyDifference(qh,qs);
303  length = qhi.length();
304  for ( i =iscopy; i.hasItem(); i++){
305    itt = Union(Union(qs,CFList(i.getItem())),cs);
306    ind = 0;
307    if ( length > 0 )
308      for ( j=qhi; j.hasItem(); j++ )
309        if ( subset(j.getItem(),itt )) ind=1;
310    if ( ind == 0 ) {iss.append(itt);}
311  }
312  return iss;
313}
314
315static ListCFList
316sort( const ListCFList & list_to_sort ){
317  ListCFList output,copy=list_to_sort;
318  CFList l,qs1,elem;
319
320  l = copy.getLast(); copy.removeLast();
321  if ( copy.length() == 0 ){ return ListCFList(l); }
322  for ( ListCFListIterator i=copy ; i.hasItem(); i++ ){
323    elem = i.getItem();
324    if ( elem.length() > l.length() ) {
325      output = MyUnion( ListCFList(l), output);
326      l= elem;
327    }
328    else{ output = MyUnion(output, ListCFList(elem) ); }
329  }
330  //output = MyUnion(ListCFList(l),sort(output));
331  output = MyUnion(ListCFList(l),output);
332  return output;
333}
334
335#ifdef EXPERIMENTAL
336static CFList
337getItemNr( int nr, const ListCFList & copy){
338  int i =1;
339  CFList elem;
340
341  for ( ListCFListIterator j=copy; j.hasItem(); j++ )
342    if ( i == nr ) { elem=j.getItem(); break; }
343    else { i+= 1; }
344  return elem;
345}
346
347static int
348choosefrom(){
349int choice;
350    CERR << "choose from qhi! ->";
351    CIN >> choice;
352return choice;
353}
354
355static ListCFList
356msort( const ListCFList & list_to_sort ){
357  int nr, number = list_to_sort.length();
358  ListCFList output;
359
360  CERR << "Sort: list to sort is: " <<  list_to_sort << "\n";
361  for (int i=1; i<= number; i++){
362    CERR << " Next elem = "; CIN >> nr;
363    output.append(getItemNr(nr,list_to_sort));
364  }
365  return output;
366}
367#endif
368
369#ifdef IRRCHARSERIESDEBUG
370#  define DEBUGOUTPUT
371#else
372#  undef DEBUGOUTPUT
373#endif
374#include "debug.h"
375
376ListCFList
377IrrCharSeries( const CFList &PS, int opt ){
378  CanonicalForm reducible,reducible2;
379  CFList qs,cs,factorset,is,ts;
380  ListCFList pi,ppi,qqi,qsi,iss,qhi= ListCFList(PS);
381  int nr_of_iteration=0,ts2,highestlevel=0;
382#ifdef EXPERIMENTAL
383  int choice=1;;
384#endif
385
386  DEBOUTMSG(CERR, rcsid);
387//  CERR << getCharacteristic() << "\n";
388  for ( CFListIterator Ps=PS; Ps.hasItem(); Ps++ )
389    if ( level(Ps.getItem() ) > highestlevel ) highestlevel = level(Ps.getItem()) ;
390//  for ( int xx=1; xx <= highestlevel; xx++)
391//   CERR << Variable(xx) ;
392//  CERR << "\n";
393//  for ( CFListIterator Ps=PS; Ps.hasItem(); Ps++ )
394//    CERR << Ps.getItem() << ", " ;//<< "\n";
395//  CERR <<  "\n";
396  while ( ! qhi.isEmpty() ) {
397    qhi=sort(qhi);
398    DEBOUTLN(CERR, "qhi is: ", qhi);
399#ifdef EXPERIMENTAL
400    choice=choosefrom();
401    CERR <<"/n Choose " << choice << "\n";
402    qs= getItemNr(choice, qhi);
403#else
404    qs=qhi.getFirst();
405#endif
406    DEBOUTLN(CERR, "qs  is: ", qs);
407    DEBOUTLN(CERR, "ppi is: ", ppi);
408    ListCFList ppi1,ppi2;
409    select(ppi,qs.length(),ppi1,ppi2);
410    DEBOUTLN(CERR, "ppi1 is: ", ppi1);
411    DEBOUTLN(CERR, "ppi2 is: ", ppi2);
412    qqi = MyUnion(ppi2,qqi);
413    DEBOUTLN(CERR, "qqi is: ", qqi);
414    if ( nr_of_iteration == 0 ){ nr_of_iteration += 1; ppi = ListCFList(); }
415    else{ nr_of_iteration += 1; ppi = MyUnion(ListCFList(qs),ppi1); }
416    DEBOUTLN(CERR,"ppi is: ", ppi);
417    PremForm Remembern;
418    cs = MCharSetN(qs,Remembern);
419    DEBOUTLN(CERR, "cs is: ", cs);
420    DEBOUTLN(CERR, "factorset is: ", Remembern.FS2);
421    cs = removecontent(cs,Remembern);
422    factorset=Remembern.FS2;
423    DEBOUTLN(CERR, "cs (after removecontent) is: ", cs);
424    DEBOUTLN(CERR, "factorset is: ", factorset);
425    // Hier: removecontent einfuegen!!!!
426    if ( cls(cs.getFirst()) > 0 ){
427      ts = irras(cs,ts2, reducible);
428
429      // INTERRUPTHANDLER
430      if ( interrupt_handle() ) return ListCFList() ;
431      // INTERRUPTHANDLER
432
433      DEBOUTLN(CERR, "ts is: ", ts);
434      DEBOUTLN(CERR, "ts2 is: ", ts2);
435      // next is preliminary: should be ==0
436      if ( ts2 <= 0 ){ //irreducible
437        if ( ! subset(cs,qs) ){
438          DEBOUTMSG(CERR, "cs is not a subset of qs");
439          cs = charseta(Union(qs,cs));
440          DEBOUTLN(CERR, "new cs is: ", cs);
441        }
442        if ( ! member(cs,pi) ){
443          pi = MyUnion(pi, ListCFList(cs));
444          DEBOUTMSG(CERR, "cs is not a member of pi");
445          DEBOUTLN(CERR, "pi is: ", pi);
446          if ( cls(cs.getFirst()) > 0 ){
447            ts = irras(cs,ts2,reducible);
448
449            // INTERRUPTHANDLER
450            if ( interrupt_handle() ) return ListCFList() ;
451            // INTERRUPTHANDLER
452
453            DEBOUTLN(CERR, "ts is: ", ts);
454            DEBOUTLN(CERR, "ts2 is: ", ts2);
455            // next is preliminary: should be ==0
456            if ( ts2 <= 0 ){ //irreducible
457              qsi = MyUnion(qsi,ListCFList(cs));
458              DEBOUTLN(CERR, "qsi is: ", qsi);
459              if ( cs.length() == highestlevel ){
460                DEBOUTLN(CERR, "cs.length() == nops(ord) :", cs.length());
461                is = factorps(factorset);
462              }
463              else{
464                DEBOUT(CERR,"cs.length() != nops(ord) :", cs.length());
465                DEBOUTLN(CERR, "  nops(ord)= ", highestlevel);
466                is = Union(initalset1(cs),factorps(factorset));
467              }
468              DEBOUTLN(CERR, "is is: ", is);
469              iss = adjoin(is,qs,qqi);
470              DEBOUTLN(CERR, "iss is: ", iss);
471            }
472          }
473          else{ iss = adjoin(factorps(factorset),qs,qqi); }
474        }
475        else{
476          DEBOUTMSG(CERR, "cs is a member of pi");
477          iss = adjoin(factorps(factorset),qs,qqi); }
478        DEBOUTLN(CERR, "iss is: ", iss);
479        DEBOUTLN(CERR, "   factorps(factorset)= ", factorps(factorset));
480        DEBOUTLN(CERR, "   qs= ", qs);
481        DEBOUTLN(CERR, "   qqi= ", qqi);
482      }
483      // next is preliminary: should be !=0
484      if ( ts2 > 0 ){
485        is = factorps(factorset);
486        DEBOUTLN(CERR, "is is: ", is);
487        if ( ts2 > 1 ){
488          // setup cst: need it later for adjoinb
489          CFList cst;
490          for ( CFListIterator i=cs ; i.hasItem(); i++){
491            if ( i.getItem() == reducible ) { break; }
492            else { cst.append(i.getItem()); }
493          }
494          is = Union(initalset1(cst), is);
495          iss = MyUnion(adjoin(is,qs,qqi), adjoinb(ts,qs,qqi,cst));
496        }
497        else{ iss = adjoin(Union(is,ts),qs,qqi); }
498        DEBOUTLN(CERR, "iss is: ", iss);
499      }
500    }
501    else{
502      iss = adjoin(factorps(factorset),qs,qqi);
503      DEBOUTMSG(CERR, "case: cs is a constant.");
504      DEBOUTLN(CERR, "  qs = ", qs);
505      DEBOUTLN(CERR, "  qqi = ", qqi);
506      DEBOUTLN(CERR, "  iss = adjoin(factorps(factorset),qs,qqi) = ",iss);
507    }
508    if ( qhi.length() > 1 ){ qhi.removeFirst(); qhi = MyUnion(qhi,iss); }
509    else{ qhi = iss; }
510    DEBOUTLN(CERR, "iss is: ", iss);
511  }
512  if ( ! qsi.isEmpty() ){
513    DEBOUTLN(CERR, "qsi before contract= ", qsi);
514    if ( opt == 0 ){
515       return contract( qsi );
516    }
517    else { return qsi; }
518  }
519  else{ return ListCFList() ; }
520}
521
522// tests for characteristic sets
523//////////////////////////////////
524#ifdef IRRASDEBUG
525#  define DEBUGOUTPUT
526#else
527#  undef DEBUGOUTPUT
528#endif
529
530#include "debug.h"
531
532static CFList
533irras( CFList & AS, int & ja, CanonicalForm & reducible){
534  CFFList qs;
535  CFList ts,as;
536  CanonicalForm elem;
537  int ind=1,nr=0, success=-1;
538  CFListIterator i;
539
540  ja = 0;
541  DEBOUTLN(CERR, "irras: called with: AS= ", AS);
542  for ( i=AS; i.hasItem(); i++ ){
543    elem = i.getItem();
544    nr += 1;
545    DEBOUT(CERR, "irras: factoring: ", elem);
546    if ( degree(elem) > 1 ) // linear poly's are irreduzible
547    {
548      qs = Factorize(elem);
549    }
550    else{
551      qs=(CFFactor(elem,1));
552      qs.insert(CFFactor(CanonicalForm(1),1));
553    }
554    DEBOUTLN(CERR, "  = ", qs);
555    // INTERRUPTHANDLER
556    if ( interrupt_handle() ) return CFList() ;
557    // INTERRUPTHANDLER
558    qs.removeFirst();
559    if ( (qs.length() >= 2 ) || (qs.getFirst().exp() > 1)){
560      DEBOUTLN(CERR, "irras: Setting ind=0, ja= ", nr);
561      ja=nr; ind=0; reducible= elem;
562      break;
563    }
564    //    else{ as.append(elem) ; }
565  }
566  //  CERR << "ind= " << ind << "\n";
567  if ( (ind == 1) ){ //&& ( as.length() > 1) ){
568    if ( irreducible(AS) ){ // as quasilinear? => irreducible!
569      ja = 0;
570      DEBOUTLN(CERR, "as is irreducible. as= ", AS);
571    }
572    else {
573      i=AS;
574      for ( nr=1; nr< AS.length(); nr++){
575        as.append(i.getItem());
576        i++;
577        if ( degree(i.getItem()) > 1 ){// search for a non linear elem
578          elem=i.getItem();
579//          CERR << "f=  " << elem << "\n";
580//        CERR << "as= " << as << "\n";
581          qs= newfactoras(elem,as,success);
582//          CERR << "irras:newfactoras    qs= " << qs << "\n";
583//          qs= factoras(elem,as,success);
584//          CERR << "irras:factoras qs= " << qs << "\n";
585          if ( qs.length() > 1 || qs.getFirst().exp() > 1 ){ //found elem is reducible
586            reducible=elem;
587            ja=nr+1;
588            break;
589          }
590        }
591      }
592    }
593  }
594  for ( CFFListIterator k=qs; k.hasItem();k++)
595    ts.append(k.getItem().factor());
596  return ts;
597}
598///////////////////////////////////////////////////////////////////////////////
599/*
600$Log: not supported by cvs2svn $
601Revision 1.12  2006/06/14 15:35:08  Singular
602*hannes: CS renamed
603
604Revision 1.11  2006/05/16 14:46:49  Singular
605*hannes: gcc 4.1 fixes
606
607Revision 1.10  2002/08/19 11:11:31  Singular
608* hannes/pfister: alg_gcd etc.
609
610Revision 1.9  2001/08/08 14:26:54  Singular
611*hannes: Dan's HAVE_SINGULAR_ERROR
612
613Revision 1.8  2001/08/06 08:32:53  Singular
614* hannes: code cleanup
615
616Revision 1.7  2001/06/27 13:58:06  Singular
617*hannes/GP: debug newfactoras, char_series, ...
618
619Revision 1.6  2000/03/08 12:54:35  obachman
620 * comment out warning "libfac: Factoring over algebraic function
621   field required!"
622
623Revision 1.5  2000/03/08 12:45:41  obachman
624* fixed Singular includes
625
626Revision 1.4  1999/06/15 12:54:54  Singular
627* hannes: debug fixes for Singular-interface
628
629Revision 1.3  1997/09/12 07:19:40  Singular
630* hannes/michael: libfac-0.3.0
631
632Revision 1.2  1997/04/25 22:52:28  michael
633changed cerr and cout messages for use with Singular
634Version for libfac-0.2.1
635
636*/
Note: See TracBrowser for help on using the repository browser.