X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Finifcns.cpp;h=6c277c253b826ce9ba73e8f78138146081ccb4ec;hp=89a3bcbffc61f7f50023efc8df885d79acdf79d5;hb=052d2da5b41ac82855d3578050125aa21caf1003;hpb=82df718524319471d3a92fb051329aa8cd529c22 diff --git a/ginac/inifcns.cpp b/ginac/inifcns.cpp index 89a3bcbf..6c277c25 100644 --- a/ginac/inifcns.cpp +++ b/ginac/inifcns.cpp @@ -3,7 +3,7 @@ * Implementation of GiNaC's initially known functions. */ /* - * GiNaC Copyright (C) 1999-2015 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2022 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -109,7 +109,6 @@ static bool func_arg_info(const ex & arg, unsigned inf) case info_flags::prime: case info_flags::crational_polynomial: case info_flags::rational_function: - case info_flags::algebraic: case info_flags::positive: case info_flags::negative: case info_flags::nonnegative: @@ -1039,6 +1038,29 @@ REGISTER_FUNCTION(Order, eval_func(Order_eval). // Solve linear system ////////// +class symbolset { + exset s; + void insert_symbols(const ex &e) + { + if (is_a(e)) { + s.insert(e); + } else { + for (const ex &sube : e) { + insert_symbols(sube); + } + } + } +public: + explicit symbolset(const ex &e) + { + insert_symbols(e); + } + bool has(const ex &e) const + { + return s.find(e) != s.end(); + } +}; + ex lsolve(const ex &eqns, const ex &symbols, unsigned options) { // solve a system of linear equations @@ -1054,20 +1076,20 @@ ex lsolve(const ex &eqns, const ex &symbols, unsigned options) } // syntax checks - if (!eqns.info(info_flags::list)) { - throw(std::invalid_argument("lsolve(): 1st argument must be a list or an equation")); + if (!(eqns.info(info_flags::list) || eqns.info(info_flags::exprseq))) { + throw(std::invalid_argument("lsolve(): 1st argument must be a list, a sequence, or an equation")); } for (size_t i=0; i(symbols.op(c)),1); linpart -= co*symbols.op(c); sys(r,c) = co; @@ -1089,11 +1114,13 @@ ex lsolve(const ex &eqns, const ex &symbols, unsigned options) } // test if system is linear and fill vars matrix + const symbolset sys_syms(sys); + const symbolset rhs_syms(rhs); for (size_t i=0; i