|
41 | 41 | from mathics.core.convert.expression import to_expression, to_mathics_list |
42 | 42 | from mathics.core.convert.function import expression_to_callable_and_args |
43 | 43 | from mathics.core.convert.python import from_python |
44 | | -from mathics.core.convert.sympy import SympyExpression, from_sympy, sympy_symbol_prefix |
| 44 | +from mathics.core.convert.sympy import ( |
| 45 | + SymbolRootSum, |
| 46 | + SympyExpression, |
| 47 | + from_sympy, |
| 48 | + sympy_symbol_prefix, |
| 49 | +) |
45 | 50 | from mathics.core.evaluation import Evaluation |
46 | 51 | from mathics.core.expression import Expression |
47 | 52 | from mathics.core.list import ListExpression |
|
63 | 68 | SymbolConditionalExpression, |
64 | 69 | SymbolD, |
65 | 70 | SymbolDerivative, |
| 71 | + SymbolFunction, |
66 | 72 | SymbolIndeterminate, |
67 | 73 | SymbolInfinity, |
68 | 74 | SymbolInfix, |
|
76 | 82 | SymbolSeries, |
77 | 83 | SymbolSeriesData, |
78 | 84 | SymbolSimplify, |
| 85 | + SymbolSlot, |
79 | 86 | SymbolUndefined, |
80 | 87 | ) |
81 | 88 | from mathics.eval.makeboxes import format_element |
@@ -1627,7 +1634,7 @@ class Root(SympyFunction): |
1627 | 1634 |
|
1628 | 1635 | Roots that can't be represented by radicals: |
1629 | 1636 | >> Root[#1 ^ 5 + 2 #1 + 1&, 2] |
1630 | | - = Root[#1 ^ 5 + 2 #1 + 1&, 2] |
| 1637 | + = Root[1 + #1 ^ 5 + 2 #1&, 2] |
1631 | 1638 | """ |
1632 | 1639 |
|
1633 | 1640 | messages = { |
@@ -1691,6 +1698,52 @@ def to_sympy(self, expr, **kwargs): |
1691 | 1698 | return None |
1692 | 1699 |
|
1693 | 1700 |
|
| 1701 | +class RootSum(SympyFunction): |
| 1702 | + """ |
| 1703 | + <url>:WMA link: https://reference.wolfram.com/language/ref/RootSum.html</url> |
| 1704 | +
|
| 1705 | + <dl> |
| 1706 | + <dt>'RootSum[$f$, $form$]' |
| 1707 | + <dd>sums $form[x]$ for all roots of the polynomial $f[x]$. |
| 1708 | + </dl> |
| 1709 | +
|
| 1710 | + >> Integrate[1/(x^5 + 11 x + 1), {x, 1, 3}] |
| 1711 | + = RootSum[-1 - 212960 #1 ^ 3 - 9680 #1 ^ 2 - 165 #1 + 41232181 #1 ^ 5&, (Log[3749971 - 3512322106304 #1 ^ 4 + 453522741 #1 + 16326568676 #1 ^ 2 + 79825502416 #1 ^ 3] - 4 Log[5]) #1&] - RootSum[-1 - 212960 #1 ^ 3 - 9680 #1 ^ 2 - 165 #1 + 41232181 #1 ^ 5&, (Log[3748721 - 3512322106304 #1 ^ 4 + 453522741 #1 + 16326568676 #1 ^ 2 + 79825502416 #1 ^ 3] - 4 Log[5]) #1&] |
| 1712 | + >> N[%, 50] |
| 1713 | + = 0.051278805184286949884270940103072421286139857550894 |
| 1714 | +
|
| 1715 | + >> RootSum[#^5 - 11 # + 1 &, (#^2 - 1)/(#^3 - 2 # + c) &] |
| 1716 | + = (538 - 88 c + 396 c ^ 2 + 5 c ^ 3 - 5 c ^ 4) / (97 - 529 c - 53 c ^ 2 + 88 c ^ 3 + c ^ 5) |
| 1717 | +
|
| 1718 | + >> RootSum[#^5 - 3 # - 7 &, Sin] //N//Chop |
| 1719 | + = 0.292188 |
| 1720 | +
|
| 1721 | + Use Normal to expand RootSum: |
| 1722 | + >> RootSum[1+#+#^2+#^3+#^4 &, Log[x + #] &] |
| 1723 | + = RootSum[1 + #1 ^ 2 + #1 ^ 3 + #1 ^ 4 + #1&, Log[x + #1]&] |
| 1724 | + >> %//Normal |
| 1725 | + = Log[-1 / 4 - Sqrt[5] / 4 - I Sqrt[5 / 8 - Sqrt[5] / 8] + x] + Log[-1 / 4 - Sqrt[5] / 4 + I Sqrt[5 / 8 - Sqrt[5] / 8] + x] + Log[-1 / 4 - I Sqrt[5 / 8 + Sqrt[5] / 8] + Sqrt[5] / 4 + x] + Log[-1 / 4 + I Sqrt[5 / 8 + Sqrt[5] / 8] + Sqrt[5] / 4 + x] |
| 1726 | + """ |
| 1727 | + |
| 1728 | + summary_text = "sum polynomial roots" |
| 1729 | + |
| 1730 | + def eval(self, f, form, evaluation: Evaluation): # type: ignore[override] |
| 1731 | + "RootSum[f_, form_]" |
| 1732 | + return from_sympy(Expression(SymbolRootSum, f, form).to_sympy()) |
| 1733 | + |
| 1734 | + def to_sympy(self, expr: Expression, **kwargs): |
| 1735 | + func = expr.elements[1] |
| 1736 | + if not isinstance(func.to_sympy(), sympy.Lambda): |
| 1737 | + # eta conversion |
| 1738 | + func = Expression( |
| 1739 | + SymbolFunction, Expression(func, Expression(SymbolSlot, Integer1)) |
| 1740 | + ) |
| 1741 | + |
| 1742 | + poly = expr.elements[0].to_sympy() |
| 1743 | + poly_x = sympy.Symbol("poly_x") |
| 1744 | + return sympy.RootSum(poly(poly_x), func.to_sympy(), x=poly_x) |
| 1745 | + |
| 1746 | + |
1694 | 1747 | class Series(Builtin): |
1695 | 1748 | """ |
1696 | 1749 | <url>:WMA link:https://reference.wolfram.com/language/ref/Series.html</url> |
|
0 commit comments