In FriCAS the Risch algorithm is split into two stages, a preparatory one where the integrand is rewritten to express it in terms of differential fields, and the core part. In the preparatory stage, to obtain a theoretically correct result, FriCAS should find a transcendental basis of constants needed to express the integral. Currently no algorithm is known to achieve this without extra assumptions. For elementary constants one can give an efficient solution assuming that the Schanuel conjecture holds. FriCAS contains code handling the transcendental part of this: it can discover algebraic dependencies between transcendental elementary functions provided that it can decide correctly if constants are zero or not. For transcendental elementary constants, it can discover algebraic dependencies provided that the Schanuel conjecture holds. FriCAS is currently not equipped to handle dependencies between algebraic expressions (roots of polynomials). The core integrator should be complete for purely transcendental functions. In the past there were gaps in the transcendental part, but the offending code was rewritten in 2014 to eliminate all known reasons for incompleteness. For integrands involving algebraic quantities the situation is more complicated. If the highest rank kernel is transcendental FriCAS can still use the main part of the transcendental algorithm, but gaps exist in auxiliary routines. More precisely, the extended integration routine is implemented for two cases only: if the algebraic extension involves a single root, and if the integrand is purely algebraic. The solver for the Risch differential equation can only handle the purely algebraic case. The logarithmic derivative problem is unimplemented in the algebraic case. If the highest rank kernel is algebraic then FriCAS can apply Hermite reduction. It can find the logarithmic part only in the purely algebraic case. Otherwise, if Hermite reduction does not already yield the integral, FriCAS cannot solve it. Also, in the purely algebraic case there are restrictions on the Trager resultant: in general FriCAS can only handle resultants having a single nonlinear factor, this factor being moreover required to possess a nonzero coefficient in front of the second highest power of the indeterminate (the so called trace-0 case is excluded). In the case of hitting an unimplemented part of the Risch algorithm, FriCAS signals an error. So getting back an unevaluated integral means that FriCAS claims the integral to be nonelementary. The implementation of the Risch algorithm in FriCAS features several shortcuts enabling it to solve some integrals not handled by the main part. The shortcuts together with the implemented part cover many typical examples of elementary functions, but in fact a large part of the Risch algorithm dealing with algebraic extensions remains unimplemented. In FriCAS, the Risch algorithm is generalized so that besides logarithms an integrand may contain Liouvillean functions. The transcendental part of the algorithm should be complete for such functions, but in the preparatory stage all Liouvillean functions are currently assumed to be algebraically independent. FriCAS can express an integral not only in terms of elementary functions but also in terms of exponential integrals, error functions, incomplete Gamma functions, and polylogarithms. For the exponential integral, error function, and incomplete Gamma function, a complete algorithm exists in theory, but the current implementation in FriCAS has several gaps. |