//////////////////////////////////////////////////////////// // emacs edit mode for this file is -*- C++ -*- // $Id: helpstuff.cc,v 1.9 2008-06-10 14:49:16 Singular Exp $ //////////////////////////////////////////////////////////// // FACTORY - Includes #include // Factor - Includes #include "tmpl_inst.h" // some CC's need this: #include "helpstuff.h" bool mydivremt ( const CanonicalForm& f, const CanonicalForm& g, CanonicalForm& a, CanonicalForm& b ){ bool retvalue; CanonicalForm aa,bb; retvalue = divremt(f,g,a,bb); aa= f-g*a; if ( aa==bb ) { b=bb; } else { b=aa; } return retvalue; } void mydivrem( const CanonicalForm& f, const CanonicalForm& g, CanonicalForm& a, CanonicalForm& b ){ bool retvalue; CanonicalForm aa,bb; retvalue = divremt(f,g,a,bb); aa= f-g*a; if ( aa==bb ) { b=bb; } else { b=aa; } } // Now some procedures used in SqrFree and in Factor /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// // We have to include a version of .append(CFFactor)// // and Union( CFFList, CFFList) // // because we have to look for multiplicities in SqrFree. // // e.g.: SqrFree( f^3 ) with char <> 3 // /////////////////////////////////////////////////////////////// CFFList myappend( const CFFList & Inputlist, const CFFactor & TheFactor){ CFFList Outputlist ; CFFactor copy; CFFListIterator i; int exp=0; for ( i=Inputlist ; i.hasItem() ; i++ ){ copy = i.getItem(); if ( copy.factor() == TheFactor.factor() ) exp += copy.exp(); else Outputlist.append(copy); } Outputlist.append( CFFactor(TheFactor.factor(), exp + TheFactor.exp())); return Outputlist; } CFFList myUnion(const CFFList & Inputlist1,const CFFList & Inputlist2){ CFFList Outputlist; CFFListIterator i; for ( i=Inputlist1 ; i.hasItem() ; i++ ) Outputlist = myappend(Outputlist, i.getItem() ); for ( i=Inputlist2 ; i.hasItem() ; i++ ) Outputlist = myappend(Outputlist, i.getItem() ); return Outputlist; } int Powerup( const int base , const int exp){ int retvalue=1; if ( exp == 0 ) return retvalue ; else for ( int i=1 ; i <= exp; i++ ) retvalue *= base ; return retvalue; } // Now some procedures used in MVMultiHensel and in Truefactors /////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// // mod_power: Return f mod I^k, where I is now the ideal // // {x_1, .. x_(level(f)-1)}. Computation mod I^k is simply // // done by dropping all the terms of degree >= k in // // x_1, .. x_(level(f)-1); e.g. x_1*x_2 == 0 mod I^2 . // // modpower: the real work is done here; called by mod_power // /////////////////////////////////////////////////////////////// static void modpower( const CanonicalForm & f, int k , int td, const CanonicalForm & t, CanonicalForm & result){ if ( td >= k ) return; if ( getNumVars(f) == 0 ) result += f*t; else{ Variable x(level(f)); for ( CFIterator i=f; i.hasTerms(); i++) modpower(i.coeff(),k,td+i.exp(),t*power(x,i.exp()),result); } } CanonicalForm mod_power( const CanonicalForm & f, int k, int levelU){ CanonicalForm result,dummy; Variable x(levelU); if ( levelU > level(f) ) modpower(f,k,0,1,result); else{ for ( CFIterator i=f; i.hasTerms(); i++){ dummy = 0; modpower(i.coeff(),k,0,1,dummy); result += dummy * power(x,i.exp()); // the following works, but is slower // int degf=degree(f); // for ( int i=0; i<=degf;i++){ // result+= mod_power(f[i],k,levelU)*power(x,i); } } return result; } /////////////////////////////////////////////////////////////// // Return the deg of F in the Variables x_1,..,x_(levelF-1) // /////////////////////////////////////////////////////////////// int subvardegree( const CanonicalForm & F, int levelF ){ int n=0,m=degree(F,levelF),newn=0; for ( int k=0; k<=m; k++ ){ newn = totaldegree( F[k] ); if ( newn > n ) n=newn; } return n; } /////////////////////////////////////////////////////////////// // Change poly: x_i <- x_i +- a_i for i= 1,..,level(f)-1 // /////////////////////////////////////////////////////////////// CanonicalForm change_poly( const CanonicalForm & f , const SFormList & Substitutionlist ,int directionback ){ CanonicalForm F=f,g,k; int level_i; // Variable x; for ( SFormListIterator i=Substitutionlist; i.hasItem(); i++){ // now we can access: i.getItem().factor() -> level(~) gives x_i // i.getItem().exp() -> gives a_i // ==> g = x_i ; k = a_i level_i=level(i.getItem().factor()); g = power( Variable(level_i),1 ); k= i.getItem().exp(); if ( directionback ) { if ( degree(F, level_i) != 0 ) F=F(g-k, level_i /*level(i.getItem().factor())*/); // x_i <-- x_i - a_i } else { if ( degree(F, level_i) != 0 ) F=F(g+k, level_i /*level(i.getItem().factor())*/); // x_i <-- x_i +a_i } } return F; } //////////////////////////////////////////////////////////// /* $Log: not supported by cvs2svn $ Revision 1.8 2008/03/18 17:46:16 Singular *hannes: gcc 4.2 Revision 1.7 2008/03/17 17:44:17 Singular *hannes: fact.tst Revision 1.4 2001/06/19 15:29:04 Singular *hannes: optim. Revision 1.3 1997/09/12 07:19:56 Singular * hannes/michael: libfac-0.3.0 Revision 1.3 1997/04/25 22:20:45 michael Version for libfac-0.2.1 */