The trick is to use the `roots`

method of the given symbolic expression as follows:

**Example 1**

```
sage: var('y')
y
sage: f(x) = log(x) - y
sage: f.roots(x)
[(e^y, 1)]
sage: f.roots(x, multiplicities=False)
[e^y]
```

**Example 2**

`f`

does not need to be callable.

```
sage: var('y')
y
sage: f = log(x) - y
sage: f.roots(x)
[(e^y, 1)]
```

**Example 3**

Use a helper function so that the expression "hacking" can be contained neatly:

```
sage: def symbolic_inverse(f, x):
....: y = SR.var('y')
....: g = (f - y).roots(x, multiplicities=False)
....: return [expr.subs(y=x) for expr in g]
....:
sage: symbolic_inverse(log(x), x)
[e^x]
sage: symbolic_inverse(sin(x), x)
[arcsin(x)]
sage: symbolic_inverse(x, x)
[x]
sage: symbolic_inverse(x^2, x)
[-sqrt(x), sqrt(x)]
sage: var('c')
c
sage: symbolic_inverse(c^3, c)
[1/2*(I*sqrt(3) - 1)*c^(1/3), 1/2*(-I*sqrt(3) - 1)*c^(1/3), c^(1/3)]
```

Note that multiple inverses are all listed and that any variable can be used. However, only one branch is returned for the inverse of `sin(x)`

, namely `arcsin(x)`

.

If an inverse cannot be found or does not exist, a `RuntimeError`

error is raised:

```
sage: symbolic_inverse(x + sin(x), x)
(... Traceback ...)
RuntimeError: no explicit roots found
```