ftp.nice.ch/pub/next/science/physics/delta-sigma.s.tar.gz#/delta-sigma.src/include/ratfn.h

This is ratfn.h in view mode; [Download] [Up]

#ifndef RATFNH
#define RATFNH

#include "polynomial.h"

class partial_fraction { 
public:   
    complex root, coeff;
    int multiplicity;
    complex operator()( complex z );
    complex evaluate_integral(complex z1, complex z2);
    complex invert_z_transform( int n );
};

const int polynomial_quotient=1, partial_fraction_sum=2;
class ratfn { 
public:   
    // for the quotient of polynomials representation
    polynomial num, den;
    // for the sum of partial fractions representation
    polynomial leading_polynomial;
    // causes warning messages when I do bit-set & bit-clear operations on valid
    // enum { polynomial_quotient=1, partial_fraction_sum=2 } valid;
    int valid;
    partial_fraction *pf;
    int n_pf;
    // could also use continued fraction representation
    // ...

    ratfn(){ polynomial num, den; valid=0; }
    ratfn(const polynomial& p) { 
	num=p;
	den=complex(1);
	valid = polynomial_quotient;
    }
    ratfn(const partial_fraction p);
    // Needed because C++ doesn't try multiple user-defined conversions
    ratfn(const transform_variable z);
    ratfn(const complex z);
    ratfn(const double z);
    ~ratfn() { 
	if( pf_valid() ) 
	    delete pf;
    }
    void simplify();
    int read_in( const char * );
    polynomial reduce();
    void print_partial_fraction();
    double choose(int ,int );
    double factorial(int);
    friend ratfn operator*( const ratfn&, const ratfn& );
    complex operator() ( complex x ){ return num(x)/den(x); }
    complex pf_evaluate(complex x);
    // special cases which may one day be worth implementing
    // friend ratfn operator+( const ratfn&, const double );
    // friend ratfn operator-( const ratfn&, const double );
    friend ratfn operator+( const ratfn&, const ratfn& );
    friend ratfn operator-( const ratfn&, const ratfn& );
    friend ratfn operator/( const polynomial&, const polynomial& );

    /* this pile of code is needed to handle multiple representations */
// 
// FOR NOW, I'LL ASSUME THAT THE QUOTIENT OF POLYNOMIALS REPRESENTATION
// IS ALWAYS CORRECT.  I'LL ONLY PROVIDE THE FACILITY TO CALCULATE THE
// PARTIAL FRACTION REPRESENTATION.
//
    int nd_valid(){ return valid & polynomial_quotient; }
    void nd_valid (int ok) { 
	if (ok)
	    valid |= polynomial_quotient;
	else
	    valid &= ~polynomial_quotient;
    }
    int pf_valid(){ return valid & partial_fraction_sum; }
    void pf_valid( int ok );
    void calculate_partial_fraction_expansion();
    void bless_partial_fraction() { 
	if (!pf_valid()) 
	    calculate_partial_fraction_expansion();
    }
    void make_consistent(){ bless_partial_fraction(); }
    complex invert_z_transform( int n );
    double integrate_mag2_along_unit_circle( double f1, double f2 );
    ratfn unitCircleMagnitudeSquared();
    double analytically_integrate_along_C( double f1, double f2 );
    int encircles_more_than_halfway( complex z, complex z1, complex z2 );
    double numerically_integrate_mag2_along_C( double f1, double f2 );
    double pf_error( double f1, double f2 );
    int stable();
    double h1();
};

ostream& operator<<(ostream&, const partial_fraction& );
ostream& operator<<(ostream&, const ratfn& );
istream& operator>>(istream&, ratfn& );

#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.