/* Copyright 1996 Michael Messollen. All rights reserved. */ /////////////////////////////////////////////////////////////////////////////// // emacs edit mode for this file is -*- C++ -*- //static char * rcsid = "@(#) $Id: Truefactor.cc,v 1.9 2001-08-08 14:26:56 Singular Exp $"; /////////////////////////////////////////////////////////////////////////////// // Factory - Includes #include #ifndef NOSTREAMIO #include #endif // Factor - Includes #include "tmpl_inst.h" #include "helpstuff.h" // some CC's need this: #include "Truefactor.h" #ifdef SINGULAR #define HAVE_SINGULAR_ERROR #endif #ifdef HAVE_SINGULAR_ERROR extern "C" { void WerrorS(char *); } #endif #ifdef TRUEFACTORDEBUG # define DEBUGOUTPUT #else # undef DEBUGOUTPUT #endif #include "debug.h" #include "timing.h" int hasAlgVar(const CanonicalForm &f, const Variable &v) { if (f.inBaseDomain()) return 0; if (f.inCoeffDomain()) { if (f.mvar()==v) return 1; return hasAlgVar(f.LC(),v); } if (f.inPolyDomain()) { if (hasAlgVar(f.LC(),v)) return 1; for( CFIterator i=f; i.hasTerms(); i++) { if (hasAlgVar(i.coeff(),v)) return 1; } } return 0; } int hasVar(const CanonicalForm &f, const Variable &v) { if (f.inBaseDomain()) return 0; if (f.inCoeffDomain()) { if (f.mvar()==v) return 1; return hasAlgVar(f.LC(),v); } if (f.inPolyDomain()) { if (f.mvar()==v) return 1; if (hasVar(f.LC(),v)) return 1; for( CFIterator i=f; i.hasTerms(); i++) { if (hasVar(i.coeff(),v)) return 1; } } return 0; } int hasAlgVar(const CanonicalForm &f) { if (f.inBaseDomain()) return 0; if (f.inCoeffDomain()) { if (f.level()!=0) { //cout << "hasAlgVar:" << f.mvar() < & returnlist ){ ListIntList ListofLists; IntList intermediate,intermediate2; int value,j; if ( k == 1 ){ // k=1 for ( j=1; j<=n; j++) returnlist.append( IntList(j) ); } else{ // k-1 --> k combinat(k-1,n,returnlist); // generate (k-1,n) for ( ListIntListIterator l=returnlist; l.hasItem(); l++ ){ intermediate = l.getItem(); value = intermediate.getLast(); if ( value != n ) for ( j=value+1; j<=n; j++ ){ intermediate2 = intermediate; intermediate2.append(j); ListofLists.append( intermediate2 ); } } returnlist = ListofLists; } } /////////////////////////////////////////////////////////////// // Return the CanonicalForm number nr in Factorlist. // /////////////////////////////////////////////////////////////// static CanonicalForm getItemNr(int nr, const CFFList & Factorlist ){ ListIterator i=Factorlist; int Nr=nr; for ( Nr=1; Nr test_f:"< 0 ){ // there are (at least two) items int n=2; if ( PossibleFactors.length() < n ) { // a little check #ifdef HAVE_SINGULAR_ERROR WerrorS("libfac: ERROR: TakeNorms less then two items remaining!"); #else #ifndef NOSTREAMIO cerr << "libfac: ERROR: TakeNorms less then two items remaining! " << endl; #else ; #endif #endif } while ( n < PossibleFactors.length() ){ // generate all combinations of n elements combinat(n, PossibleFactors.length(), CombinatList); for ( j=CombinatList ; j.hasItem(); j++ ){ intermediate=1; for ( k=j.getItem(); k.hasItem(); k++ ) intermediate *= getItemNr( k.getItem(), PossibleFactors ); if ( is_in_Fp( intermediate ) ){ TrueFactors.append(intermediate); // found a true factor CopyPossibleFactors=PossibleFactors; // save list for ( k=j.getItem(); k.hasItem(); k++ ) //remove combined factors from PossibleFactors PossibleFactors=Remove_from_List(PossibleFactors, getItemNr( k.getItem(), CopyPossibleFactors )); n-=1; // look for the same number of combined factors: break; } else { //cout << "Schade!" << endl; } DEBOUT(cout, "Truefactor: Combined ", n); DEBOUTLN(cout, " factors to: ", intermediate); } n += 1; } // All remaining factors in PossibleFactors multiplied // should lie in Fp domain if ( PossibleFactors.length() >=1 ){ for ( i=PossibleFactors; i.hasItem(); i++ ) intermediate *= i.getItem().factor(); // a last check: if ( is_in_Fp(intermediate) ){ TrueFactors.append(CFFactor(intermediate,1)); } else{ #ifdef HAVE_SINGULAR_ERROR WerrorS("libfac: TakeNorms: somethings wrong with remaining factors!"); #else #ifndef NOSTREAMIO cerr << "libfac: TakeNorms: somethings wrong with remaining factors!" << endl; #endif #endif } } } return TrueFactors; } //////////////////////////////////////////////////////////// /* $Log: not supported by cvs2svn $ Revision 1.8 2001/08/08 11:59:13 Singular *hannes: Dan's NOSTREAMIO changes Revision 1.7 2001/08/06 08:32:54 Singular * hannes: code cleanup Revision 1.6 2001/06/27 13:58:06 Singular *hannes/GP: debug newfactoras, char_series, ... Revision 1.5 2001/06/21 14:57:06 Singular *hannes/GP: Factorize, newfactoras, ... Revision 1.4 1997/11/18 16:39:07 Singular * hannes: moved WerrorS from C++ to C (Factor.cc MVMultiHensel.cc SqrFree.cc Truefactor.cc) Revision 1.3 1997/09/12 07:19:52 Singular * hannes/michael: libfac-0.3.0 Revision 1.3 1997/04/25 22:39:11 michael changed cerr and cout messages for use with Singular Version for libfac-0.2.1 */