Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit 61572c9

Browse files
committed
16671: swap arguments wrt maxima(_lib); add more documentation
1 parent 5310ca1 commit 61572c9

File tree

3 files changed

+64
-4
lines changed

3 files changed

+64
-4
lines changed

src/sage/calculus/calculus.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,8 @@ def _inverse_laplace_latex_(self, *args):
17521752

17531753
maxima_hyper = re.compile("\%f\[\d+,\d+\]") # matches %f[m,n]
17541754

1755+
maxima_harmonic = re.compile("gen_harmonic_number\(([^,]+),([^,]+)\)")
1756+
17551757
def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
17561758
"""
17571759
Given a string representation of a Maxima expression, parse it and
@@ -1888,7 +1890,8 @@ def symbolic_expression_from_maxima_string(x, equals_sub=False, maxima=maxima):
18881890

18891891
s = polylog_ex.sub('polylog(\\1,', s)
18901892
s = maxima_polygamma.sub('psi(\g<1>,', s) # this replaces psi[n](foo) with psi(n,foo), ensuring that derivatives of the digamma function are parsed properly below
1891-
1893+
s = maxima_harmonic.sub('gen_harmonic_number(\\2,\\1)', s) # swap arguments of gen_harmonic_number
1894+
18921895
if equals_sub:
18931896
s = s.replace('=','==')
18941897
# unfortunately, this will turn != into !==, which we correct

src/sage/functions/log.py

+42-2
Original file line numberDiff line numberDiff line change
@@ -801,11 +801,24 @@ class Function_harmonic_number_generalized(BuiltinFunction):
801801
802802
Evaluation of integer, rational, or complex argument::
803803
804-
sage:
804+
sage: harmonic_number(5)
805+
137/60
806+
sage: harmonic_number(3,3)
807+
251/216
808+
sage: harmonic_number(5/2)
809+
-2*log(2) + 46/15
810+
sage: harmonic_number(5/2,2)
811+
-hurwitz_zeta(5/2, 3) + zeta(5/2)
812+
sage: harmonic_number(1+I,5)
813+
-hurwitz_zeta(I + 1, 6) + zeta(I + 1)
814+
sage: harmonic_number(1.+I,5)
815+
1.57436810798989 - 1.06194728851357*I
805816
806817
Solutions to certain sums are returned in terms of harmonic numbers::
807818
808-
sage:
819+
sage: k=var('k')
820+
sage: sum(1/k^7,k,1,x)
821+
harmonic_number(x, 7)
809822
810823
Check the defining integral. at a random integer::
811824
@@ -819,6 +832,22 @@ class Function_harmonic_number_generalized(BuiltinFunction):
819832
0
820833
sage: harmonic_number(1)
821834
1
835+
sage: harmonic_number(x,1)
836+
harmonic_number(x)
837+
838+
Arguments are swapped with respect to the same functions in
839+
Maxima::
840+
841+
sage: maxima(harmonic_number(x,2)) # maxima expect interface
842+
gen_harmonic_number(2,x)
843+
sage: from sage.calculus.calculus import symbolic_expression_from_maxima_string as sefms
844+
sage: sefms('gen_harmonic_number(3,x)')
845+
harmonic_number(x, 3)
846+
sage: from sage.interfaces.maxima_lib import maxima_lib, max_to_sr
847+
sage: c=maxima_lib(harmonic_number(x,2)); c
848+
gen_harmonic_number(2,x)
849+
sage: max_to_sr(c.ecl())
850+
harmonic_number(x, 2)
822851
"""
823852

824853
def __init__(self):
@@ -891,6 +920,8 @@ def _evalf_(self, z, m, parent=None, algorithm=None):
891920
"""
892921
EXAMPLES::
893922
923+
sage: harmonic_number(5/2,2)
924+
-hurwitz_zeta(5/2, 3) + zeta(5/2)
894925
sage: harmonic_number(3.,3).n(200)
895926
1.162037037037036979469917...
896927
sage: harmonic_number(I,5).n()
@@ -899,6 +930,15 @@ def _evalf_(self, z, m, parent=None, algorithm=None):
899930
from sage.functions.transcendental import zeta, hurwitz_zeta
900931
return zeta(z) - hurwitz_zeta(z,m+1)
901932

933+
def _maxima_init_evaled_(self, n, z):
934+
"""
935+
EXAMPLES:
936+
937+
sage: maxima(harmonic_number(x,2))
938+
gen_harmonic_number(2,x)
939+
"""
940+
return "gen_harmonic_number(%s,%s)" % (z, n) # swap arguments
941+
902942
def _print_(self, z, m):
903943
"""
904944
EXAMPLES::

src/sage/interfaces/maxima_lib.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -1267,6 +1267,7 @@ def sage_rat(x,y):
12671267
max_array = EclObject("ARRAY")
12681268
mdiff = EclObject("%DERIVATIVE")
12691269
max_lambert_w = sage_op_dict[sage.functions.log.lambert_w]
1270+
max_harmo = EclObject("$GEN_HARMONIC_NUMBER")
12701271

12711272
def mrat_to_sage(expr):
12721273
r"""
@@ -1448,21 +1449,37 @@ def dummy_integrate(expr):
14481449
return sage.symbolic.integration.integral.indefinite_integral(*args,
14491450
hold=True)
14501451

1452+
def max_harmonic_to_sage(expr):
1453+
"""
1454+
EXAMPLES::
1455+
1456+
sage: from sage.interfaces.maxima_lib import maxima_lib, max_to_sr
1457+
sage: c=maxima_lib(harmonic_number(x,2))
1458+
sage: c.ecl()
1459+
<ECL: (($GEN_HARMONIC_NUMBER SIMP) 2 $X)>
1460+
sage: max_to_sr(c.ecl())
1461+
harmonic_number(x, 2)
1462+
"""
1463+
return sage.functions.log.harmonic_number(max_to_sr(caddr(expr)),
1464+
max_to_sr(cadr(expr)))
1465+
14511466
## The dictionaries
14521467
special_max_to_sage={
14531468
mrat : mrat_to_sage,
14541469
mqapply : mqapply_to_sage,
14551470
mdiff : mdiff_to_sage,
14561471
EclObject("%INTEGRATE") : dummy_integrate,
14571472
max_at : max_at_to_sage,
1458-
mlist : mlist_to_sage
1473+
mlist : mlist_to_sage,
1474+
max_harmo : max_harmonic_to_sage
14591475
}
14601476

14611477
special_sage_to_max={
14621478
sage.functions.log.polylog : lambda N,X : [[mqapply],[[max_li, max_array],N],X],
14631479
sage.functions.other.psi1 : lambda X : [[mqapply],[[max_psi, max_array],0],X],
14641480
sage.functions.other.psi2 : lambda N,X : [[mqapply],[[max_psi, max_array],N],X],
14651481
sage.functions.log.lambert_w : lambda N,X : [[max_lambert_w], X] if N==EclObject(0) else [[mqapply],[[max_lambert_w, max_array],N],X],
1482+
sage.functions.log.harmonic_number : lambda N,X : [[mqapply],[[max_harmo, max_array],X],N],
14661483
sage.functions.hypergeometric.hypergeometric : lambda A, B, X : [[mqapply],[[max_hyper, max_array],lisp_length(A.cdr()),lisp_length(B.cdr())],A,B,X]
14671484
}
14681485

0 commit comments

Comments
 (0)