I am using sagemath 10.6 and giac 2.0, all installed using pacman package manager on arch based linux (CachyOS).
Sometimes, I noticed call to integrate with giac as algorithm gives SignalError: Segmentation fault
from call to libgiac.integrate(Pygen(expression), v)
But it is random when it happens. Also, when Segmentation fault do not show, the result returned is not evaluated. i.e. integral is not solved.
When I try the same exact integral in giac itself, it solves it each time. I just change I
to i
for giac. This is the complex number sqrt(-1).
It seems to me there is a problem in the interface to giac in sagemath 10.6. I do not know if it is due to packing using pacman arch linux or not. I do not build giac nor sagemath from source anymore. Just use pacman -S
command to install everything.
Below I give example of one such case. First this is the version information
sudo pacman -Qi sagemath
Version : 10.6-6.2
Required By : sagemath-giac
>sudo pacman -Qi giac
Installed From : cachyos-extra-znver4
Name : giac
Version : 2.0.0.10-4.1
Here is an example
>sage
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 10.6, Release Date: 2025-03-31 │
│ Using Python 3.13.5. Type "help()" for help. │
└────────────────────────────────────────────────────────────────────┘
sage: var('x d c a')
(x, d, c, a)
sage: integrate(tan(d*x+c)^(4/3)/(a+I*a*tan(d*x+c))^(1/2),x,algorithm="giac")
Degree mismatch inside factorisation over extension
Warning, need to choose a branch for the root of a polynomial with parameters. This might be wrong.
The choice was done assuming [sageVARa,tan(sageVARd*sageVARx+sageVARc)]=[-74,81]
Precision problem choosing root in common_EXT, current precision 14
Precision problem choosing root in common_EXT, current precision 28
Precision problem choosing root in common_EXT, current precision 56
Precision problem choosing root in common_EXT, current precision 112
Precision problem choosing root in common_EXT, current precision 224
Precision problem choosing root in common_EXT, current precision 448
Precision problem choosing root in common_EXT, current precision 896
Unable to transpose Error: Bad Argument Value
integrate(tan(d*x + c)^(4/3)/sqrt(I*a*tan(d*x + c) + a), x)
sage: integrate(tan(d*x+c)^(4/3)/(a+I*a*tan(d*x+c))^(1/2),x,algorithm="giac")
Degree mismatch inside factorisation over extension
Warning, need to choose a branch for the root of a polynomial with parameters. This might be wrong.
The choice was done assuming [sageVARa,tan(sageVARd*sageVARx+sageVARc)]=[-27,57]
Precision problem choosing root in common_EXT, current precision 14
Precision problem choosing root in common_EXT, current precision 28
Precision problem choosing root in common_EXT, current precision 56
Precision problem choosing root in common_EXT, current precision 112
Precision problem choosing root in common_EXT, current precision 224
Precision problem choosing root in common_EXT, current precision 448
Precision problem choosing root in common_EXT, current precision 896
---------------------------------------------------------------------------
SignalError Traceback (most recent call last)
Cell In[7], line 1
----> 1 integrate(tan(d*x+c)**(Integer(4)/Integer(3))/(a+I*a*tan(d*x+c))**(Integer(1)/Integer(2)),x,algorithm="giac")
File /usr/lib/python3.13/site-packages/sage/misc/functional.py:789, in integral(x, *args, **kwds)
650 """
651 Return an indefinite or definite integral of an object ``x``.
652
(...) 786 0
787 """
788 if hasattr(x, 'integral'):
--> 789 return x.integral(*args, **kwds)
790 else:
791 from sage.symbolic.ring import SR
File /usr/lib/python3.13/site-packages/sage/symbolic/expression.pyx:13229, in sage.symbolic.expression.Expression.integral (build/cythonized/sage/symbolic/expression.cpp:109379)()
13227 R = SR
13228 return R(integral(f, v, a, b, **kwds))
> 13229 return integral(self, *args, **kwds)
13230
13231 integrate = integral
File /usr/lib/python3.13/site-packages/sage/symbolic/integration/integral.py:1107, in integrate(expression, v, a, b, algorithm, hold)
1105 if not integrator:
1106 raise ValueError("Unknown algorithm: %s" % algorithm)
-> 1107 return integrator(expression, v, a, b)
1108 if a is None:
1109 return indefinite_integral(expression, v, hold=hold)
File /usr/lib/python3.13/site-packages/sage/symbolic/integration/external.py:263, in libgiac_integrator(expression, v, a, b)
259 # We call Pygen on first argument because otherwise some
260 # expressions involving derivatives result in doctest failures in
261 # sage/interfaces/sympy.py
262 if a is None:
--> 263 result = libgiac.integrate(Pygen(expression), v)
264 else:
265 result = libgiac.integrate(Pygen(expression), v, a, b)
File giac.pyx:1929, in giac.GiacFunction.__call__()
File giac.pyx:1083, in giac.Pygen.__call__()
SignalError: Segmentation fault
I found that the crash do not happen each time. If I call maxima between, this will most likely cause the crash to happen next time calling giac. But if I try the same integrate call, I will always get the crash.
The same integral works OK using giac directly. Here is example. I just changed I
to i
giac
// Using locale /usr/share/locale/
// en_US.UTF-8
// /usr/share/locale/
// giac
// UTF-8
// Maximum number of parallel threads 32
Added 26 synonyms
Reading from cache /usr/share/giac/doc/en/
get_index_from_cache /usr/share/giac/doc/en/html_mtt OK
// Read 1243 entries from cache /usr/share/giac/doc/en/html_mtt
get_index_from_cache /usr/share/giac/doc/en/html_mall OK
// Read 1528 entries from cache /usr/share/giac/doc/en/html_mall
// Read 1057 entries from cache /usr/share/giac/doc/en/html_vall
Welcome to giac readline interface, version 2.0.0
(c) 2002,2023 B. Parisse & others
Homepage https://www-fourier.univ-grenoble-alpes.fr/~parisse/giac.html
Released under the GPL license 3.0 or above
See http://www.gnu.org for license details
May contain BSD licensed software parts (lapack, atlas, tinymt)
-------------------------------------------------
Press CTRL and D simultaneously to finish session
Type ?commandname for help
*** Type xcas to launch a light version of Xcas ***
0>> i*i
-1
// Time 0
1>> int(tan(d*x+c)^(4/3)/(a+i*a*tan(d*x+c))^(1/2),x)
-36*d*1/36/d^2*tan(c+d*x)^(1/3)*sqrt(2*a*sqrt(tan(c+d*x)^2+1)+2*a)/2*(1+i*a*tan(c+d*x)/(a+sqrt(a^2*tan(c+d*x)^2+a^2)))/(i*a*tan(c+d*x)+a)+integrate(3*(30*d*1/36/d^2+d*1/2/d/a/(-d*(-i)/a*tan(c+d*x)-d/a))/sqrt(2*a*sqrt(tan(c+d*x)^2+1)+2*a)*2/(1+i*a*tan(c+d*x)/(a+sqrt(a^2*tan(c+d*x)^2+a^2)))/3*(tan(c+d*x)^(1/3))^-2*d*(1+tan(c+d*x)^2),x)
// Time 0.05
2>> int(tan(d*x+c)^(4/3)/(a+i*a*tan(d*x+c))^(1/2),x)
-36*d*1/36/d^2*tan(c+d*x)^(1/3)*sqrt(2*a*sqrt(tan(c+d*x)^2+1)+2*a)/2*(1+i*a*tan(c+d*x)/(a+sqrt(a^2*tan(c+d*x)^2+a^2)))/(i*a*tan(c+d*x)+a)+integrate(3*(30*d*1/36/d^2+d*1/2/d/a/(-d*(-i)/a*tan(c+d*x)-d/a))/sqrt(2*a*sqrt(tan(c+d*x)^2+1)+2*a)*2/(1+i*a*tan(c+d*x)/(a+sqrt(a^2*tan(c+d*x)^2+a^2)))/3*(tan(c+d*x)^(1/3))^-2*d*(1+tan(c+d*x)^2),x)
// Time 0.05
3>> int(tan(d*x+c)^(4/3)/(a+i*a*tan(d*x+c))^(1/2),x)
-36*d*1/36/d^2*tan(c+d*x)^(1/3)*sqrt(2*a*sqrt(tan(c+d*x)^2+1)+2*a)/2*(1+i*a*tan(c+d*x)/(a+sqrt(a^2*tan(c+d*x)^2+a^2)))/(i*a*tan(c+d*x)+a)+integrate(3*(30*d*1/36/d^2+d*1/2/d/a/(-d*(-i)/a*tan(c+d*x)-d/a))/sqrt(2*a*sqrt(tan(c+d*x)^2+1)+2*a)*2/(1+i*a*tan(c+d*x)/(a+sqrt(a^2*tan(c+d*x)^2+a^2)))/3*(tan(c+d*x)^(1/3))^-2*d*(1+tan(c+d*x)^2),x)
// Time 0.05
4>> int(tan(d*x+c)^(4/3)/(a+i*a*tan(d*x+c))^(1/2),x)
-36*d*1/36/d^2*tan(c+d*x)^(1/3)*sqrt(2*a*sqrt(tan(c+d*x)^2+1)+2*a)/2*(1+i*a*tan(c+d*x)/(a+sqrt(a^2*tan(c+d*x)^2+a^2)))/(i*a*tan(c+d*x)+a)+integrate(3*(30*d*1/36/d^2+d*1/2/d/a/(-d*(-i)/a*tan(c+d*x)-d/a))/sqrt(2*a*sqrt(tan(c+d*x)^2+1)+2*a)*2/(1+i*a*tan(c+d*x)/(a+sqrt(a^2*tan(c+d*x)^2+a^2)))/3*(tan(c+d*x)^(1/3))^-2*d*(1+tan(c+d*x)^2),x)
// Time 0.06
5>>
Does this happen on sagemath 10.6 build directly from source using giac 2.0 for others?
Thanks
--NasserUpdate
Here are more problems with the giac interface. DId not know if I should post separate question on this or not.
(A) Noticed sagemath hangs on call to giac integrate. But using giac, it returns evaluated instantly.
>sage
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 10.6, Release Date: 2025-03-31 │
│ Using Python 3.13.5. Type "help()" for help. │
└────────────────────────────────────────────────────────────────────┘
sage: var('a b c x')
(a, b, c, x)
sage: integrate(x^(3/2)*(b*x+a)^(3/2)*(-b*c*x+a*c)^(3/2),x, algorithm="giac")
Hangs.
Now using giac directly on same PC
>giac
Welcome to giac readline interface, version 2.0.0
0>> int(x^(3/2)*(b*x+a)^(3/2)*(-b*c*x+a*c)^(3/2),x)
integrate((-2*b^2*c*x^4*sqrt(-b^2*c*x^2+a^2*c)+2*a^2*c*x^2*sqrt(-b^2*c*x^2+a^2*c))/2*(sqrt(x))^-1,x)
// Time 0.04
1>>
You see., It took only 0.04 seconds. So why does sagemath hang?
(B) Integrals which works ok in giac directly but gives
NotImplementedError: Unable to parse Giac output: -2*atan(i)+2*i-2*(sqrt(2*(sageVARx+1)^-1-1)-atan(sqrt(2*(sageVARx+1)^-1-1)))
in sagemath
sage
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 10.6, Release Date: 2025-03-31 │
│ Using Python 3.13.5. Type "help()" for help. │
└────────────────────────────────────────────────────────────────────┘
sage: var('a b c x d')
(a, b, c, x, d)
sage: integrate((-x^2+1)^(1/2)/(1+x)^2,x, algorithm="giac")
Warning, integration of abs or sign assumes constant sign by intervals (correct if the argument is real):
Check [abs(t_nostep)]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
File giac.pyx:1519, in giac.Pygen._symbolic_()
File /usr/lib/python3.13/site-packages/sage/calculus/calculus.py:2618, in symbolic_expression_from_string(s, syms, accept_sequence, parser)
2616 parser._callable_constructor().set_names({k[0]: v for k, v in syms.items()
2617 if _is_function(v)})
-> 2618 return parse_func(s)
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:573, in sage.misc.parser.Parser.parse_sequence (build/cythonized/sage/misc/parser.c:7623)()
572
--> 573 cpdef parse_sequence(self, s):
574 """
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:590, in sage.misc.parser.Parser.parse_sequence (build/cythonized/sage/misc/parser.c:7418)()
589 cdef Tokenizer tokens = Tokenizer(s)
--> 590 all = self.p_sequence(tokens)
591 if tokens.next() != EOS:
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:663, in sage.misc.parser.Parser.p_sequence (build/cythonized/sage/misc/parser.c:8449)()
662 else:
--> 663 obj = self.p_eqn(tokens)
664 PyList_Append(all, obj)
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:754, in sage.misc.parser.Parser.p_eqn (build/cythonized/sage/misc/parser.c:9590)()
753 """
--> 754 lhs = self.p_expr(tokens)
755 cdef int op = tokens.next()
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:795, in sage.misc.parser.Parser.p_expr (build/cythonized/sage/misc/parser.c:10036)()
794 cdef int op
--> 795 operand1 = self.p_term(tokens)
796 op = tokens.next()
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:830, in sage.misc.parser.Parser.p_term (build/cythonized/sage/misc/parser.c:10404)()
829 cdef int op
--> 830 operand1 = self.p_factor(tokens)
831 op = tokens.next()
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:870, in sage.misc.parser.Parser.p_factor (build/cythonized/sage/misc/parser.c:10901)()
869 elif token == c'-':
--> 870 return -self.p_factor(tokens)
871 else:
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:873, in sage.misc.parser.Parser.p_factor (build/cythonized/sage/misc/parser.c:10937)()
872 tokens.backtrack()
--> 873 return self.p_power(tokens)
874
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:901, in sage.misc.parser.Parser.p_power (build/cythonized/sage/misc/parser.c:11188)()
900 """
--> 901 operand1 = self.p_atom(tokens)
902 cdef int token = tokens.next()
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:967, in sage.misc.parser.Parser.p_atom (build/cythonized/sage/misc/parser.c:12032)()
966 elif token == c'(':
--> 967 expr = self.p_expr(tokens)
968 token = tokens.next()
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:795, in sage.misc.parser.Parser.p_expr (build/cythonized/sage/misc/parser.c:10036)()
794 cdef int op
--> 795 operand1 = self.p_term(tokens)
796 op = tokens.next()
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:836, in sage.misc.parser.Parser.p_term (build/cythonized/sage/misc/parser.c:10488)()
835 while op == c'*' or op == c'/':
--> 836 operand2 = self.p_factor(tokens)
837 if op == c'*':
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:873, in sage.misc.parser.Parser.p_factor (build/cythonized/sage/misc/parser.c:10937)()
872 tokens.backtrack()
--> 873 return self.p_power(tokens)
874
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:901, in sage.misc.parser.Parser.p_power (build/cythonized/sage/misc/parser.c:11188)()
900 """
--> 901 operand1 = self.p_atom(tokens)
902 cdef int token = tokens.next()
File /usr/lib/python3.13/site-packages/sage/misc/parser.pyx:962, in sage.misc.parser.Parser.p_atom (build/cythonized/sage/misc/parser.c:11952)()
961 self.parse_error(tokens, "Bad function call")
--> 962 return func(*args, **kwds)
963 else:
File /usr/lib/python3.13/site-packages/sage/symbolic/function.pyx:1046, in sage.symbolic.function.BuiltinFunction.__call__ (build/cythonized/sage/symbolic/function.c:14333)()
1045 if res is None:
-> 1046 res = super().__call__(
1047 *args, coerce=coerce, hold=hold)
File /usr/lib/python3.13/site-packages/sage/symbolic/function.pyx:552, in sage.symbolic.function.Function.__call__ (build/cythonized/sage/symbolic/function.c:9262)()
551
--> 552 return call_registered_function(self._serial, self._nargs, args, hold,
553 not symbolic_input, SR)
File /usr/lib/python3.13/site-packages/sage/symbolic/pynac_function_impl.pxi:1, in sage.symbolic.expression.call_registered_function (build/cythonized/sage/symbolic/expression.cpp:126366)()
----> 1 cpdef call_registered_function(unsigned serial,
2 int nargs,
File /usr/lib/python3.13/site-packages/sage/symbolic/pynac_function_impl.pxi:49, in sage.symbolic.expression.call_registered_function (build/cythonized/sage/symbolic/expression.cpp:125983)()
48 elif nargs == 1:
---> 49 res = g_function_eval1(serial,
50 (<Expression>args[0])._gobj, hold)
ValueError: atan_eval(): logarithmic pole
During handling of the above exception, another exception occurred:
NotImplementedError Traceback (most recent call last)
Cell In[2], line 1
----> 1 integrate((-x**Integer(2)+Integer(1))**(Integer(1)/Integer(2))/(Integer(1)+x)**Integer(2),x, algorithm="giac")
File /usr/lib/python3.13/site-packages/sage/misc/functional.py:789, in integral(x, *args, **kwds)
650 """
651 Return an indefinite or definite integral of an object ``x``.
652
(...) 786 0
787 """
788 if hasattr(x, 'integral'):
--> 789 return x.integral(*args, **kwds)
790 else:
791 from sage.symbolic.ring import SR
File /usr/lib/python3.13/site-packages/sage/symbolic/expression.pyx:13229, in sage.symbolic.expression.Expression.integral (build/cythonized/sage/symbolic/expression.cpp:109379)()
13227 R = SR
13228 return R(integral(f, v, a, b, **kwds))
> 13229 return integral(self, *args, **kwds)
13230
13231 integrate = integral
File /usr/lib/python3.13/site-packages/sage/symbolic/integration/integral.py:1107, in integrate(expression, v, a, b, algorithm, hold)
1105 if not integrator:
1106 raise ValueError("Unknown algorithm: %s" % algorithm)
-> 1107 return integrator(expression, v, a, b)
1108 if a is None:
1109 return indefinite_integral(expression, v, hold=hold)
File /usr/lib/python3.13/site-packages/sage/symbolic/integration/external.py:269, in libgiac_integrator(expression, v, a, b)
267 return expression.integrate(v, a, b, hold=True)
268 else:
--> 269 return result.sage()
File giac.pyx:1473, in giac.Pygen.sage()
File /usr/lib/python3.13/site-packages/sage/structure/parent.pyx:900, in sage.structure.parent.Parent.__call__ (build/cythonized/sage/structure/parent.c:11514)()
898 if mor is not None:
899 if no_extra_args:
--> 900 return mor._call_(x)
901 else:
902 return mor._call_with_args(x, args, kwds)
File /usr/lib/python3.13/site-packages/sage/structure/coerce_maps.pyx:293, in sage.structure.coerce_maps.NamedConvertMap._call_ (build/cythonized/sage/structure/coerce_maps.c:8162)()
291 raise TypeError(f"cannot coerce {x} to {C}")
292 cdef Map m
--> 293 cdef Element e = method(C)
294 if e is None:
295 raise RuntimeError("BUG in coercion model: {} method of {} returned None".format(self.method_name, type(x)))
File giac.pyx:1525, in giac.Pygen._symbolic_()
NotImplementedError: Unable to parse Giac output: -(2*atan(i)-2*i)*sign((sageVARx+1)^-1)-2*(sqrt(2*(sageVARx+1)^-1-1)*sign((sageVARx+1)^-1)-atan(sqrt(2*(sageVARx+1)^-1-1))*sign((sageVARx+1)^-1))
sage:
In giac, same integral gives
6>> int((-x^2+1)^(1/2)/(1+x)^2,x)
4/(-1-1/2*(-2*sqrt(-x^2+1)+2)/x)-asin(x)
// Time 0.01
I do not understand the above at all. giac returns 4/(-1-1/2*(-2*sqrt(-x^2+1)+2)/x)-asin(x)
then why does sagemath says at the end above
Unable to parse Giac output: -(2*atan(i)-2*i)*sign((sageVARx+1)^-1)-2*(sqrt(2*(sageVARx+1)^-1-1)*sign((sageVARx+1)^-1)-atan(sqrt(2*(sageVARx+1)^-1-1))*sign((sageVARx+1)^-1))
There is not even atan
in giac result. Also there is no sign
function in giac result.
I have many more examples. But the above is enough for now., something seems very wrong in the interface. May be it has to do with using Arch linux packages, I do not know.