modular_theta: detect pure real and imaginary cases (todo for jet)

This commit is contained in:
Fredrik Johansson 2017-02-17 06:18:17 +01:00
parent d6cc664f86
commit 01472aed72
2 changed files with 73 additions and 0 deletions

View file

@ -39,6 +39,14 @@ int main()
acb_randtest(tau, state, prec0, e0);
acb_randtest(z, state, prec0, e0);
arb_abs(acb_imagref(tau), acb_imagref(tau));
if (n_randint(state, 3) == 0)
arb_set_si(acb_realref(tau), -10 + n_randint(state, 20));
if (n_randint(state, 3) == 0)
arb_zero(acb_imagref(z));
if (n_randint(state, 3) == 0)
arb_zero(acb_realref(z));
acb_modular_theta(t1, t2, t3, t4, z, tau, prec1);
acb_modular_theta_notransform(t1b, t2b, t3b, t4b, z, tau, prec2);

View file

@ -55,6 +55,64 @@ acb_modular_theta(acb_t theta1, acb_t theta2,
acb_t z_prime, tau_prime, q, q4, w, A, B;
acb_struct thetas[4];
int w_is_unit, R[4], S[4], C;
int t1r, t1i, t2r, t2i, t3r, t4r;
if (!acb_is_finite(z) || !acb_is_finite(tau) ||
!arb_is_positive(acb_imagref(tau)))
{
acb_indeterminate(theta1);
acb_indeterminate(theta2);
acb_indeterminate(theta3);
acb_indeterminate(theta4);
return;
}
/*
special cases when real(tau) is an integer n:
z is real:
theta1 real if n mod 4 = 0
theta1 imaginary if n mod 4 = 2
theta2 real if n mod 4 = 0
theta2 imaginary if n mod 4 = 2
theta3 real always
theta4 real always
z is imaginary:
theta1 real if n mod 4 = 2
theta1 imaginary if n mod 4 = 0
theta2 real if n mod 4 = 0
theta2 imaginary if n mod 4 = 2
theta3 real always
theta4 real always
*/
t1r = t1i = t2r = t2i = t3r = t4r = 0;
if (arb_is_int(acb_realref(tau)))
{
int val;
if (arb_is_int_2exp_si(acb_realref(tau), 2))
val = 2;
else if (arb_is_int_2exp_si(acb_realref(tau), 1))
val = 1;
else
val = 0;
if (arb_is_zero(acb_imagref(z)))
{
t3r = t4r = 1;
if (val == 2) t1r = t2r = 1;
if (val == 1) t1i = t2i = 1;
}
if (arb_is_zero(acb_realref(z)))
{
t3r = t4r = 1;
if (val == 2) t1i = t2r = 1;
if (val == 1) t1r = t2i = 1;
}
}
psl2z_init(g);
fmpq_init(t);
@ -141,6 +199,13 @@ acb_modular_theta(acb_t theta1, acb_t theta2,
acb_mul(theta4, theta4, A, prec);
}
if (t1r) arb_zero(acb_imagref(theta1));
if (t1i) arb_zero(acb_realref(theta1));
if (t2r) arb_zero(acb_imagref(theta2));
if (t2i) arb_zero(acb_realref(theta2));
if (t3r) arb_zero(acb_imagref(theta3));
if (t4r) arb_zero(acb_imagref(theta4));
psl2z_clear(g);
fmpq_clear(t);
arf_clear(one_minus_eps);