Math Is Fun Forum

  Discussion about math, puzzles, games and fun.   Useful symbols: ÷ × ½ √ ∞ ≠ ≤ ≥ ≈ ⇒ ± ∈ Δ θ ∴ ∑ ∫ • π ƒ -¹ ² ³ °

You are not logged in.

#1 2025-02-21 16:23:57

lanxiyu
Member
Registered: 2022-05-10
Posts: 64

Mathematica test for Weierstrass functions

Special values:

Module[{w1, w2, w3, g2, g3, Δ, p, ζ, case},
	w1 = RandomReal[WorkingPrecision -> 50];
	z = w1*RandomReal[WorkingPrecision -> 50];
	p[z_] := WeierstrassP[z, {g2, g3}];
	ζ[z_] := WeierstrassZeta[z, {g2, g3}];
	case[t_] := (w3 = t*w1; w2 = -w1 - w3; {g2, g3} = WeierstrassInvariants[{w1, w3}]; Δ = g2^3 - 27*g3^2);

	case[I]; (* Lemniscatic cases *)
	Assert[ζ[w1] == Pi/(4*w1)];
	Assert[ζ[w3] == -I*Pi/(4*w1)];
	Assert[p[w1] == Gamma[1/4]^4/(32*Pi*w1^2)];
	Assert[p[w2] == 0];
	Assert[p[w3] == -Gamma[1/4]^4/(32*Pi*w1^2)];
	Assert[g2 == Gamma[1/4]^8/(16*Pi*w1^2)^2];
	Assert[g3 == 0];
	Assert[Δ == Gamma[1/4]^24/(16*Pi*w1^2)^6];
	Assert[g2^3/Δ == 1];
	Assert[p[(2/5)*w1] - p[(4/5)*w1] == Sqrt[GoldenRatio]*Gamma[1/4]^4/(16*Pi*w1^2)];
	With[{x = p[z], y = p'[z]},
		Assert[p[(1 + I)*z] == I*(g2/x - 4*x)/8];
		Assert[p'[(1 + I)*z] == -(1 + I)*y*(g2/x^2 + 4)/16];
		Assert[p[(1 + I)*z/2] == -I*x*(1 + Sqrt[4 - g2/x^2]/2)];
		Assert[z == x^(-1/2)*Hypergeometric2F1[1/4, 1/2, 5/4, g2/(4*x^2)]];
	];

	case[Exp[2*Pi*I/3]]; (* Equianharmonic cases *)
	Assert[ζ[w1] == Pi/(2*Sqrt[3]*w1)];
	Assert[ζ[w2] == Exp[2*Pi*I/3]*Pi/(2*Sqrt[3]*w1)];
	Assert[ζ[w3] == Exp[-2*Pi*I/3]*Pi/(2*Sqrt[3]*w1)];
	Assert[p[w1] == Gamma[1/3]^6/(2^(14/3)*(Pi*w1)^2)];
	Assert[p[w2] == Exp[-2*Pi*I/3]*Gamma[1/3]^6/(2^(14/3)*(Pi*w1)^2)];
	Assert[p[w3] == Exp[2*Pi*I/3]*Gamma[1/3]^6/(2^(14/3)*(Pi*w1)^2)];
	Assert[g2 == 0];
	Assert[g3 == Gamma[1/3]^18/(4*Pi*w1)^6];
	Assert[Δ == -27*Gamma[1/3]^36/(4*Pi*w1)^12];
	Assert[g2^3/Δ == 0];
	Assert[p[(2/5)*w1] - p[(4/5)*w1] == Sqrt[3]*5^(-1/12)*(2 + Sqrt[5])^(1/6)*Gamma[1/3]^6/(4*Pi*w1)^2];
	With[{x = p[z], y = p'[z]},
		Assert[p[I*Sqrt[3]*z] == 3^(-1)*(g3/x^2 - x)];
		Assert[p'[I*Sqrt[3]*z] == I*3^(-3/2)*y*(1 + 8*g3/(y^2 + g3))];
		Assert[p[I*z/Sqrt[3]] == -2^(-1)*x^(-1/2)*g3^(1/2)*Csc[ArcCsc[2*x^(3/2)*g3^(-1/2)]/3]];
		Assert[z == x^(-1/2)*Hypergeometric2F1[1/6, 1/2, 7/6, g3/(4*x^3)]];
	];

	case[I*Infinity]; (* Degenerate cases *)
	Assert[ζ[w1] == Pi^2/(12*w1)];
	Assert[p[w1] == (Pi/w1)^2/6];
	Assert[g2 == (Pi/w1)^4/12];
	Assert[g3 == (Pi/w1)^6/216];
	Assert[Δ == 0];
	Assert[p[(2/5)*w1] - p[(4/5)*w1] == 5^(-1/2)*(Pi/w1)^2]

	case[I*Sqrt[2]];
	Assert[ζ[w1] == (Gamma[1/8]*Gamma[3/8])^2/(384*Pi*w1) + Pi/(2^(5/2)*w1)];
	Assert[ζ[w3] == I*(Sqrt[2]*(Gamma[1/8]*Gamma[3/8])^2/(384*Pi*w1) - Pi/(4*w1))];
	Assert[p[w1] == (3 + Sqrt[2])*(Gamma[1/8]*Gamma[3/8])^2/(2^(13/2)*3*Pi*w1^2)];
	Assert[p[w2] == -(3 - Sqrt[2])*(Gamma[1/8]*Gamma[3/8])^2/(2^(13/2)*3*Pi*w1^2)];
	Assert[p[w3] == -(Gamma[1/8]*Gamma[3/8])^2/(2^5*3*Pi*w1^2)];
	Assert[g2 == 5*(Gamma[1/8]*Gamma[3/8])^4/(2^11*3*(Pi*w1^2)^2)];
	Assert[g3 == 7*(Gamma[1/8]*Gamma[3/8])^6/(2^16*(3*Pi*w1^2)^3)];
	Assert[Δ == (Gamma[1/8]*Gamma[3/8])^12/(2^33*(Pi*w1^2)^6)];
	Assert[g2^3/Δ == 125/27];

	case[I*Sqrt[3]];
	Assert[ζ[w1] == Gamma[1/3]^6/(2^(20/3)*Pi^2*w1) + Pi/(4*Sqrt[3]*w1)];
	Assert[ζ[w3] == I*(Sqrt[3]*Gamma[1/3]^6/(2^(20/3)*Pi^2*w1) - Pi/(4*w1))];
	Assert[p[w1] == (2*Sqrt[3] + 1)*Gamma[1/3]^6/(2^(20/3)*(Pi*w1)^2)];
	Assert[p[w2] == -Gamma[1/3]^6/(2^(17/3)*(Pi*w1)^2)];
	Assert[p[w3] == -(2*Sqrt[3] - 1)*Gamma[1/3]^6/(2^(20/3)*(Pi*w1)^2)];
	Assert[g2 == 15*Gamma[1/3]^12/(2^(34/3)*(Pi*w1)^4)];
	Assert[g3 == 11*Gamma[1/3]^18/(2^17*(Pi*w1)^6)];
	Assert[Δ == 27*Gamma[1/3]^36/(2^32*(Pi*w1)^12)];
	Assert[g2^3/Δ == 125/4];
] & // Block[{$AssertFunction = Automatic}, #[]] &;

Half period and Quarter period values:

Module[{w1, w2, w3, w4, g2, g3, Δ, e1, e2, e3, η1, η2, a, b, c, ϕ, p, ζ, σ},
	On[Assert];
	w1 = 1;
	w2 = I*Sqrt[Tan[RandomReal[WorkingPrecision -> 50]*Pi/2]];
	w3 = w1 + w2;
	w4 = w1 - w2;
	{g2, g3} = WeierstrassInvariants[{w1, w2}];
	Δ = g2^3 - 27*g3^2;

	p[z_] := WeierstrassP[z, {g2, g3}];
	ζ[z_] := WeierstrassZeta[z, {g2, g3}];
	σ[z__] := Times @@ WeierstrassSigma[{z}, {g2, g3}];

	(* Half period values *)
	{e1, e2, e3} = p[{w1, w2, w3}];
	{η1, η2} = ζ[{w1, w2}];
	Assert[4*#^3 - g2*# - g3 == 0] & /@ {e1, e2, e3};
	Assert[e1 + e2 + e3 == 0];
	Assert[g2 == 2*(e1^2 + e2^2 + e3^2) == -4*(e1*e2 + e1*e3 + e2*e3)];
	Assert[g3 == 4*e1*e2*e3 == (4/3)*(e1^3 + e2^3 + e3^3)];
	Assert[Δ == 16*(e1 - e2)^2*(e1 - e3)^2*(e2 - e3)^2];
	Assert[Δ == #^2*(4*#^2 - 3*g2)^2] & /@ (Subtract @@@ Permutations[{e1, e2, e3}, {2}]);
	Assert[4*(e1 - e2)*(e1 - e3) == 12*e1^2 - g2];
	Assert[4*(e2 - e3)*(e2 - e1) == 12*e2^2 - g2];
	Assert[4*(e3 - e1)*(e3 - e2) == 12*e3^2 - g2];
	Assert[p'[#] == 0] & /@ {w1, w2, w3};
	a = Sqrt[g2/3];
	ϕ = ArcSin[g3/a^3]/3;
	Assert[e1 ==  a*Cos[Pi/6 - ϕ]];
	Assert[e2 == -a*Cos[Pi/6 + ϕ]];
	Assert[e3 == -a*Sin[ϕ]];
	Assert[ζ[w3] == η1 + η2];
	Assert[ζ[w4] == η1 - η2];
	Assert[σ[w1] == Sqrt[2]*E^((1/2)*w1*η1)/(12*e1^2 - g2)^(1/4)];
	Assert[σ[w2] == I*Sqrt[2]*E^((1/2)*w2*η2)/(12*e2^2 - g2)^(1/4)];

	(* Quarter period values *)
	a = Sqrt[e1 - e2];
	b = Sqrt[e1 - e3];
	c = Sqrt[e3 - e2];
	Assert[p[(1/2)*w1] == e1 + a*b];
	Assert[p[(1/2)*w2] == e2 - a*c];
	Assert[p[(1/2)*w3] == e3 - I*b*c];
	Assert[p[(1/2)*w4] == e3 + I*b*c];
	Assert[p[(1/2)*w1 + w2] == e1 - a*b];
	Assert[p[(1/2)*w2 + w1] == e2 + a*c];
	Assert[p'[(1/2)*w1] == -2*a*b*(a + b)];
	Assert[p'[(1/2)*w2] == -2*I*a*c*(a + c)];
	Assert[p'[(1/2)*w3] == 2*b*c*(b + I*c)];
	Assert[p'[(1/2)*w4] == 2*b*c*(b - I*c)];
	Assert[p'[(1/2)*w1 + w2] == 2*a*b*(a - b)];
	Assert[p'[(1/2)*w2 + w1] == 2*I*a*c*(a - c)];
	Assert[ζ[(1/2)*w1] == (1/2)*(ζ[w1] + (a + b))];
	Assert[ζ[(1/2)*w2] == (1/2)*(ζ[w2] - I*(a + c))];
	Assert[σ[(1/2)*w1] == E^((1/8)*w1*η1)/(2^(1/4)*(a + b)^(1/4)*(a*b)^(3/8))];
	Assert[σ[(1/2)*w2] == I*E^((1/8)*w2*η2)/(2^(1/4)*(a + c)^(1/4)*(a*c)^(3/8))];

	(* Dedekind eta function representations *)
	With[{τ = w2/w1, η = DedekindEta},
		Assert[e1 ==  (Pi/w1)^2*((η[τ/2]^8 +  8*η[2*τ]^8)/η[τ]^4)/6];
		Assert[e2 == -(Pi/w1)^2*((η[τ/2]^8 + 32*η[2*τ]^8)/η[τ]^4)/12];
		Assert[e3 == -(Pi/w1)^2*((η[τ/2]^8 - 16*η[2*τ]^8)/η[τ]^4)/12];
	];
] & // Block[{$AssertFunction = Automatic}, #[]] &;

One-third period values:

Module[{w1, w2, w3, w4, g2, g3, Δ, x, y, η1, η2, cbrtΔ, a0, a1, a2, a3, a4, p, ζ, σ},
	w1 = 1;
	w2 = I*Sqrt[Tan[RandomReal[WorkingPrecision -> 50]*Pi/2]];
	w3 = w1 + w2;
	w4 = w1 - w2;
	{g2, g3} = WeierstrassInvariants[{w1, w2}];
	Δ = g2^3 - 27*g3^2;

	p[z_] := WeierstrassP[z, {g2, g3}];
	ζ[z_] := WeierstrassZeta[z, {g2, g3}];
	σ[z__] := Times @@ WeierstrassSigma[{z}, {g2, g3}];

	{x, y} = Through[{p, p'}[(2/3)*{w1, w2, w3, w4}]];
	Assert[#^4 - (1/2)*g2*#^2 - g3*# - (1/48)*g2^2 == 0] & /@ x;
	Assert[#^8 - 8*g3*#^6 - (2/3)*Δ*#^4 - (1/27)*Δ^2 == 0] & /@ Join[y, -y];
	Assert[g2 == Total[x^2]];
	Assert[g3 == Total[x^3]/3 == Total[y^2]/8];
	Assert[Δ == -I*3^(3/2)*(Times @@ y)];
	cbrtΔ = CubeRoot[Δ];
	a0 = (g2 - cbrtΔ)/3;
	a1 = Sign[g3]*Sqrt[a0];
	a2 = 2*If[a1 == 0, g2/Sqrt[3], g3/a1];
	a3 = g2 - a0;
	a4 = Sqrt[a2 - a0 - cbrtΔ];
	Assert[x[[1]] == (a1 + Sqrt[a2 + a3])/2];
	Assert[x[[2]] == (a1 - Sqrt[a2 + a3])/2];
	Assert[x[[3]] == (-a1 - I*Sqrt[a2 - a3])/2];
	Assert[x[[4]] == (-a1 + I*Sqrt[a2 - a3])/2];
	Assert[y[[1]] == -cbrtΔ/(Sqrt[3]*Sqrt[a4 - a1])];
	Assert[y[[2]] == -I*cbrtΔ/(Sqrt[3]*Sqrt[a4 + a1])];
	{η1, η2} = ζ[{w1, w2}];
	Assert[ζ[(2/3)*w1] == (2/3)*η1 + Sqrt[x[[1]]]/Sqrt[3]];
	Assert[ζ[(2/3)*w2] == (2/3)*η2 - I*Sqrt[-x[[2]]]/Sqrt[3]];
	Assert[σ[(2/3)*w1] == E^((2/9)*w1*η1)/(-y[[1]])^(1/3)];
	Assert[σ[(2/3)*w2] == I*E^((2/9)*w2*η2)/(I*y[[2]])^(1/3)];

	(* Dedekind eta function representations *)
	With[{τ = w2/w1, η = DedekindEta},
		Assert[x[[1]] ==  (Pi*(η[τ/3]^3 + 3*η[3*τ]^3)/(w1*η[τ]))^2/4];
		Assert[x[[2]] == -(Pi*(η[τ/3]^3 + 9*η[3*τ]^3)/(w1*η[τ]))^2/12];
		Assert[x[[3]] == -(Pi*(η[τ/3]^3 + I*3^(3/2)*η[3*τ]^3)/(w1*η[τ]))^2/12];
		Assert[x[[4]] == -(Pi*(η[τ/3]^3 - I*3^(3/2)*η[3*τ]^3)/(w1*η[τ]))^2/12];
		Assert[y[[1]] == -(Pi*η[τ]^3/(Sqrt[3]*w1*η[3*τ]))^3];
		Assert[y[[2]] == -I*(Pi*η[τ]^3/(w1*η[τ/3]))^3];
		Assert[y[[3]] == Sqrt[ I]*(Pi*η[τ]^3/(w1*η[(τ+1)/3]))^3];
		Assert[y[[4]] == Sqrt[-I]*(Pi*η[τ]^3/(w1*η[(τ-1)/3]))^3];
	];
] & // Block[{$AssertFunction = Automatic}, #[]] &;

One-fifth period values:

Module[{w1, w2, g2, g3, Δ, p, ζ, σ},
	w1 = 1;
	w2 = I*Sqrt[Tan[RandomReal[WorkingPrecision -> 50]*Pi/2]];
	{g2, g3} = WeierstrassInvariants[{w1, w2}];
	Δ = g2^3 - 27*g3^2;

	p[z_] := WeierstrassP[z, {g2, g3}];
	ζ[z_] := WeierstrassZeta[z, {g2, g3}];
	σ[z__] := Times @@ WeierstrassSigma[{z}, {g2, g3}];

	Module[{x, y, sqrtx, t, a},
		{x, y} = p[(2/5)*#] + {-1, 1}*p[(4/5)*#];
		t = Sign[#];
		sqrtx = Sqrt[t^2*x]/t;
		t = Δ/x^6;
		a = 3*y/x + (11 + t)/2;
		Assert[x^12 - (12/5)*g2*x^10 + 2*Δ*x^6 + (1/5)*Δ^2 == 0];
		Assert[y == x*Sqrt[5^3 + 22*t + t^2]/6];
		Assert[p[(2/5)*#] == (y + x)/2 == x*(2/a + 17 + t)/12];
		Assert[p[(4/5)*#] == (y - x)/2 == x*(2/a +  5 + t)/12];
		Assert[p'[(2/5)*#] == -sqrtx^3*a^( 1/2)];
		Assert[p'[(4/5)*#] == -sqrtx^3*a^(-1/2)];
		Assert[ζ[(2/5)*#] == (2/5)*ζ[#] + sqrtx*(1 + 3*a)/(10*Sqrt[a])];
		Assert[ζ[(4/5)*#] == (4/5)*ζ[#] - sqrtx*(3 - 1*a)/(10*Sqrt[a])];
		Assert[σ[(2/5)*#] == E^((2/25)*#*ζ[#])*a^(-1/10)/sqrtx];
		Assert[σ[(4/5)*#] == E^((8/25)*#*ζ[#])*a^( 1/10)/sqrtx];
		(* https://mathworld.wolfram.com/AbelsImpossibilityTheorem.html *)
	] & /@ {w1, w2};

	(* Dedekind eta function representations *)
	With[{τ = w2/w1, η = DedekindEta},
		Assert[p[(2/5)*w1] - p[(4/5)*w1] == (Pi/w1)^2*η[τ]^5/(Sqrt[5]*η[5*τ])];
		Assert[p[(2/5)*w2] - p[(4/5)*w2] == -(Pi/w1)^2*η[τ]^5/η[τ/5]];
	];

	(* Hypergeometric series representations *)
	With[{t = g3*(3/g2)^(3/2), f = (Times @@ Hypergeometric2F1[1/6, 5/6, {4/5, 6/5}, #]) &},
		Assert[p[(2/5)*w1] - p[(4/5)*w1] ==  2*Sqrt[(3/5)*g2]/f[(1 - t)/2]];
		Assert[p[(2/5)*w2] - p[(4/5)*w2] == -2*Sqrt[(3/5)*g2]/f[(1 + t)/2]];
	];
] & // Block[{$AssertFunction = Automatic}, #[]] &;

Sigma function notation:

Module[{z, a, b, c0, c1, c2, w1, w2, g2, g3, d, p, ζ, σ},
	w1 = 1;
	w2 = I*Sqrt[Tan[RandomReal[WorkingPrecision -> 50]*Pi/2]];
	{g2, g3} = WeierstrassInvariants[{w1, w2}];
	z = w1*(2*RandomReal[WorkingPrecision -> 50] - 1);
	a = w1*(2*RandomReal[WorkingPrecision -> 50] - 1);
	b = w1*(2*RandomReal[WorkingPrecision -> 50] - 1);
	c0 = a - b;

	p[z_] := WeierstrassP[z, {g2, g3}];
	ζ[z_] := WeierstrassZeta[z, {g2, g3}];
	σ[z__] := Times @@ WeierstrassSigma[{z}, {g2, g3}];

	With[{wp = p[c0], pd = p'[c0]},
		c1 = InverseWeierstrassP[{(-wp + Sqrt[g2 - 3*wp^2])/2, pd}, {g2, g3}];
		c2 = -c0 - c1;
	];

	Assert[ζ[z + a] - ζ[z - a] == 2*ζ[a] - σ[2*a, z, z]/σ[z + a, z - a, a, a]];

	d = ζ[a - b];
	Assert[ζ[z + a] - ζ[z + b] ==  d - σ[a - b, z + a + c1, z + b - c1]/σ[z + a, z + b, c1, c2]];
	Assert[ζ[z - a] - ζ[z - b] == -d + σ[a - b, z - a - c1, z - b + c1]/σ[z - a, z - b, c1, c2]];
	Assert[ζ[z + a] - ζ[z + b] ==  d - (σ[2*(z + b), z + a, z + a]/σ[z + b, z + b] + σ[2*(z + a), z + b, z + b]/σ[z + a, z + a])/(2*σ[a - b, 2*z + a + b])];
	Assert[ζ[z - a] - ζ[z - b] == -d + (σ[2*(z - b), z - a, z - a]/σ[z - b, z - b] + σ[2*(z - a), z - b, z - b]/σ[z - a, z - a])/(2*σ[a - b, 2*z - a - b])];

	d = ζ[a - b] + (3*p[a - b]^2 - g2/4)/p'[a - b];
	Assert[ζ[z + a] - ζ[z + b] ==  d + σ[z - a + 2*b, z - b + 2*a]/σ[z + a, z + b, 2*(a - b)]];
	Assert[ζ[z - a] - ζ[z - b] == -d - σ[z + a - 2*b, z + b - 2*a]/σ[z - a, z - b, 2*(a - b)]];
] & // Block[{$AssertFunction = Automatic}, #[]] &;

Relations to Jacobi elliptic functions:

Module[{z, p, s, c, d, n, ϕ, g2, g3, m, w1, w2},
	m = RandomReal[WorkingPrecision -> 50];
	w1 = EllipticK[m];
	w2 = I*EllipticK[1 - m];
	z = w1*RandomReal[WorkingPrecision -> 50];
	With[{t = m*(1 - m)},
		g2 = (4/3)*(1 - t);
		g3 = (4/27)*(1 - 2*m)*(2 + t);
	];
	Assert[WeierstrassInvariants[{w1, w2}] == {g2, g3}];
	p = WeierstrassP[z/2, {g2, g3}];
	s = WeierstrassPPrime[z/2, {g2, g3}];
	c = 1 - m - (p - (2 - m)/3)^2;
	d = m*(m - 1) - (p + (1 - 2*m)/3)^2;
	n = m - (p + (1 + m)/3)^2;
	ϕ = -2*ArcTan[2*(p + (1 - 2*m)/3)/s];
	Assert[JacobiSN[z, m] == s/n];
	Assert[JacobiCN[z, m] == c/n];
	Assert[JacobiDN[z, m] == d/n];
	Assert[PossibleZeroQ@Mod[JacobiAmplitude[z, m] - ϕ, 2*Pi, -Pi]];
	Assert[PossibleZeroQ@Mod[EllipticF[ϕ, m] - z, 2*w1, -w1]];
	With[{ζ = WeierstrassZeta[#, {g2, g3}] &}, 
		Assert[JacobiZeta[ϕ, m] == ζ[z + w2] - ζ[w2] - z*ζ[w1]/w1];
		Assert[EllipticE[m] == ζ[w1] + w1*(2 - m)/3];
		Assert[I*EllipticE[1 - m] == -ζ[w2] + w2*(1 + m)/3];
	];
	Assert[WeierstrassP[z, {g2, g3}] == Csc[ϕ]^2 - (1 + m)/3 == Cot[ϕ]^2 + (2 - m)/3];
	Assert[WeierstrassPPrime[z, {g2, g3}] == -2*Csc[ϕ]^2*Cot[ϕ]*Sqrt[1 - m*Sin[ϕ]^2]];
] & // Block[{$AssertFunction = Automatic}, #[]] &;

Last edited by lanxiyu (2025-04-13 10:05:16)

Offline

Board footer

Powered by FluxBB