Weierstrass elliptic functions, in terms of lattice half-periods \(\omega_1\) and \(\omega_2\)#
Weierstrass function \(\wp_{\omega}(z| \omega_1, \omega_2)\)#
- ctxflint.weierstrass_o(z, omega1, omega2)#
Computes Weierstrass’s elliptic function in terms of half-period \(\omega_1\) and elliptic period ratio \(\tau\).
We have \(\wp(tz| t \omega, \tau) = t^{-2} \wp(z| \omega, \tau)\).
See also MathWorld [1066], Flint [837].
See also: https://dlmf.nist.gov/23.2
\[\wp(z, \tau, \omega=1) = \frac{1}{z^2} + \sum_{n^2+m^2 \ne 0} \left[ \frac{1}{(z+m+n\tau)^2} - \frac{1}{(m+n\tau)^2} \right]\]which satisfies \(\wp(z, \tau, \omega=1) = \wp(z + 1, \tau, \omega=1) = \wp(z + \tau, \tau, \omega=1)\). To evaluate the function efficiently, we use the formula (with with \(q = e^{\pi i \tau}\))
\[\wp(z, \tau) = \pi^3 \theta_2^2(0,q) \theta_3^2(0,q) \frac{\theta_4^2(\pi z,q)}{\theta_1^2(\pi z,q)} - \frac{\pi^3}{3} \left[ \theta_2^4(0,q) + \theta_3^4(0,q)\right].\]\[\wp(tz| t \omega_1, t \omega_2) = t^{-2} \wp(z| \omega_1, \omega_2)\]An example with real input for \(z\) and with purely imaginary input for \(\tau\), producing real output:
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 40; z = '0.1'; tau = '0.0 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_p(z, tau); mx = mpm.weierstrass_p(z, tau) >>> gx = gmp.weierstrass_p(z, tau) >>> fx = fpm.weierstrass_p(z, tau); ax = apm.weierstrass_p(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax]) dec: 1.001202913728593351620333736461324760825E+2 mpm: 1.001202913728593351620333736461324760825e+2 gmp: 1.001202913728593351620333736461324760825E+02 fpm: 1.00120291372859E+02 apm: 1.001202913728593351620333736461324760825e+2 (1.321e-38%)
An example with complex input for \(z\) and \(\tau\):
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 20; z = '0.1 + 0.5j'; tau = '0.7 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_p(z, tau); mx = mpm.weierstrass_p(z, tau) >>> gx = gmp.weierstrass_p(z, tau) >>> fx = fpm.weierstrass_p(z, tau); ax = apm.weierstrass_p(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax], aligned=True) dec: -2.3859027427781674104E+0 mpm: -2.3859027427781674104e+0 gmp: -2.3859027427781674104E+00 fpm: -2.38590274277817E+00 apm: (-2.3859027427781674104e+0 (-2.038e-17%) + 2.4323666240267878020e-2 (1.982e-15%)j)
Weierstrass function, first derivative: \(\wp_{\omega}'(z| \omega_1, \omega_2)\)#
- ctxflint.weierstrass_p_prime_o(z, omega1, omega2)#
Computes the first derivative of Weierstrass’s elliptic function in terms of half-period \(\omega_1\) and elliptic period ratio \(\tau\).
We have \(\wp'(tz| t \omega, \tau) = t^{-3} \wp'(z| \omega, \tau)\).
The Weierstrass elliptic function satisfies the differential equation \([\wp'(z, \tau)]^2 = 4 [\wp(z,\tau)]^3 - g_2 \wp(z,\tau) - g_3\).
\[\wp'(z, \tau) = \sqrt{ 4 [\wp(z,\tau)]^3 - g_2 \wp(z,\tau) - g_3 }.\]See also MathWorld [1067], Flint [837].
See also: https://dlmf.nist.gov/23.2
An example with real input for \(z\) and with purely imaginary input for \(\tau\), producing real output:
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 40; z = '0.1'; tau = '0.0 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_p_prime(z, tau); mx = mpm.weierstrass_p_prime(z, tau) >>> gx = gmp.weierstrass_p_prime(z, tau) >>> fx = fpm.weierstrass_p_prime(z, tau); ax = apm.weierstrass_p_prime(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax]) dec: -1.997612036772329460780279347633189585828E+3 mpm: -1.997612036772329460780279347633189585828e+3 gmp: -1.997612036772329460780279347633189585828E+03 fpm: -1.99761203677233E+03 apm: -1.997612036772329460780279347633189585828e+3 (-1.883e-38%)
An example with complex input for \(z\) and \(\tau\):
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 20; z = '0.1 + 0.5j'; tau = '0.7 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_p_prime(z, tau); mx = mpm.weierstrass_p_prime(z, tau) >>> gx = gmp.weierstrass_p_prime(z, tau) >>> fx = fpm.weierstrass_p_prime(z, tau); ax = apm.weierstrass_p_prime(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax], aligned=True) dec: 1.4787544521497118400E+1 mpm: 1.4787544521497118400e+1 gmp: 1.4787544521497118400E+01 fpm: 1.47875445214971E+01 apm: 1.4787544521497118399e+1 (5.664e-17%) - 2.3205214399360215619e+1 (-3.609e-17%)j
Inverse Weierstrass function \(\wp_{\omega}^{-1}(z| \omega_1, \omega_2)\)#
- ctxflint.weierstrass_p_inv_o(z, omega1, omega2)#
Computes the inverse of the Weierstrass elliptic function in terms of half-period \(\omega_1\) and elliptic period ratio \(\tau\). It which satisfies \(\wp(\wp^{-1}(z, \tau), \tau) = z\). This function is given by the elliptic integral
\[\wp^{-1}(z, \tau) = \frac{1}{2} \int_z^{\infty} \frac{\mathrm{d}t}{\sqrt{(t-e_1)(t-e_2)(t-e_3)}} = R_F(z-e_1,z-e_2,z-e_3).\]See also MathWorld [1062], Flint [837].
See also: https://dlmf.nist.gov/23.2
An example with real input for \(z\) and with purely imaginary input for \(\tau\), producing real output:
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 40; z = '100'; tau = '0.0 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_p_inv(z, tau); mx = mpm.weierstrass_p_inv(z, tau) >>> gx = gmp.weierstrass_p_inv(z, tau) >>> fx = fpm.weierstrass_p_inv(z, tau); ax = apm.weierstrass_p_inv(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax]) dec: 1.000602721184701332310197413726890982085E-1 mpm: 1.000602721184701332310197413726890982085e-1 gmp: 1.000602721184701332310197413726890982085E-01 fpm: 1.00060272118470E-01 apm: 1.000602721184701332310197413726890982085e-1 (7.17e-40%)
An example with complex input for \(z\) and \(\tau\):
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 20; z = '0.1 + 0.5j'; tau = '0.7 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_p_inv(z, tau); mx = mpm.weierstrass_p_inv(z, tau) >>> gx = gmp.weierstrass_p_inv(z, tau) >>> fx = fpm.weierstrass_p_inv(z, tau); ax = apm.weierstrass_p_inv(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax], aligned=True) dec: 4.2630465458606458544E-1 - 3.0967048559182771279E-1j mpm: 4.2630465458606458544e-1 - 3.0967048559182771279e-1j gmp: 4.2630465458606458544E-01 - 3.0967048559182771279E-01j fpm: 4.26304654586065E-01 - 3.09670485591828E-01j apm: 4.2630465458606458544e-1 (1.265e-16%) - 3.0967048559182771279e-1 (-1.063e-16%)j
Weierstrass Zeta function \(\zeta_{\omega}(z, \omega_1, \omega_2)\)#
- ctxflint.weierstrass_zeta_o(z, omega1, omega2)#
Computes the Weierstrass zeta function in terms of half-period \(\omega_1\) and elliptic period ratio \(\tau\).
We have \(\zeta(tz| t \omega, \tau) = t^{-1} \zeta(z| \omega, \tau)\).
The function can be defined as
\[\zeta(z| \omega, \tau) = \frac{1}{z} + \sum_{n^2+m^2 \ne 0} \left[ \frac{1}{z-m-n\tau} + \frac{1}{m+n\tau} + \frac{z}{(m+n\tau)^2} \right]\]and is quasiperiodic with \(\zeta(z + 1| \omega, \tau) = \zeta(z| \omega, \tau) + \zeta(1/2| \omega, \tau)\) and \(\zeta(z + \tau| \omega, \tau) = \zeta(z| \omega, \tau) + \zeta(\tau/2| \omega, \tau)\).
The function is related to \(\wp(z| \omega, \tau)\) by \(\displaystyle \frac{d \zeta(z| \omega, \tau)}{\mathrm{d}z} = -\wp(z| \omega, \tau)\) and \(\displaystyle \zeta(z| \omega, \tau) - z^{-1} = \int_0^z \left(\wp(z| \omega, \tau) - z^{-2} \right)\).
See also MathWorld [1069], Flint [837].
See also: https://dlmf.nist.gov/23.2
To evaluate the function efficiently, we use the formula
\[\zeta(z| \omega, \tau) = \frac{\pi z}{3} \frac{\theta_1'''(0,q)}{\theta_1'(0,q)} + \frac{\theta_1'(\pi z,q)}{\theta_1(\pi z,q)}\]An example with real input for \(z\) and with purely imaginary input for \(\tau\), producing real output:
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 40; z = '0.1'; tau = '0.0 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_zeta(z, tau); mx = mpm.weierstrass_zeta(z, tau) >>> gx = gmp.weierstrass_zeta(z, tau) >>> fx = fpm.weierstrass_zeta(z, tau); ax = apm.weierstrass_zeta(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax]) dec: 9.995978010353406976694591385190992698486E+0 mpm: 9.995978010353406976694591385190992698486e+0 gmp: 9.995978010353406976694591385190992698486E+00 fpm: 9.99597801035341E+00 apm: 9.995978010353406976694591385190992698486e+0 (1.654e-38%)
An example with complex input for \(z\) and \(\tau\):
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 20; z = '0.1 + 0.5j'; tau = '0.7 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_zeta(z, tau); mx = mpm.weierstrass_zeta(z, tau) >>> gx = gmp.weierstrass_zeta(z, tau) >>> fx = fpm.weierstrass_zeta(z, tau); ax = apm.weierstrass_zeta(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax], aligned=True) dec: 6.3880720497021003302E-1 - 2.0488020595059115066E+0j mpm: 6.3880720497021003302e-1 - 2.0488020595059115066e+0j gmp: 6.3880720497021003302E-01 - 2.0488020595059115066E+00j fpm: 6.38807204970210E-01 - 2.04880205950591E+00j apm: 6.3880720497021003302e-1 (4.323e-17%) - 2.0488020595059115066e+0 (-1.356e-17%)j
Weierstrass Sigma function \(\sigma_{\omega}(z| \omega_1, \omega_2)\)#
- ctxflint.weierstrass_sigma_o(z, omega1, omega2)#
Computes the Weierstrass sigma function in terms of half-period \(\omega_1\) and elliptic period ratio \(\tau\). We have \(\sigma(tz| t \omega, \tau) = t \sigma(z| \omega, \tau)\).
See also MathWorld [1068], Flint [837].
See also: https://dlmf.nist.gov/23.2
The function can be defined as
\[\sigma(z| \omega, \tau) = z \prod_{n^2+m^2 \ne 0} \left[ \left(1-\frac{z}{m+n\tau}\right) \exp\left(\frac{z}{m+n\tau} + \frac{z^2}{2(m+n\tau)^2} \right) \right]\]and is quasiperiodic with \(\sigma(z + 1| \omega, \tau) = -e^{2 \zeta(1/2| \omega, \tau) (z+1/2)} \sigma(z| \omega, \tau)\) and \(\sigma(z + \tau| \omega, \tau) = -e^{2 \zeta(\tau/2| \omega, \tau) (z+\tau/2)} \sigma(z| \omega, \tau)\).
The function is related to \(\zeta(z| \omega, \tau)\) by \(\displaystyle \frac{d}{\mathrm{d}z} \log \sigma(z| \omega, \tau) = \zeta(z| \omega, \tau)\).
See also MathWorld [1068], Flint [837].
To evaluate the function efficiently, we use the formula
\[\sigma(z, \tau) = \exp \left( -\frac{(\pi z)^2}{6} \frac{\theta_1'''(0,q)}{\theta_1'(0,q)} \right) \times \frac{\theta_1(\pi z,q)}{\theta_1'(\pi z,q)}\]An example with real input for \(z\) and with purely imaginary input for \(\tau\), producing real output:
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 40; z = '0.1'; tau = '0.0 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_sigma(z, tau); mx = mpm.weierstrass_sigma(z, tau) >>> gx = gmp.weierstrass_sigma(z, tau) >>> fx = fpm.weierstrass_sigma(z, tau); ax = apm.weierstrass_sigma(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax]) dec: 9.998992989830383649264433694319757846077E-2 mpm: 9.998992989830383649264433694319757846077e-2 gmp: 9.998992989830383649264433694319757846077E-02 fpm: 9.99899298983038E-02 apm: 9.998992989830383649264433694319757846077e-2 (5.023e-39%)
An example with complex input for \(z\) and \(\tau\):
>>> from xlcalcnet import dec, mpm, gmp, fpm, apm >>> mpm.dps = 20; z = '0.1 + 0.5j'; tau = '0.7 + 0.9j' >>> \mathrm{d}x = dec.weierstrass_sigma(z, tau); mx = mpm.weierstrass_sigma(z, tau) >>> gx = gmp.weierstrass_sigma(z, tau) >>> fx = fpm.weierstrass_sigma(z, tau); ax = apm.weierstrass_sigma(z, tau) >>> mpm.show([\mathrm{d}x, mx, gx, fx, ax], aligned=True) dec: 8.5052006352607515096E-2 + 5.1065892253350059290E-1j mpm: 8.5052006352607515096e-2 + 5.1065892253350059290e-1j gmp: 8.5052006352607515096E-02 + 5.1065892253350059290E-01j fpm: 8.50520063526075E-02 + 5.10658922533501E-01j apm: 8.5052006352607515096e-2 (3.71e-17%) + 5.1065892253350059290e-1 (6.22e-18%)j