- if (x2.is_zero()) {
- return _ex0;
- }
- else {
- if (x2.info(info_flags::numeric) && (!x2.info(info_flags::crational)))
- return Li_num(ex_to<numeric>(x1).to_int(), ex_to<numeric>(x2));
- if (is_a<lst>(x2)) {
- for (int i=0; i<x2.nops(); i++) {
- if (!is_a<numeric>(x2.op(i))) {
- return Li(x1,x2).hold();
+ if (m_.nops() < 2) {
+ ex m;
+ if (is_a<lst>(m_)) {
+ m = m_.op(0);
+ } else {
+ m = m_;
+ }
+ ex x;
+ if (is_a<lst>(x_)) {
+ x = x_.op(0);
+ } else {
+ x = x_;
+ }
+ if (x == _ex0) {
+ return _ex0;
+ }
+ if (x == _ex1) {
+ return zeta(m);
+ }
+ if (x == _ex_1) {
+ return (pow(2,1-m)-1) * zeta(m);
+ }
+ if (m == _ex1) {
+ return -log(1-x);
+ }
+ if (m.info(info_flags::posint) && x.info(info_flags::numeric) && (!x.info(info_flags::crational))) {
+ return Li_num(ex_to<numeric>(m).to_int(), ex_to<numeric>(x));
+ }
+ } else {
+ bool ish = true;
+ bool iszeta = true;
+ bool iszero = false;
+ bool doevalf = false;
+ bool doevalfveto = true;
+ const lst& m = ex_to<lst>(m_);
+ const lst& x = ex_to<lst>(x_);
+ lst::const_iterator itm = m.begin();
+ lst::const_iterator itx = x.begin();
+ for (; itm != m.end(); itm++, itx++) {
+ if (!(*itm).info(info_flags::posint)) {
+ return Li(m_, x_).hold();
+ }
+ if ((*itx != _ex1) && (*itx != _ex_1)) {
+ if (itx != x.begin()) {
+ ish = false;