@@ -790,7 +790,7 @@ class Function_harmonic_number_generalized(BuiltinFunction):
790
790
791
791
H_{s}=\int_0^1\frac{1-x^s}{1-x}
792
792
793
- H_{s,m}=\zeta(s )-\zeta(s,m -1)
793
+ H_{s,m}=\zeta(m )-\zeta(m,s -1)
794
794
795
795
If called with a single argument, that argument is ``s`` and ``m`` is
796
796
assumed to be 1 (the normal harmonic numbers ``H_m``).
@@ -813,15 +813,15 @@ class Function_harmonic_number_generalized(BuiltinFunction):
813
813
251/216
814
814
sage: harmonic_number(5/2)
815
815
-2*log(2) + 46/15
816
- sage: harmonic_number(3,3. )
816
+ sage: harmonic_number(3.,3 )
817
817
zeta(3) - 0.0400198661225573
818
818
sage: harmonic_number(3.,3.)
819
819
1.16203703703704
820
820
sage: harmonic_number(3,3).n(200)
821
821
1.16203703703703703703703...
822
822
sage: harmonic_number(1+I,5)
823
823
harmonic_number(I + 1, 5)
824
- sage: harmonic_number(1.+I,5 )
824
+ sage: harmonic_number(5, 1.+I)
825
825
1.57436810798989 - 1.06194728851357*I
826
826
827
827
Solutions to certain sums are returned in terms of harmonic numbers::
@@ -830,10 +830,10 @@ class Function_harmonic_number_generalized(BuiltinFunction):
830
830
sage: sum(1/k^7,k,1,x)
831
831
harmonic_number(x, 7)
832
832
833
- Check the defining integral. at a random integer::
833
+ Check the defining integral at a random integer::
834
834
835
835
sage: n=randint(10,100)
836
- sage: bool(integrate((1-x^n)/(1-x),x,0,1) == harmonic_number(n))
836
+ sage: bool(SR( integrate((1-x^n)/(1-x),x,0,1) ) == harmonic_number(n))
837
837
True
838
838
839
839
There are several special values which are automatically simplified::
@@ -899,47 +899,59 @@ def _eval_(self, z, m):
899
899
251/216
900
900
sage: harmonic_number(3,3).n() # this goes from rational to float
901
901
1.16203703703704
902
- sage: harmonic_number(3.,3 ) # the following uses zeta functions
902
+ sage: harmonic_number(3,3. ) # the following uses zeta functions
903
903
1.16203703703704
904
- sage: harmonic_number(5,0.1)
904
+ sage: harmonic_number(3.,3)
905
+ zeta(3) - 0.0400198661225573
906
+ sage: harmonic_number(0.1,5)
905
907
zeta(5) - 0.650300133161038
906
- sage: harmonic_number(5, 0.1).n()
908
+ sage: harmonic_number(0.1,5 ).n()
907
909
0.386627621982332
908
- sage: harmonic_number(Qp(5)(10))
909
- 4*5^-1 + 2 + 2*5 + 4*5^2 + 3*5^3 + 5^4 + 4*5^5 + 4*5^6 + 5^7 + 4*5^8 + 3*5^9 + 5^10 + 4*5^11 + 4*5^12 + 5^13 + 4*5^14 + 3*5^15 + 5^16 + 4*5^17 + 4*5^18 + O(5^19)
910
+ sage: harmonic_number(3,5/2)
911
+ 1/27*sqrt(3) + 1/8*sqrt(2) + 1
912
+ sage: harmonic_number(Qp(5)(10),1)
913
+ 4*5^-1 + 2 + 2*5 + 4*5^2 + 3*5^3 + 5^4 + ...
914
+ sage: harmonic_number(Qp(5)(10),2)
915
+ 4*5^-1 + 3 + 5 + 3*5^2 + 2*5^3 + 3*5^5 + ...
910
916
"""
911
917
if m == 0 :
912
918
return z
913
919
elif m == 1 :
914
920
return harmonic_m1 ._eval_ (z )
915
- elif isinstance (m , Integer ):
916
- from sage .misc .misc import srange
921
+ from sage .symbolic .ring import SR
922
+ P = s_parent (z )
923
+ if not hasattr (z , 'operator' ) and not self ._is_numerical (z ):
917
924
try :
918
- _ = ZZ (z )
925
+ z = ZZ (z )
919
926
except TypeError :
920
927
pass
921
928
else :
922
- return sum (1 / (k ** m ) for k in srange (1 ,z + 1 ))
929
+ if (isinstance (m , (Integer , int ))):
930
+ if P in (ZZ , int ):
931
+ P = QQ
932
+ return SR (P (sum (1 / (k ** m ) for k in range (1 ,z + 1 ))))
933
+ elif isinstance (m , Rational ):
934
+ return sum (1 / (k ** m ) for k in range (1 ,z + 1 ))
923
935
924
936
def _evalf_ (self , z , m , parent = None , algorithm = None ):
925
937
"""
926
938
EXAMPLES::
927
939
928
- sage: harmonic_number(3,3. )
940
+ sage: harmonic_number(3.,3 )
929
941
zeta(3) - 0.0400198661225573
930
942
sage: harmonic_number(3.,3.)
931
943
1.16203703703704
932
944
sage: harmonic_number(3,3).n(200)
933
945
1.16203703703703703703703...
934
- sage: harmonic_number(I,5 ).n()
946
+ sage: harmonic_number(5,I ).n()
935
947
2.36889632899995 - 3.51181956521611*I
936
948
"""
937
949
if m == 0 :
938
950
return parent (z )
939
951
elif m == 1 :
940
952
return harmonic_m1 ._evalf_ (z , parent )
941
953
from sage .functions .transcendental import zeta , hurwitz_zeta
942
- return zeta (z ) - hurwitz_zeta (z , m + 1 )
954
+ return zeta (m ) - hurwitz_zeta (m , z + 1 )
943
955
944
956
def _maxima_init_evaled_ (self , n , z ):
945
957
"""
@@ -1069,18 +1081,28 @@ def _eval_(self, z, **kwds):
1069
1081
-2*log(2) + 46/15
1070
1082
sage: harmonic_number(2*x)
1071
1083
harmonic_number(2*x)
1084
+ sage: harmonic_number(Qp(5)(3))
1085
+ 1 + 5 + 4*5^2 + 4*5^4 + 4*5^6 + ...
1072
1086
"""
1087
+ from sage .symbolic .ring import SR
1088
+ P = s_parent (z )
1089
+ if P in (ZZ , int ):
1090
+ P = QQ
1091
+ if not hasattr (z , 'operator' ) and not self ._is_numerical (z ):
1092
+ try :
1093
+ z = ZZ (QQ (z ))
1094
+ except TypeError :
1095
+ pass
1073
1096
if isinstance (z , Integer ):
1074
1097
if z == 0 :
1075
1098
return Integer (0 )
1076
1099
elif z == 1 :
1077
1100
return Integer (1 )
1078
1101
else :
1079
1102
import sage .libs .flint .arith as flint_arith
1080
- return flint_arith .harmonic_number (z )
1103
+ return SR ( P ( flint_arith .harmonic_number (z )) )
1081
1104
elif isinstance (z , Rational ):
1082
1105
from sage .calculus .calculus import symbolic_sum
1083
- from sage .symbolic .ring import SR
1084
1106
from sage .rings .infinity import infinity
1085
1107
x = SR .var ('x' )
1086
1108
return z * symbolic_sum (1 / x / (z + x ),x ,1 ,infinity )
0 commit comments