]> www.ginac.de Git - ginac.git/blobdiff - ginac/mul.cpp
- changed behaviour of numeric::is_rational() and added numeric::is_cinteger()
[ginac.git] / ginac / mul.cpp
index 9155b1a93a17f1f842e6c2fb470a1314be63d28e..aea28d6355982bbfc21a762d6ac5638cf24d3210 100644 (file)
@@ -246,227 +246,6 @@ ex mul::coeff(symbol const & s, int const n) const
     return exZERO();
 }
 
-/*
-ex mul::eval(int level) const
-{
-    // simplifications: *(...,x,(c1,1),(c2,1)) -> *(...,x,(c1*c2,1)) (c1, c2 numeric(), move pairs to end first)
-    //                  *(...,x,1) -> *(...,x)
-    //                  *(...,x,0) -> 0
-    //                  *(+(x,y,...),(c,1)) -> *(+(*(x,c),*(y,c),...)) (c numeric())
-    //                  *(x) -> x
-    //                  *() -> 1
-
-    debugmsg("mul eval",LOGLEVEL_MEMBER_FUNCTION);
-
-    if ((level==1)&&(flags & status_flags::evaluated)) {
-#ifdef DO_GINAC_ASSERT
-        for (epvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
-            GINAC_ASSERT((!is_ex_exactly_of_type((*cit).rest,mul))||
-                   (!(ex_to_numeric((*cit).coeff).is_integer())));
-        }
-
-        // test if all numerics were moved to the end and
-        // all numerics with coeff 1 to the very end
-        if (seq.size()!=0) {
-            epvector::const_iterator cit=seq.end();
-            bool all_coeff_1=true;
-            bool all_numeric=true;
-            do {
-                cit--;
-                if (is_ex_exactly_of_type((*cit).rest,numeric)) {
-                    GINAC_ASSERT(all_numeric);
-                    if ((*cit).coeff.is_equal(exONE())) {
-                        GINAC_ASSERT(all_coeff_1);
-                    } else {
-                        all_coeff_1=false;
-                    }
-                } else {
-                    all_numeric=false;
-                }
-            } while (cit!=seq.begin());
-        }
-#endif // def DO_GINAC_ASSERT    
-        return *this;
-    }
-
-    epvector newseq;
-    epvector::iterator it1,it2;
-    bool seq_copied=false;
-
-    epvector * evaled_seqp=evalchildren(level);
-    if (evaled_seqp!=0) {
-        // do more evaluation later
-        return (new mul(evaled_seqp))->setflag(status_flags::dynallocated);
-    }
-
-    // combine pairs with coeff 1 (all numerics should be at end, assert below)
-    if (seq.size()>1) {
-        // count number of pairs with coeff 1
-        unsigned num_coeff_1=0;
-        bool still_numeric=true;
-        epvector::const_iterator cit=seq.end();
-        unsigned first_pos;
-        unsigned second_pos;
-        do {
-            cit--;
-            if (is_ex_exactly_of_type((*cit).rest,numeric)) {
-                if ((*cit).coeff.is_equal(exONE())) {
-                    num_coeff_1++;
-                }
-            } else {
-                still_numeric=false;
-            }
-        } while ((cit!=seq.begin())&&still_numeric);
-        if (num_coeff_1>1) {
-            newseq=seq;
-            
-    }
-    
-    
-#ifdef DO_GINAC_ASSERT
-    for (epvector::const_iterator cit=seq.begin(); cit!=seq.end(); ++cit) {
-        GINAC_ASSERT((!is_ex_exactly_of_type((*cit).rest,mul))||
-               (!(ex_to_numeric((*cit).coeff).is_integer())));
-    }
-
-    // test if all numerics were moved to the end and
-    // all numerics with coeff 1 to the very end
-    if (seq.size()!=0) {
-        epvector::const_iterator cit=seq.end();
-        bool all_coeff_1=true;
-        bool all_numeric=true;
-        do {
-            cit--;
-            if (is_ex_exactly_of_type((*cit).rest,numeric)) {
-                GINAC_ASSERT(all_numeric);
-                if ((*cit).coeff.is_equal(exONE())) {
-                    GINAC_ASSERT(all_coeff_1);
-                } else {
-                    all_coeff_1=false;
-                }
-            } else {
-                all_numeric=false;
-            }
-        } while (cit!=seq.begin());
-    }
-#endif // def DO_GINAC_ASSERT
-    
-    if (flags & status_flags::evaluated) {
-        return *this;
-    }
-    
-    expair const & last_expair=*(seq.end()-1);
-    expair const & next_to_last_expair=*(seq.end()-2);
-    int seq_size = seq.size();
-
-    // *(...,x,(c1,1),(c2,1)) -> *(...,x,(c1*c2,1)) (c1, c2 numeric())
-    if ((!seq_copied) && (seq_size>=2) &&
-        is_ex_exactly_of_type(last_expair.rest,numeric) &&
-        ex_to_numeric(last_expair.coeff).is_equal(numONE()) &&
-        is_ex_exactly_of_type(next_to_last_expair.rest,numeric) &&
-        ex_to_numeric(next_to_last_expair.coeff).is_equal(numONE()) ) {
-        newseq=seq;
-        seq_copied=true;
-        it2=newseq.end()-1;
-        it1=it2-1;
-    }
-    while (seq_copied && (newseq.size()>=2) &&
-           is_ex_exactly_of_type((*it1).rest,numeric) &&
-           ex_to_numeric((*it1).coeff).is_equal(numONE()) &&
-           is_ex_exactly_of_type((*it2).rest,numeric) &&
-           ex_to_numeric((*it2).coeff).is_equal(numONE()) ) {
-        *it1=expair(ex_to_numeric((*it1).rest).mul_dyn(ex_to_numeric((*it2).rest)),exONE());
-        newseq.pop_back();
-        it2=newseq.end()-1;
-        it1=it2-1;
-    }
-
-    // *(...,x,1) -> *(...,x)
-    if ((!seq_copied) && (seq_size>=1) &&
-        (is_ex_exactly_of_type(last_expair.rest,numeric)) &&
-        (ex_to_numeric(last_expair.rest).compare(numONE())==0)) {
-        newseq=seq;
-        seq_copied=true;
-        it2=newseq.end()-1;
-    }
-    if (seq_copied && (newseq.size()>=1) &&
-        (is_ex_exactly_of_type((*it2).rest,numeric)) &&
-        (ex_to_numeric((*it2).rest).compare(numONE())==0)) {
-        newseq.pop_back();
-        it2=newseq.end()-1;
-    }
-
-    // *(...,x,0) -> 0
-    if ((!seq_copied) && (seq_size>=1) &&
-        (is_ex_exactly_of_type(last_expair.rest,numeric)) &&
-        (ex_to_numeric(last_expair.rest).is_zero())) {
-        return exZERO();
-    }
-    if (seq_copied && (newseq.size()>=1) &&
-        (is_ex_exactly_of_type((*it2).rest,numeric)) &&
-        (ex_to_numeric((*it2).rest).is_zero())) {
-        return exZERO();
-    }
-
-    // *(+(x,y,...),c) -> +(*(x,c),*(y,c),...) (c numeric(), no powers of +())
-    if ((!seq_copied) && (seq_size==2) &&
-        is_ex_exactly_of_type(next_to_last_expair.rest,add) &&
-        is_ex_exactly_of_type(last_expair.rest,numeric) &&
-        ex_to_numeric(last_expair.coeff).is_equal(numONE()) &&
-        (ex_to_numeric(next_to_last_expair.coeff).compare(numONE())==0)) {
-        add const & addref=ex_to_add(next_to_last_expair.rest);
-        epvector distrseq;
-        distrseq.reserve(addref.seq.size());
-        for (epvector::const_iterator cit=addref.seq.begin(); cit!=addref.seq.end(); ++cit) {
-            distrseq.push_back(addref.combine_pair_with_coeff_to_pair(*cit,
-                                   last_expair.rest));
-        }
-        // special treatment for the last element if it is numeric (to
-        // avoid terms like (2/3)*(3/2)) is no longer necessary, this
-        // is handled in add::combine_pair_with_coeff_to_pair()
-        return (new add(distrseq,1))->setflag(status_flags::dynallocated  |
-                                              status_flags::evaluated );
-    }
-    if (seq_copied && (newseq.size()==2) &&
-        is_ex_exactly_of_type(newseq[0].rest,add) &&
-        is_ex_exactly_of_type(newseq[1].rest,numeric) &&
-        ex_to_numeric(newseq[1].coeff).is_equal(numONE()) &&
-        (ex_to_numeric(newseq[0].coeff).compare(numONE())==0)) {
-        add const & addref=ex_to_add(newseq[0].rest);
-        epvector distrseq;
-        distrseq.reserve(addref.seq.size());
-        for (epvector::const_iterator cit=addref.seq.begin(); cit!=addref.seq.end(); ++cit) {
-            distrseq.push_back(addref.combine_pair_with_coeff_to_pair(*cit,
-                                   newseq[1].rest));
-        }
-        // special treatment for the last element if it is numeric (to
-        // avoid terms like (2/3)*(3/2)) is no longer necessary, this
-        // is handled in add::combine_pair_with_coeff_to_pair()
-        return (new add(distrseq,1))->setflag(status_flags::dynallocated  |
-                                              status_flags::evaluated );
-    }
-    
-    // *() -> 1
-    if ((!seq_copied) && (seq_size==0)) {
-        return exONE();
-    } else if (seq_copied && (newseq.size()==0)) {
-        return exONE();
-    }
-
-    // *(x) -> x
-    if ((!seq_copied) && (seq_size==1)) {
-        return recombine_pair_to_ex(*(seq.begin()));
-    } else if (seq_copied && (newseq.size()==1)) {
-        return recombine_pair_to_ex(*(newseq.begin()));
-    }
-
-    if (!seq_copied) return this->hold();
-
-    return (new mul(newseq,1))->setflag(status_flags::dynallocated  |
-                                        status_flags::evaluated );
-}
-*/
-
 ex mul::eval(int level) const
 {
     // simplifications  *(...,x;0) -> 0
@@ -536,79 +315,6 @@ ex mul::eval(int level) const
     return this->hold();
 }
 
-/*
-ex mul::eval(int level) const
-{
-    // simplifications: *(...,x,c1,c2) -> *(...,x,c1*c2) (c1, c2 numeric())
-    //                  *(...,(c1,c2)) -> (...,(c1^c2,1)) (normalize)
-    //                  *(...,x,1) -> +(...,x)
-    //                  *(...,x,0) -> 0
-    //                  *(+(x,y,...),c) -> *(+(*(x,c),*(y,c),...)) (c numeric())
-    //                  *(x) -> x
-    //                  *() -> 1
-
-    debugmsg("mul eval",LOGLEVEL_MEMBER_FUNCTION);
-
-    epvector newseq=seq;
-    epvector::iterator it1,it2;
-    
-    // *(...,x,c1,c2) -> *(...,x,c1*c2) (c1, c2 numeric())
-    it2=newseq.end()-1;
-    it1=it2-1;
-    while ((newseq.size()>=2)&&is_exactly_of_type(*(*it1).rest.bp,numeric)&&
-                               is_exactly_of_type(*(*it2).rest.bp,numeric)) {
-        *it1=expair(ex_to_numeric((*it1).rest).power(ex_to_numeric((*it1).coeff))
-                    .mul(ex_to_numeric((*it2).rest).power(ex_to_numeric((*it2).coeff))),exONE());
-        newseq.pop_back();
-        it2=newseq.end()-1;
-        it1=it2-1;
-    }
-
-    if ((newseq.size()>=1)&&is_exactly_of_type(*(*it2).rest.bp,numeric)) {
-        // *(...,(c1,c2)) -> (...,(c1^c2,1)) (normalize)
-        *it2=expair(ex_to_numeric((*it2).rest).power(ex_to_numeric((*it2).coeff)),exONE());
-        // *(...,x,1) -> *(...,x)
-        if (static_cast<numeric &>(*(*it2).rest.bp).compare(numONE())==0) {
-            newseq.pop_back();
-            it2=newseq.end()-1;
-        }
-    }
-
-    // *(...,x,0) -> 0
-    if ((newseq.size()>=1)&&is_exactly_of_type(*(*it2).rest.bp,numeric)) {
-        if (static_cast<numeric &>(*(*it2).rest.bp).is_zero()==0) {
-            return exZERO();
-        }
-    }
-
-    // *(+(x,y,...),c) -> +(*(x,c),*(y,c),...) (c numeric(), no powers of +())
-    if ((newseq.size()==2)&&is_ex_exactly_of_type(newseq[0].rest,add)&&
-        is_ex_exactly_of_type(newseq[1].rest,numeric)&&
-        (ex_to_numeric(newseq[0].coeff).compare(numONE())==0)) {
-        add const & addref=ex_to_add(newseq[0].rest);
-        numeric const & numref=ex_to_numeric(newseq[1].rest);
-        epvector distrseq;
-        distrseq.reserve(addref.seq.size());
-        for (epvector::const_iterator cit=addref.seq.begin(); cit!=addref.seq.end(); ++cit) {
-            distrseq.push_back(expair((*cit).rest,ex_to_numeric((*cit).coeff).mul(numref)));
-        }
-        return (new add(distrseq,1))->setflag(status_flags::dynallocated  |
-                                              status_flags::evaluated );
-    }
-    
-    if (newseq.size()==0) {
-        // *() -> 1
-        return exONE();
-    } else if (newseq.size()==1) {
-        // *(x) -> x
-        return recombine_pair_to_ex(*newseq.begin());
-    }
-
-    return (new mul(newseq,1))->setflag(status_flags::dynallocated  |
-                                        status_flags::evaluated );
-}
-*/
-
 exvector mul::get_indices(void) const
 {
     // return union of indices of factors
@@ -895,66 +601,6 @@ ex mul::expand(unsigned options) const
                                         status_flags::expanded);
 }
 
-/*
-ex mul::expand(unsigned options) const
-{
-    exvector sub_expanded_seq;
-    intvector positions_of_adds;
-    intvector number_of_add_operands;
-
-    sub_expanded_seq.resize(seq.size());
-    positions_of_adds.resize(seq.size());
-    number_of_add_operands.reserve(seq.size());
-
-    int number_of_adds=0;
-    int number_of_expanded_terms=1;
-    for (unsigned current_position=0; current_position<seq.size(); current_position++) {
-        ex const & expanded_ex=recombine_pair_to_ex(seq[current_position]).expand(options);
-        if (is_ex_exactly_of_type(expanded_ex,add)) {
-            positions_of_adds[number_of_adds]=current_position;
-            add const & expanded_addref=ex_to_add(expanded_ex);
-            number_of_add_operands[number_of_adds]=expanded_addref.seq.size();
-            number_of_expanded_terms *= expanded_addref.seq.size();
-            number_of_adds++;
-        }
-        sub_expanded_seq.push_back(expanded_ex);
-    }
-
-    exvector distrseq;
-    distrseq.reserve(number_of_expanded_terms);
-
-    intvector k;
-    k.resize(number_of_adds);
-    
-    int l;
-    for (l=0; l<number_of_adds; l++) {
-        k[l]=0;
-    }
-
-    while (1) {
-        exvector term;
-        term=sub_expanded_seq;
-        for (l=0; l<number_of_adds; l++) {
-            add const & addref=ex_to_add(sub_expanded_seq[positions_of_adds[l]]);
-            term[positions_of_adds[l]]=addref.recombine_pair_to_ex(addref.seq[k[l]]);
-        }
-        distrseq.push_back((new mul(term))->setflag(status_flags::dynallocated |
-                                                    status_flags::expanded));
-
-        // increment k[]
-        l=number_of_adds-1;
-        while ((l>=0)&&((++k[l])>=number_of_add_operands[l])) {
-            k[l]=0;    
-            l--;
-        }
-        if (l<0) break;
-    }
-
-    return (new add(distrseq))->setflag(status_flags::dynallocated |
-                                        status_flags::expanded);
-}
-*/
-
 //////////
 // new virtual functions which can be overridden by derived classes
 //////////