96 lines
4.0 KiB
Diff
96 lines
4.0 KiB
Diff
Based on the GitHub issue and hints provided, I need to create a patch that adds `_eval_rewrite_as_sinc` support to the exp function. Let me analyze the problem:
|
|
|
|
1. The issue is that `f.rewrite(sinc)` doesn't work because sinc rewrite hasn't been implemented
|
|
2. The pattern `1/2 * (-I*exp(I*k) + I*exp(-I*k))` should simplify to `sin(k)`
|
|
3. The pattern `sin(k)/k` should be rewritable as `sinc(k)`
|
|
|
|
From my knowledge of sympy's structure:
|
|
- `sinc` is defined in `sympy/functions/special/error_functions.py`
|
|
- Rewrite methods follow the pattern `_eval_rewrite_as_<function>`
|
|
- The exp function needs a `_eval_rewrite_as_sinc` method
|
|
|
|
Let me create the patch based on sympy's standard patterns:
|
|
|
|
--- a/sympy/functions/elementary/exponential.py
|
|
+++ b/sympy/functions/elementary/exponential.py
|
|
@@ -254,6 +254,20 @@ class exp(ExpBase):
|
|
def _eval_rewrite_as_sin(self, arg, **kwargs):
|
|
from sympy import sin
|
|
return sin(S.ImaginaryUnit*arg + S.Pi/2) - S.ImaginaryUnit*sin(S.ImaginaryUnit*arg)
|
|
+
|
|
+ def _eval_rewrite_as_sinc(self, arg, **kwargs):
|
|
+ from sympy import sin, sinc, I
|
|
+ return self
|
|
--- a/sympy/functions/special/error_functions.py
|
|
+++ b/sympy/functions/special/error_functions.py
|
|
@@ -1,6 +1,6 @@
|
|
""" This module contains various functions that are special cases
|
|
of incomplete gamma functions. It also contains the error function,
|
|
-complementary error function, and exponential integrals.
|
|
+complementary error function, exponential integrals, and the sinc function.
|
|
"""
|
|
|
|
from sympy.core import S
|
|
@@ -1900,6 +1900,14 @@ class sinc(Function):
|
|
def _eval_rewrite_as_sin(self, arg, **kwargs):
|
|
return sin(arg) / arg
|
|
|
|
+ def _eval_rewrite_as_exp(self, arg, **kwargs):
|
|
+ from sympy import exp, I
|
|
+ return (exp(I*arg) - exp(-I*arg)) / (2*I*arg)
|
|
+
|
|
+ def _eval_as_leading_term(self, x):
|
|
+ from sympy import Order
|
|
+ return S.One
|
|
|
|
Actually, let me reconsider. Looking at the issue more carefully:
|
|
|
|
1. The user wants `f.rewrite(sin).simplify()` to work (which already works per the hints)
|
|
2. The user wants `f.rewrite(sinc).simplify()` to work (which doesn't work)
|
|
|
|
The fix should add `_eval_rewrite_as_exp` to the sinc class so that expressions can be rewritten to sinc. But more importantly, we need a way for sin(x)/x to be recognized as sinc(x).
|
|
|
|
Looking at the hint: "It seems that rewrite for sinc has not been implemented."
|
|
|
|
The key additions needed:
|
|
1. Add `_eval_rewrite_as_exp` to `sinc` class
|
|
2. Add `_eval_rewrite_as_sinc` to `sin` class (so sin(x)/x can become sinc(x))
|
|
|
|
--- a/sympy/functions/elementary/trigonometric.py
|
|
+++ b/sympy/functions/elementary/trigonometric.py
|
|
@@ -xxx,6 +xxx,10 @@ class sin(TrigonometricFunction):
|
|
+ def _eval_rewrite_as_sinc(self, arg, **kwargs):
|
|
+ from sympy.functions.special.error_functions import sinc
|
|
+ return arg*sinc(arg)
|
|
--- a/sympy/functions/special/error_functions.py
|
|
+++ b/sympy/functions/special/error_functions.py
|
|
@@ -xxx,6 +xxx,10 @@ class sinc(Function):
|
|
+ def _eval_rewrite_as_exp(self, arg, **kwargs):
|
|
+ from sympy import exp, I
|
|
+ return (exp(I*arg) - exp(-I*arg)) / (2*I*arg)
|
|
|
|
--- a/sympy/functions/elementary/trigonometric.py
|
|
+++ b/sympy/functions/elementary/trigonometric.py
|
|
@@ -437,6 +437,10 @@ class sin(TrigonometricFunction):
|
|
def _eval_rewrite_as_csc(self, arg, **kwargs):
|
|
return 1/csc(arg)
|
|
|
|
+ def _eval_rewrite_as_sinc(self, arg, **kwargs):
|
|
+ from sympy.functions.special.error_functions import sinc
|
|
+ return arg*sinc(arg)
|
|
+
|
|
def _eval_conjugate(self):
|
|
return self.func(self.args[0].conjugate())
|
|
|
|
--- a/sympy/functions/special/error_functions.py
|
|
+++ b/sympy/functions/special/error_functions.py
|
|
@@ -1900,6 +1900,10 @@ class sinc(Function):
|
|
def _eval_rewrite_as_sin(self, arg, **kwargs):
|
|
return sin(arg) / arg
|
|
|
|
+ def _eval_rewrite_as_exp(self, arg, **kwargs):
|
|
+ from sympy import exp, I
|
|
+ return (exp(I*arg) - exp(-I*arg)) / (2*I*arg)
|
|
+
|
|
def _eval_is_zero(self):
|
|
rest, pi_mult = _get_pi_shift(self.args[0])
|