final final M and N
system:sage


{{{id=2|
%python
@cached_function

def Cartier_matrix(E,p,b):
    r"""
    INPUT:
    - 'E' - Hyperelliptic Curve of the form y^2 = f(x)
    - 'p' - a prime number
    - 'b' - q=p^b
    OUTPUT:
    - 'M' The matrix M = (c_(pi-j)), f(x)^((p-1)/2) = \sum c_i x^i
  
  
    """
    
    #checks
    try: 
        p.is_prime()
    except ValueError:
        print "p must be prime";
    try: 
        p == 2
    except ValueError:
        print "p must be odd";  
              
    Fq=FiniteField(p**b,name='a');
    g = E.genus()
    
    
        
    C=E.change_ring(Fq)
    f,h = C.hyperelliptic_polynomials()  
      
    try: 
        h==0
    except ValueError:
        print "E must be of the form y^2 = f(x)"
        
    d = f.degree()
    try:
         d%2 == 0
    except ValueError:
        print "the degree of f is even"
        
    df=f.derivative()
    R=df.resultant(f)
    try:
        R == 0
    except ValueError:
        print "so curve is not smooth"    
    F = f**((p-1)/2)
    #coefficients returns a_0, ... , a_n where f(x) = a_n x^n + ... + a_0
    Coeff = F.list()
    #inserting zeros when necessary-- that is, when deg(F) < p*g-1, 
    #which is the highest powered coefficient needed for our matrix
    zeros = [0 for i in range(p*g-len(Coeff))]
    Coeff = Coeff + zeros
    
    M=[];
    for j in range(1,g+1):
        H=[Coeff[i] for i in range((p*j-g), (p*j))]
        H.reverse()
        M.append(H);
    return matrix(Fq,M), Coeff, g
///
}}}

{{{id=1|
%python
@cached_function

def Hasse_Witt(E,p,b):
    r"""
    INPUT:
    - 'M'- Cartier matrix.
    - 'g' -genus
    - 'p' -over the field of char p
    - 'b' - power of p, Fq,  
    
    OUTPUT:
    - 'N' - The matrix N = M M^(p)...M^(p^(g-1)) where M = (c_(pi-j)), f(x)^((p-1)/2) = \sum c_i x^i
    """
    try:
        M,Coeffs,g = Cartier_matrix.cache[((E,p,b),())]
    except:
        M,Coeffs,g = Cartier_matrix(E,p,b)
   
    Fq=FiniteField(p**b,name='c');
    
    def frob_mat(Coeffs, k):
        a = p**k
        mat = []
        Coeffs_pow = [c**a for c in Coeffs]
        for i in range(1,g+1):
            H=[(Coeffs[j]) for j in range((p*i-1), (p*i - g -1), -1)]
            mat.append(H);
        return matrix(Fq,mat)
        
    Mall = [M] + [frob_mat(Coeffs,k) for k in range(1,g)]
    
    #multiply to create the identity matrix    
    N = identity_matrix(Fq,g)
    for l in Mall:
        print N
        N = N*l;
    return N
///
}}}

{{{id=3|
def a_number(E,p,b):
    M, C, g =Cartier_matrix(E,p,b)
    a=g-rank(M);
    return a;
///
}}}

{{{id=4|
def p_rank(E,p,b):
    pr=rank(Hasse_Witt(E,p,b));
    return pr
///
}}}

{{{id=5|
P.<x>=QQ[];
E = HyperellipticCurve(x^11+x+1,0);
E2 = HyperellipticCurve(x^23-x,0);
E3 = HyperellipticCurve(x^51-x,0);
///
}}}

{{{id=9|
for p in srange(7,200):
    if p.is_prime():
        print p, timeit('Cartier_matrix(E,p,1)') ,timeit('Hasse_Witt(E,p,1)'), timeit('p_rank(E,p,1)'), timeit('a_number(E,p,1)')
///
WARNING: Output truncated!  
<html><a target='_new' href='/home/admin/104/cells/9/full_output.txt' class='file_link'>full_output.txt</a></html>



7 625 loops, best of 3: 854 µs per loop
None 625 loops, best of 3: 854 µs per loop
None 625 loops, best of 3: 884 µs per loop
None 625 loops, best of 3: 885 µs per loop
None
11 625 loops, best of 3: 852 µs per loop
None 625 loops, best of 3: 855 µs per loop
None 625 loops, best of 3: 883 µs per loop
None 625 loops, best of 3: 882 µs per loop
None
13 625 loops, best of 3: 850 µs per loop
None 625 loops, best of 3: 851 µs per loop
None 625 loops, best of 3: 881 µs per loop
None 625 loops, best of 3: 880 µs per loop
None
17 625 loops, best of 3: 846 µs per loop
None 625 loops, best of 3: 849 µs per loop
None 625 loops, best of 3: 878 µs per loop
None 625 loops, best of 3: 877 µs per loop
None
19 625 loops, best of 3: 847 µs per loop
None 625 loops, best of 3: 847 µs per loop
None 625 loops, best of 3: 874 µs per loop
None 625 loops, best of 3: 879 µs per loop
None
23 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 844 µs per loop
None 625 loops, best of 3: 873 µs per loop
None 625 loops, best of 3: 873 µs per loop
None
29 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 873 µs per loop
None 625 loops, best of 3: 875 µs per loop
None
31 625 loops, best of 3: 847 µs per loop
None 625 loops, best of 3: 848 µs per loop
None 625 loops, best of 3: 876 µs per loop
None 625 loops, best of 3: 880 µs per loop
None
37 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 846 µs per loop
None 625 loops, best of 3: 873 µs per loop
None 625 loops, best of 3: 875 µs per loop
None
41 625 loops, best of 3: 842 µs per loop
None 625 loops, best of 3: 843 µs per loop
None 625 loops, best of 3: 874 µs per loop
None 625 loops, best of 3: 873 µs per loop
None
43 625 loops, best of 3: 847 µs per loop
None 625 loops, best of 3: 844 µs per loop
None 625 loops, best of 3: 877 µs per loop
None 625 loops, best of 3: 875 µs per loop
None
47 625 loops, best of 3: 843 µs per loop
None 625 loops, best of 3: 846 µs per loop
None 625 loops, best of 3: 873 µs per loop
None 625 loops, best of 3: 875 µs per loop

...

149 625 loops, best of 3: 843 µs per loop
None 625 loops, best of 3: 843 µs per loop
None 625 loops, best of 3: 874 µs per loop
None 625 loops, best of 3: 873 µs per loop
None
151 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 844 µs per loop
None 625 loops, best of 3: 875 µs per loop
None 625 loops, best of 3: 876 µs per loop
None
157 625 loops, best of 3: 841 µs per loop
None 625 loops, best of 3: 842 µs per loop
None 625 loops, best of 3: 872 µs per loop
None 625 loops, best of 3: 874 µs per loop
None
163 625 loops, best of 3: 844 µs per loop
None 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 873 µs per loop
None 625 loops, best of 3: 874 µs per loop
None
167 625 loops, best of 3: 848 µs per loop
None 625 loops, best of 3: 846 µs per loop
None 625 loops, best of 3: 878 µs per loop
None 625 loops, best of 3: 879 µs per loop
None
173 625 loops, best of 3: 844 µs per loop
None 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 875 µs per loop
None 625 loops, best of 3: 877 µs per loop
None
179 625 loops, best of 3: 844 µs per loop
None 625 loops, best of 3: 843 µs per loop
None 625 loops, best of 3: 870 µs per loop
None 625 loops, best of 3: 871 µs per loop
None
181 625 loops, best of 3: 849 µs per loop
None 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 880 µs per loop
None 625 loops, best of 3: 880 µs per loop
None
191 625 loops, best of 3: 844 µs per loop
None 625 loops, best of 3: 847 µs per loop
None 625 loops, best of 3: 874 µs per loop
None 625 loops, best of 3: 877 µs per loop
None
193 625 loops, best of 3: 848 µs per loop
None 625 loops, best of 3: 848 µs per loop
None 625 loops, best of 3: 877 µs per loop
None 625 loops, best of 3: 875 µs per loop
None
197 625 loops, best of 3: 846 µs per loop
None 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 878 µs per loop
None 625 loops, best of 3: 877 µs per loop
None
199 625 loops, best of 3: 845 µs per loop
None 625 loops, best of 3: 846 µs per loop
None 625 loops, best of 3: 874 µs per loop
None 625 loops, best of 3: 878 µs per loop
None
}}}

{{{id=10|

///
}}}