Kamiennys Criterion¶
Kamienny’s Criterion
AUTHORS:
William Stein, February 2010
Maarten Derickx, 2010-2017
- class mdsage.kamiennys_criterion.KamiennyCriterion(p, congruence_type=1, sign=1, algorithm='custom', verbose=False, dump_dir=None)¶
Bases:
object
This class if for verification of Kamienny’s criterion for arbitrary fields using ell=2 for arbitrary level.
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(31); C Kamienny's Criterion for p=31 sage: C.dbd(2) 26 x 26 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries) sage: C.dbd(2)^15==1 True sage: C.T(2) 26 x 26 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries) sage: C.t1(n=3) 26 x 26 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries) sage: C.t2() 26 x 26 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries) sage: C.t() 26 x 26 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries)
- T¶
File: mdsage/kamiennys_criterion.py (starting at line 562)
Return matrix mod 2 of the n-th Hecke operator on the +1 quotient of cuspidal modular symbols.
INPUT:
n – integer
OUTPUT:
matrix modulo 2
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(29) sage: C.T(2) 22 x 22 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries) sage: C.T(2)[0] (0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0)
- coset_representatives_H¶
File: mdsage/kamiennys_criterion.py (starting at line 472)
Return representatives of Z/NZ^*/H where H is a subgroup of the diamond operators and N is the level. H=Z/NZ^* for Gamma0 and H=1 for Gamma1
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(GammaH(31,[3^5])) sage: C.coset_representatives_H() (1, 2, 3, 4, 8) sage: C = KamiennyCriterion(13)
- dbd(d)¶
Return matrix of <d>.
INPUT:
d – integer
OUTPUT:
a matrix modulo 2
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(29) sage: C.dbd(2) 22 x 22 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries) sage: C.dbd(2)^14==1 True sage: C.dbd(2)[0] (0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
- dependencies(t, k, l, v)¶
Return the vectorspace of dependencies between the t*dbd(d)*T(i)*v with d a set of coset representatives of (Z/NZ)*/(+/-H) and 0<i<=kl, and t*T(l+1),…,t*T(k)
INPUT:
k – integer the size of the largest partion occuring in the partitions you want to check
l – integer which is larger then or equal to the second larges partition
- hecke_polynomial¶
File: mdsage/kamiennys_criterion.py (starting at line 678)
- integral_cuspidal_subspace()¶
In certatain cases this might return the integral structure of the cuspidal subspace. This code is mainly a way to compute the integral structe faster than sage does now. It returns None if it cannot find the integral subspace.
- is_independent(v)¶
Return True if the Hecke operators in v are independent.
INPUT:
v – four elements of the Hecke algebra mod 2 (represented as matrices)
OUTPUT:
bool
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(29) sage: C.is_independent([C.T(1), C.T(2), C.T(3), C.T(4)]) True sage: C.is_independent([C.T(1), C.T(2), C.T(3), C.T(1)+C.T(3)]) False
- t(n=5, p=65521, q=3)¶
Return mod 2 matrix t, using n, p and q as options for t1 and t2. This is just the product of self.t1() and self.t2(). If p=None it uses t1 else it uses t1_prime
INPUT:
n – integer (optional default=5), used in computing t1
p – prime (optional default=46337), used in computing t1
q – prime (optional default=3), used in computing t2
OUTPUT:
a mod 2 matrix
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(29) sage: C.t()[0] (1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0)
- t1(n=5)¶
Return choice of element t1 of the Hecke algebra mod 2, computed using the Hecke operator $T_n$, where n is self.n
INPUT:
n – integer (optional default=5)
OUTPUT:
a mod 2 matrix
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(29) sage: C.t1(n=3) 22 x 22 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries) sage: C.t1(n=3) == 1 True sage: C.t1() Traceback (most recent call last): ... ValueError: T_5 needs to be a generator of the hecke algebra sage: C = KamiennyCriterion(37) sage: C.t1()[0] (1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1)
- t1_prime¶
File: mdsage/kamiennys_criterion.py (starting at line 682)
Return a multiple of element t1 of the Hecke algebra mod 2, computed using the Hecke operator $T_n$, where n is self.n. To make computation faster we only check if …==0 mod p. Hence J will contain more elements, hence we get a multiple.
INPUT:
n – integer (optional default=5)
p – prime (optional default=65521)
OUTPUT:
a mod 2 matrix
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(29) sage: C.t1_prime() 22 x 22 dense matrix over Finite Field of size 2 (use the '.str()' method to see the entries) sage: C.t1_prime(n=3) == 1 True sage: C = KamiennyCriterion(37) sage: C.t1_prime()[0] (1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1)
- t2(q=3)¶
Return mod 2 matrix t2 computed using the current choice of prime q, as returned by self.q.
INPUT:
q – integer
OUTPUT:
a mod 2 matrix
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(29) sage: C.t2()[0] (0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1)
- tdbdTi(t, k, v)¶
Return a list of lists which contains precomputed values of t*dbd(d)*T(i)*v with d a set of coset representatives of (Z/NZ)*/(+/-H) and 0<i<=k
INPUT:
k – integer
OUTPUT:
a list of lists containing hecke operators
EXAMPLES:
sage: from mdsage import * sage: C = KamiennyCriterion(29,verbose=False) sage: Id=C.t().parent().identity_matrix() sage: C.t()==C.tdbdTi(C.t(),2,Id)[0][0] True sage: C.t()*C.T(2)==C.tdbdTi(C.t(),2,Id)[1][0] True sage: C.t()*C.dbd(2)*C.T(2)==C.tdbdTi(C.t(),2,Id)[1][1] True
- verify_criterion(d, t=None, n=5, p=65521, q=3, v=None, use_rand_vec=False, verbose=False)¶
Attempt to verify the criterion at p using the input t. If t is not given compute it using n, p and q
INPUT:
t – hecke operator (optional default=None)
n – integer (optional default=5), used in computing t1
p – prime (optional default=46337), used in computing t1
q – prime (optional default=3), used in computing t2
verbose – bool (default: True); if true, print to stdout as the computation is performed.
OUTPUT:
bool – True if criterion satisfied; otherwise, False
string – message about what happened or went wrong
EXAMPLES:
We can’t get p=29 to work no matter what I try, which nicely illustrates the various ways the criterion can fail:
sage: from mdsage import * sage: C = KamiennyCriterion(29) sage: C.verify_criterion(4,n=5) dependency dimension to large to search through (False, 'There is a dependency of weigt 2 in dependencies(3,1)', [Vector space of degree 4 and dimension 0 over Finite Field of size 2 Basis matrix: [], Vector space of degree 16 and dimension 8 over Finite Field of size 2 Basis matrix: [1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0] [0 1 0 0 0 0 1 0 1 1 0 1 1 1 0 0] [0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0] [0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0] [0 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0] [0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0] [0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0], Vector space of degree 28 and dimension 19 over Finite Field of size 2 Basis matrix: [1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1] [0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0] [0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0] [0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0] [0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0] [0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1] [0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1] [0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 1] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0]])
With p=43 the criterion is satisfied for d=4, thus proving that 43 is not the order of a torsion point on any elliptic curve over a quartic field:
sage: C = KamiennyCriterion(43); C Kamienny's Criterion for p=43 sage: C.verify_criterion(4) (True, 'All conditions are satified for Gamma1 d=4 p=43. Using n=5, modp=65521, q=3 in Kamienny Version 1.5 and SageMath version ...', [Vector space of degree 4 and dimension 0 over Finite Field of size 2 Basis matrix: [], Vector space of degree 23 and dimension 2 over Finite Field of size 2 Basis matrix: [1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 0 0] [0 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0], Vector space of degree 42 and dimension 11 over Finite Field of size 2 Basis matrix: [1 0 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1] [0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 0] [0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0] [0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0] [0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0] [0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1] [0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1] [0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 0]])
- mdsage.kamiennys_criterion.matrix_modp(A, p=2, sparse=False)¶
Reduce a matrix mod p (default 2). We use this function, since there are bugs in the mod 2 matrix reduction in sage. See trac ticket #sage_trac/ticket/6904
INPUT:
A – matrix
p – prime
OUTPUT:
a matrix over GF(p).
EXAMPLES:
sage: from mdsage import * sage: matrix_modp(matrix(QQ,2,[1,3,5,2/3])) [1 1] [1 0]
- mdsage.kamiennys_criterion.open_database(location, verbose=False)¶
Creates an sqlite database at location, ready for storing data computed by this criterion, or if it already exists it opens it.
- mdsage.kamiennys_criterion.run_criterion(result_table, iterator, congruence_type, algorithm='default', verbose=False)¶
The iterator should spit out things of the form (torsion_order,degree,t1n,t1mod,t2q)