This repository was archived by the owner on Nov 15, 2024. It is now read-only.
forked from steffenmueller/QCMod
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhowe_zhu.m
99 lines (94 loc) · 3.24 KB
/
howe_zhu.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
freeze;
// Given a curve over the rationals, check whether its Jacobian is absolutely irreducible
//
function has_abs_irred_jac_fin_g2(C)
// C is a curve defined over a finite field F_q
// Check if the Jacobian of C is absolutely irreducible, using Theorem 6 of
// Howe-Zhu "On the existence of absolutely simple abelian varieties
// of a given dimension over an arbitrary field"
Fq := BaseRing(C);
g := Genus(C);
Z := ZetaFunction(C);
f := Reverse(Numerator(Z)); // Weil poly
if not IsIrreducible(f) then
vprintf QCMod: "Reducible over %o\n", Fq;
return false;
end if;
q := #Fq;
a := Coefficient(f, 3);
b := Coefficient(f, 2);
if a ne 0 and a^2 ne q+b and a^2 ne 2*b and a^2 ne 3*b-3*q then
return true;
else
return false;
end if;
end function;
function has_abs_irred_jac_fin(C)
// C is defined over a finite field F_q
// Check if the Jacobian of C is absolutely irreducible, using Proposition 3 of
// Howe-Zhu "On the existence of absolutely simple abelian varieties
// of a given dimension over an arbitrary field"
// See Lemma 3.1 of Smith "Families of explicit isogenies of hyperelliptic Jacobians"
Fq := BaseRing(C);
g := Genus(C);
Z := ZetaFunction(C);
f := Reverse(Numerator(Z));
if not IsIrreducible(f) then
vprintf QCMod: "Reducible over %o\n", Fq;
return false;
end if;
K<pi> := NumberField(f);
// phi(n) \ge sqrt(n)/sqrt(2)
// d in D => phi(d) | 2g
D := [d : d in [2..8*g^2] | IsDivisibleBy(2*g, EulerPhi(d))];
for d in D do
if &and[IsZero(Coefficient(f, n)) : n in [0..2*g] | n mod d ne 0] then
vprintf QCMod: "(1) happening \n";
return false;
else
L := sub< K | pi^d>;
if Degree(L) lt Degree(K) then
rts := Roots(ChangeRing(CyclotomicPolynomial(d), K));
if not IsEmpty(rts) then
for rt in [t[1] : t in rts] do
M := sub<K | [pi^d, rt]>;
if IsIsomorphic(K, M) then
vprintf QCMod, 2: "(2) happening\n";
return false;
end if;
end for;
end if;
end if;
end if;
end for;
return true;
end function;
intrinsic HasAbsolutelyIrreducibleJacobian(C::Crv, bound::RngIntElt)
-> BoolElt, RngIntElt
{Implements the criterion of Howe-Zhu, `On the existence of absolutely simple abelian varieties
of a given dimension over an arbitrary field`, JNT 2002, to show that abelian varieties are
absolutely simple.}
// C is defined over Q
// Check if the Jacobian of C is absolutely irreducible, by checking if its reduction
// mod some prime of good reduction is absolutely irreducible.
// Try all primes below bound.
p := 2;
g := Genus(C);
while p lt bound do
Cp := ChangeRing(C, GF(p));
if not IsSingular(Cp) and not HasSingularPointsOverExtension(Cp) then
/*
if g eq 2 then
if is_good_ordinary(C, p) then
vprintf QCMod: "Trying prime %o\n", p;
//if has_abs_irred_jac_fin_g2(Cp) then return true, p; end if;
end if;
else
*/
vprintf QCMod: "Trying prime %o\n", p;
if has_abs_irred_jac_fin(Cp) then return true, p; end if;
end if;
p := NextPrime(p);
end while;
return false, 0; // This doesn't mean that the Jacobian isn't absolutely irreducible!
end intrinsic;