{{{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.=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! full_output.txt 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| /// }}}