File: mterm.hh

package info (click to toggle)
faust 0.9.95~repack1-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 164,732 kB
  • ctags: 18,777
  • sloc: cpp: 90,427; sh: 6,116; java: 4,501; objc: 4,428; ansic: 3,301; makefile: 1,298; ruby: 950; yacc: 511; xml: 398; lex: 218; python: 136
file content (65 lines) | stat: -rw-r--r-- 2,431 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#ifndef __MTERM__
#define __MTERM__

#include <stdio.h>
#include <assert.h>
#include "tlib.hh"
#include "signals.hh"
#include "sigprint.hh"
#include "simplify.hh"
#include "normalize.hh"
#include "sigorderrules.hh"
#include <map>
#include <list>

using namespace std;

/**
 * Implements a multiplicative term, a term of type
 * k*x^n*y^m*... and its arithmetic
 */
class mterm
{

    Tree            fCoef;    					///< constant part of the term (usually 1 or -1)
    map<Tree,int>   fFactors;     				///< non constant terms and their power

 public:
    mterm ();									///< create a 0 mterm
    mterm (int k);								///< create a simple integer mterm
    mterm (double k);							///< create a simple float mterm
    mterm (Tree t);								///< create a mterm from a multiplicative exp
    mterm (const mterm& m);						///< create a copy of a mterm
	
	void cleanup();								///< remove usued factors
	bool isNotZero() const;						///< true if mterm doesn't represent number 0
	bool isNegative() const;					///< true if mterm has a negative coefficient

    const mterm& operator = (const mterm& m);	///< replace the content with a copy of m

    const mterm& operator *= (Tree m);			///< multiply in place by a multiplicative exp
    const mterm& operator /= (Tree m);			///< divide in place by a multiplicative exp

    const mterm& operator += (const mterm& m);	///< add in place an mterm of same signature
    const mterm& operator -= (const mterm& m);	///< add in place an mterm of same signature
	
    const mterm& operator *= (const mterm& m);	///< multiply in place by a mterm
    const mterm& operator /= (const mterm& m);	///< divide in place by a mterm

    mterm operator * (const mterm& m) const;	///< mterms multiplication
    mterm operator / (const mterm& m) const;	///< mterms division
	ostream& print(ostream& dst) const;			///< print a mterm k*x1**n1*x2**n2...
	
	int complexity() const;						///< return an evaluation of the complexity
	Tree normalizedTree(bool sign=false, 
						bool neg=false) const;	///< return the normalized tree of the mterm
	Tree signatureTree() const;					///< return a signature (a normalized tree)

	bool hasDivisor (const mterm& n) const;		///< return true if this can be divided by n
    friend mterm gcd (const mterm& m1, const mterm& m2);	/// greatest common divisor of two mterms
};

inline ostream& operator << (ostream& s, const mterm& m) { return m.print(s); }


#endif