Opened 5 years ago
Closed 4 years ago
#20084 closed defect (fixed)
residue: mathematically wrong output
Reported by: | behackl | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | sage-8.0 |
Component: | symbolics | Keywords: | |
Cc: | rws, cheuberg | Merged in: | |
Authors: | Benjamin Hackl | Reviewers: | Frédéric Chapoton |
Report Upstream: | N/A | Work issues: | |
Branch: | 68fea61 (Commits) | Commit: | 68fea61960a41972282076686c2c59611c496a07 |
Dependencies: | Stopgaps: |
Description
The complex function f(s) = 1/(1 - 2^(-s))
has poles of residue 1/log(2)
at s = 2*k*pi*I/log(2)
for all integers k
.
Currently sage recognize these poles just at s=0
:
sage: f(s).residue(s==0) 1/log(2) sage: f(s).residue(s==2*pi*I/log(2)) 0
In essence, this happens because the series
-method does not recognize the pole. The priority is critical because mathematically wrong output is produced.
Change History (12)
comment:1 Changed 5 years ago by
comment:2 Changed 5 years ago by
- Branch set to u/behackl/symbolics/residue/exp-complex-poles
- Commit set to 45d16e2c9301626ff1da1bb229f955209f17e93a
- Status changed from new to needs_info
This is just the quick workaround from above.
New commits:
45d16e2 | simplify substituted expression before series expansion
|
comment:3 Changed 5 years ago by
- Status changed from needs_info to needs_work
Please add an example doctest to illustrate what you're fixing.
comment:4 Changed 5 years ago by
- Commit changed from 45d16e2c9301626ff1da1bb229f955209f17e93a to 87193643462062096a9b48dd07c76765bb525002
Branch pushed to git repo; I updated commit sha1. New commits:
8719364 | add a doctest
|
comment:5 Changed 5 years ago by
Is it ready for review?
comment:6 follow-up: ↓ 7 Changed 4 years ago by
update from the future:
sage: (1/(1 - 2^-x)).residue(x == 2*pi*I/log(2)) 1/log(2) sage: version() 'SageMath version 7.6.beta6, Release Date: 2017-03-03'
some updates in series
may affect that now it can recognize the pole without having to call canonicalize_radical()
?
comment:7 in reply to: ↑ 6 ; follow-up: ↓ 8 Changed 4 years ago by
Yes, I have faint memory of improving something with series
itself some time ago; thanks for reminding me.
Actually, there are more problems with residue
. Take, for example,
sage: (1/sqrt(x^2)).residue(x==0) 0 sage: (1/sqrt(x^2)).canonicalize_radical().residue(x==0) 1
(Note that this is, in some sense, a pathological example.)
The ideal fix in this case (IMHO) would be to throw an error that the residue could not be computed as the "correct" branch of the root could not be chosen automatically. I think that just applying canonicalize_radical
before computing the residue just introduces more grief as the user looses all control over which branch is chosen.
In any case: the original problem reported with this ticket is solved, so this is probably just wontfix. Other opinions?
Replying to mforets:
update from the future:
sage: (1/(1 - 2^-x)).residue(x == 2*pi*I/log(2)) 1/log(2) sage: version() 'SageMath version 7.6.beta6, Release Date: 2017-03-03'some updates in
series
may affect that now it can recognize the pole without having to callcanonicalize_radical()
?
comment:8 in reply to: ↑ 7 Changed 4 years ago by
Replying to behackl:
Yes, I have faint memory of improving something with
series
itself some time ago; thanks for reminding me. ... In any case: the original problem reported with this ticket is solved, so this is probably just wontfix. Other opinions?
cool. for what i've been told from other tickets, i suppose this one should should still provide the test (not wontfix):
Check that :trac:`20084` is fixed:: sage: (1/(1 - 2^-x)).residue(x == 2*pi*I/log(2)) 1/log(2)
Actually, there are more problems with residue. ... (Note that this is, in some sense, a pathological example.)
yes. one could come up with other examples (e.g. examples involving log(z)). i agree that just applying canonicalize_radical
is not a good idea for the reason you stated. but is there a simple way to identify these cases without much hurdle? does this belong to series
method or is sth that can be done at the level of residue
?
comment:9 Changed 4 years ago by
@behackl : if you remove the canonicalize_radical
keeping the test, i can review it! (or the other way round).
wrt handling pathological examples, yes IMO it is a relevant future task, although as pointed out before i cannot help right now, since i'm not visualizing a workaround :/
comment:10 Changed 4 years ago by
- Branch changed from u/behackl/symbolics/residue/exp-complex-poles to public/20084
- Commit changed from 87193643462062096a9b48dd07c76765bb525002 to 68fea61960a41972282076686c2c59611c496a07
- Reviewers set to Frédéric Chapoton
- Status changed from needs_work to positive_review
comment:11 Changed 4 years ago by
- Milestone changed from sage-7.1 to sage-8.0
- Priority changed from critical to major
comment:12 Changed 4 years ago by
- Branch changed from public/20084 to 68fea61960a41972282076686c2c59611c496a07
- Resolution set to fixed
- Status changed from positive_review to closed
The most elegant solution would of course be the automatic simplification of expressions like
2^(something/log(2)) --> exp(something)
, such thatHowever, I'm not sure if that can be achieved so easily.
A second suggestion would be something like {{{diff diff --git a/src/sage/symbolic/expression.pyx b/src/sage/symbolic/expression.pyx index 3a5c864..175bcad 100644 --- a/src/sage/symbolic/expression.pyx +++ b/src/sage/symbolic/expression.pyx @@ -4076,7 +4076,7 @@ cdef class Expression(CommutativeRingElement?):
+ return self.subs({x: x+a}).canonicalize_radical().series(x == 0, 0).coefficient(x, -1)
}}}