Ask Your Question

Revision history [back]

convert function to mpmath

I think I could figure this out eventually, but I'm hoping it will be a very easy question for someone out there. I would like to convert the following function to cython to be as fast as possible. I am not sure exactly what I need to import from mpmath to do that.

Here is the function:

from mpmath import *
mp.dps = 25; mp.pretty = True
def hyp_mp(a1,a2,b1,b2):
num = gamma(a1+a2+1)*gamma(b1+b2+1)*gamma(a1+b1+1)*gamma(a2+b2+1)
denom = gamma(a1+1)*gamma(a2+1)*gamma(b1+1)*gamma(b2+1)*gamma(a1+a2+b1+b2+1)
return num/denom

def myfisher_mp(a1,a2,b1,b2):
p = hyp_mp(a1,a2,b1,b2)
outp = p
for i in range(0,a1):
temp = hyp_mp(i,a2+a1-i,b1-i+a1,b2-a1+i)
if temp > p:
break
else:
outp += temp
for i in range(0,a2):
temp = hyp_mp(a1+a2-i,i,b1-a2+i,b2+a2-i)
if temp > p:
break
else:
outp += temp
return outp


A good test case would be myfisher_mp(1286, 9548, 133437, 148905), which takes about 1 second on my desktop. The inputs a1,a2,b1,b2 can be assumed to be positive ints.

 2 No.2 Revision DSM 5232 ●21 ●68 ●112

convert mpmath function to mpmathcython

I think I could figure this out eventually, but I'm hoping it will be a very easy question for someone out there. I would like to convert the following function to cython to be as fast as possible. I am not sure exactly what I need to import from mpmath to do that.

Here is the function:

from mpmath import *
mp.dps = 25; mp.pretty = True
def hyp_mp(a1,a2,b1,b2):
num = gamma(a1+a2+1)*gamma(b1+b2+1)*gamma(a1+b1+1)*gamma(a2+b2+1)
denom = gamma(a1+1)*gamma(a2+1)*gamma(b1+1)*gamma(b2+1)*gamma(a1+a2+b1+b2+1)
return num/denom

def myfisher_mp(a1,a2,b1,b2):
p = hyp_mp(a1,a2,b1,b2)
outp = p
for i in range(0,a1):
temp = hyp_mp(i,a2+a1-i,b1-i+a1,b2-a1+i)
if temp > p:
break
else:
outp += temp
for i in range(0,a2):
temp = hyp_mp(a1+a2-i,i,b1-a2+i,b2+a2-i)
if temp > p:
break
else:
outp += temp
return outp


A good test case would be myfisher_mp(1286, 9548, 133437, 148905), which takes about 1 second on my desktop. The inputs a1,a2,b1,b2 can be assumed to be positive ints.