Opened 11 years ago

Closed 11 years ago

#9620 closed defect (duplicate)

conflicting branch cut conventions

Reported by: rbk Owned by: AlexGhitza
Priority: major Milestone: sage-duplicate/invalid/wontfix
Component: algebra Keywords:
Cc: jdemeyer Merged in:
Authors: Reviewers: Richard B. Kreckel
Report Upstream: Fixed upstream, but not in a stable release. Work issues:
Branch: Commit:
Dependencies: Stopgaps:

Status badges

Description

For multi-valued complex functions, the choice of principal values and where complex branch cuts are continuous is a matter of convention but there is a clear predominant convention which has been advocated by Kahan, can be found in Guy Steele's CLTL2 (chapter 12.5.3) and is implemented in most Lisp dialects, in the C99 standard, the upcoming C++0x standard, the CLN library, Mathematica, Maple, Sage's CDF, MPMath, and many others.

However, some libraries disagree with the predominant convention for branch cuts of inverse trigonometric and hyperbolic functions.

Unfortunately for Sage, Pari is one of the systems that disagree. This leads to surprising results that are difficult to explain to new users, like this fine example:

  sage: acosh(-1.0-0.00001*I) - acosh(CDF(-1,-0.0000001))
  -0.00347850806404590 + 6.27970680439127*I

It turns out that all of Pari's branch cuts of inverse trigonometric and hyperbolic functions are somehow affected.

Luckily we don't disagree about roots and the logarithm any more. :-)

  • asin: The asin() function is not continuous as the cut is approached coming around the finite endpoint of the cuts in a counter clockwise direction.
  • acos: Pari picks an unconventional principal branch in the left complex plain.
  • atan: The atan() function is not continous as the cut is appraoched coming around the finite endpoint of the cut along the negative imaginary axis in a counter clockwise direction.
  • asinh: The asinh() function is not continuous as the cut is approached coming around the finite endpoint of the cuts in a counter clockwise direction.
  • acosh: Pari picks an unconventional principal branch in the lower complex plain.
  • atanh: The atan() function is not continous as the cut is appraoched coming around the finite endpoint of the cut along the positive real axis in a counter clockwise direction.

Applying the attached patch to Pari 2.3.5 in Sage 4.5.1 makes the implementations in sage.libs.mpmath, sage.libs.pari, and sage.rings.complex_double return the same values within numerical accuracy.

Attachments (1)

pari-2.3.5.patch (4.2 KB) - added by rbk 11 years ago.

Download all attachments as: .zip

Change History (7)

Changed 11 years ago by rbk

comment:1 Changed 11 years ago by rbk

  • Report Upstream changed from Not yet reported upstream; Will do shortly. to Reported upstream. Little or no feedback.

comment:2 Changed 11 years ago by jdemeyer

  • Cc jdemeyer added

comment:3 Changed 11 years ago by jdemeyer

  • Milestone set to sage-duplicate/invalid/wontfix
  • Report Upstream changed from Reported upstream. Little or no feedback. to Fixed upstream, but not in a stable release.

See #10430

comment:4 Changed 11 years ago by jdemeyer

  • Status changed from new to needs_review

comment:5 Changed 11 years ago by jdemeyer

  • Reviewers set to Richard B. Kreckel
  • Status changed from needs_review to positive_review

Richard B. Kreckel wrote in an email:

So, back to the review:

I've checked that it works fine now. The results of pari(re+im*I).f() are compatible with f(CDF(re,im)) and mpmath.f(re+I*im) in the entire complex plain, where f is any of asin, acos, atan, asinh, acosh, and atanh.

thank you

-richy.

comment:6 Changed 11 years ago by jdemeyer

  • Resolution set to duplicate
  • Status changed from positive_review to closed
Note: See TracTickets for help on using tickets.