Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

All published worksheets from http://sagenb.org

Views: 168699
Image: ubuntu2004
def gauss_sums(n): p=next_prime(n-1) a=primitive_root(p) b=1 powers=[] for t in range(1,p): b=(b*a) % p powers.append(b) zeta_p=exp(2*pi*I/p).n() zeta_p1=exp(2*pi*I/(p-1)).n() p_roots=[zeta_p^t for t in range(0,p)] p1_roots=[zeta_p1^t for t in range(0,p-1)] gauss=[] for t in range(1,p-1): gsum=sum(p1_roots[(t*u)%(p-1)]*p_roots[powers[u]] for u in range(0,p-1)) gauss.append(gsum) return gauss
# plots all normalized gauss sums over Fp, Fp=next_prime(n) def plot_gauss_sums(n): p=next_prime(n-1).n() gauss=gauss_sums(n) points=[i/sqrt(p) for i in gauss] P=circle((0,0),1,aspect_ratio=1,axes=false) P+=point(i for i in points) return P
def vert_legendre_family(n): p=next_prime(n-1) normalization=2*sqrt(p.n()) legendre_symbols=[legendre_symbol(a,p) for a in range(p)] legendre_family=[] for a in range(2,p): sum_legendre=sum(legendre_symbols[(t*(t-1)*(t-a))%p] for t in range(2,p)) legendre_family.append(sum_legendre/normalization) return legendre_family
# plots the number of points of the Legendre family y^2=x(x-1)(x-t) over Fp def plot_vert_legendre_family(n): v=vert_legendre_family(n) return sum(point((x,sum([ZZ(j<x) for j in v])/len(v))) for x in srange(-1,1,0.01))
def vert_kloosterman(n): p=next_prime(n-1) k=GF(p) normalization=2*sqrt(p.n()) zeta_p=exp(2*pi*I/p).n() zeta_powers=[zeta_p^i for i in range(p)] inverses=[inverse_mod(a,p) for a in range(1,p)] kloosterman=[] for a in range(1,p): sum_kloosterman=sum(zeta_powers[k(t)+k(a)*inverses[t-1]] for t in range(1,p)) kloosterman.append(sum_kloosterman/normalization) return kloosterman
# plots the number of points of the family of two-variable Kloosterman sums over Fp def plot_vert_kloosterman(n): v=vert_kloosterman(n) return sum(point((x,sum([ZZ(j<x) for j in v])/len(v))) for x in srange(-1,1,0.01))
def horiz_kloosterman(n): list_of_primes=primes_first_n(n) kloosterman=[] for p in list_of_primes: normalization=2*sqrt(p.n()) sum_kloosterman=sum(exp(2*pi*I*(t+inverse_mod(t,p))/p).n() for t in range(1,p)) kloosterman.append(sum_kloosterman/normalization) return kloosterman
# plots the horizontal family of two-variable Kloosterman sums up to the nth prime def plot_horiz_kloosterman(n): v=horiz_kloosterman(n) return sum(point((x,sum([ZZ(j<x) for j in v])/len(v))) for x in srange(-1,1,0.01))
def sato_tate(): ST=plot((1/2*sqrt(-x^2 + 4)*x + 2*arcsin(1/2*x))/(2*pi)+0.5,x,-2,2) return ST
plot_gauss_sums(5)
plot_gauss_sums(10)
plot_gauss_sums(50)
plot_gauss_sums(100)
plot_gauss_sums(500)
plot_gauss_sums(1000)
sato_tate()
plot_vert_kloosterman(10)
plot_vert_kloosterman(50)
plot_vert_kloosterman(100)
plot_vert_kloosterman(500)
plot_vert_kloosterman(1000)
plot_horiz_kloosterman(10)
plot_vert_kloosterman(50)
plot_vert_kloosterman(100)
plot_vert_kloosterman(500)
plot_vert_kloosterman(1000)