Parallel computation of roots and loops

asked 2023-03-19 19:03:28 +0200

Nivers gravatar image


I am dealing with fairly complicated polynomials which need to be recalculated many times ~5000. I am looking for a way to optimize my code as the whole procedure took 11h for one of the cases meanwhile Mathematica was able to do it in 20 minutes.

I would like to use parallel computing, but I am not sure how to implement it. For now, letting SageMath run with many CPUs did not change the result.

Parallelism().set('tensor', nproc=16)

e1 = 1/3
e2 = 1/3

l1 = 1/4
l2 = 1

fi = pi/2

z = var('z')
x,y = var('x,y',domain='complex')
xs,ys = var('x,y',domain='real')
mu = var('mu',domain='complex')

zeta = x + I*y
zeta_bar = x - I*y

z_bar(z) = zeta_bar + e1/(z-l1*exp(I*fi)) + e2/(z+l1*exp(I*fi)) + (1-e1-e2)/(z-l2)
L(z) = zeta -z + e1/(z_bar(z)-l1*exp(-I*fi)) + e2/(z_bar(z)+l1*exp(-I*fi)) + (1-e1-e2)/(z_bar(z)-l2)

exp1 = L(z).numerator(normalize=true)

derivative_z(z) = e1/(z_bar(z)-l1*exp(-I*fi))^2 + e2/(z_bar(z)+l1*exp(-I*fi))^2 + (1-e1-e2)/(z_bar(z)-l2)^2
derivative_z_bar(z) = e1/(z-l1*exp(I*fi))^2 + e2/(z+l1*exp(I*fi))^2 + (1-e1-e2)/(z-l2)^2

magnification(z) = mu*(1-derivative_z(z)*derivative_z_bar(z))-1

exp2 = magnification(z).numerator(normalize=true)

def resultant(xs,ys):

    temp1 = exp1.subs({x:xs,y:ys})
    temp2 = exp2.subs({x:xs,y:ys})

    QQI.<I> = QQ[i]
    R.<mu> = QQI[]
    S.<z> = R[]

    poly1 = temp1.polynomial(None,ring=S)
    poly2 = temp2.polynomial(None,ring=S)

    poly3 = poly1.resultant(poly2)

    return poly3

def magn(xs,ys):

    roots = resultant(xs,ys).roots(ring=CDF)
    mag = sum([abs(roots[k][0].n(50)) for k in range(len(roots))])

    return log(mag)

x_list = []
y_list = []

for u in range(36):

for u in range(1,36):

y_list = x_list

A = np.zeros([71,71])

for u in range(71):
     for v in range(71):
         A[u,v] = magn(x_list[u],y_list[v])

To get through the last loop it took 11,5 hours. Is there any way to make it run parallel? Or maybe another way to speed up the code?

Thank you for any insights!

edit retag flag offensive close merge delete