Twiffy - 5 months ago 24
Python Question

# In Python how do I plot using GMPY2?

I'm not new to programming, but I am new to Python and numerical computing, so this may be a newbie question.

I'm using GMPY2 to handle computation of extremely large numbers, but I want to use MatPlotLib to graph the results. I currently have

``````import gmpy2
from gmpy2 import mpz, mpq, mpfr, mpc
import numpy as np
import matplotlib.pyplot as plt

gmpy2.get_context().precision = 100

def hop(x, y, n):
if n > 0:
return gmpy2.exp(hop(gmpy2.log(x), gmpy2.log(y), n-1))
elif n == 0:
else:
raise ValueError('Negative value of n in hop method.')

t = np.arange(-5.0, 5.0, 0.01)
plt.plot(t, hop(t, t, 0))
``````

I assume there's no implicit conversion from mpfr to numpy's native type. In
`np.arange`
I tried setting
`dtype=mpfr`
, and also in the
`plot`
method I tried writing
`hop(mpfr(t), mpfr(t), 0)`
, but of course no luck.

Disclaimer: I maintain `gmpy2`.

Since you didn't state your error message, I tried your code and encountered the following error message:

``````TypeError: add() argument types not supported
``````

The `gmpy2` functions only accept scalar arguments. They do not iterate over a list. You will need to do that manually.

``````t = np.arange(-5.0, 5.0, 0.01)
hopt = [hop(x, x, 0) for x in t]
plt.plot(t, hopt)
``````

Update

Here is an example showing an `mpfr_range()` function.

``````import gmpy2
from gmpy2 import mpfr, exp, log

import matplotlib.pyplot as plt

gmpy2.get_context().precision = 100

def mpfr_range(first, last, n):
'''Yield a sequence of n mpfr values that range from first
to last. Both first and last are included. n must be greater
than or equal to 2.'''

n = int(n)
first = mpfr(first)
last = mpfr(last)

if n < 2:
raise ValueError('n must be >= 2')

if last <= first:
raise ValueError('last must be > first')

delta = (last - first) / (n - 1)
for i in range(n - 1):
yield first + i * delta

yield last

def hop(x, y, n):
if n > 0:
return exp(hop(log(x), log(y), n-1))
elif n == 0:
return x + y
else:
raise ValueError('Negative value of n in hop method.')

# It is recommended to initialize mpfr instances from exact values -
# either a string or an integer for this use.
t = list(mpfr_range('10', '20', 20))

hopt = [hop(x, x, 0) for x in t]
plt.plot(t, hopt)
plt.show()
``````
Source (Stackoverflow)