ubuntu2404
## -*- encoding: utf-8 -*-1## This file (main.sagetex.sage) was *autogenerated* from main.tex with sagetex.sty version 2021/10/16 v3.6.2import sagetex3_st_ = sagetex.SageTeXProcessor('main', version='2021/10/16 v3.6', version_check=True)4_st_.current_tex_line = 2265_st_.blockbegin()6try:7# Compute cyclotomic polynomials for n = 1 to 208cyclotomic_data = {}9for n in range(1, 21):10phi_n = cyclotomic_polynomial(n)11degree = phi_n.degree()12coeffs = phi_n.coefficients(sparse=False)1314cyclotomic_data[n] = {15'polynomial': phi_n,16'degree': degree,17'coefficients': coeffs,18'euler_phi': euler_phi(n)19}2021# Display cyclotomic polynomials for small n22print("Cyclotomic Polynomials Φ_n(x) for n = 1 to 12:")23for n in range(1, 13):24phi_n = cyclotomic_data[n]['polynomial']25degree = cyclotomic_data[n]['degree']26print(f"Φ_{n}(x) = {phi_n}, degree = {degree}")2728# Verify that degree equals Euler's totient function29print("\nVerification: deg(Φ_n) = φ(n)")30for n in range(1, 13):31degree = cyclotomic_data[n]['degree']32euler_val = cyclotomic_data[n]['euler_phi']33print(f"n = {n}: deg(Φ_{n}) = {degree}, φ({n}) = {euler_val}, Equal: {degree == euler_val}")34except:35_st_.goboom(254)36_st_.blockend()37_st_.current_tex_line = 27738_st_.blockbegin()39try:40# Verify the fundamental identity for several values of n41print(r"Verification of $x^n - 1 = \prod_{d \mid n} \Phi_d(x)$:")4243for n in [6, 8, 12, 15]:44# Left side: x^n - 145left_side = x^n - 14647# Right side: product of \Phi_d(x) for all d dividing n48divisors = [d for d in range(1, n+1) if n % d == 0]49right_side = 150for d in divisors:51right_side *= cyclotomic_polynomial(d)5253# Verify equality (no need to expand - SageMath polynomials are already expanded)54equality = (left_side == right_side)5556print(f"n = {n}: divisors = {divisors}")57print(f" x^{n} - 1 = {left_side}")58print(f" Product = {right_side}")59print(f" Equal: {equality}")6061# Analyze coefficient patterns in cyclotomic polynomials62print("\nCoefficient analysis:")63for n in [105, 210, 420]: # Cases where coefficients exceed ±164if n <= 20: # Only for computed cases65continue66phi_n = cyclotomic_polynomial(n)67coeffs = phi_n.coefficients(sparse=False)68max_coeff = max(abs(c) for c in coeffs)69print(f"\\Phi_{n}(x): max |coefficient| = {max_coeff}")70except:71_st_.goboom(308)72_st_.blockend()73_st_.current_tex_line = 31474_st_.blockbegin()75try:76# Analysis of roots structure for visualization77print("Roots of Unity Analysis:")78for n in [6, 8, 12, 16]:79all_roots = n80primitive_roots = euler_phi(n)81print(f"n = {n}: Total {n}-th roots of unity: {all_roots}")82print(f" Primitive {n}-th roots of unity: {primitive_roots}")83print(f" Cyclotomic polynomial Φ_{n}(x) has degree {primitive_roots}")84except:85_st_.goboom(323)86_st_.blockend()87_st_.current_tex_line = 34888_st_.blockbegin()89try:90# Analyze Galois groups for cyclotomic fields91print("Galois Groups of Cyclotomic Fields Q(ζ_n)/Q:")9293galois_data = {}94for n in range(1, 17):95# Units group (Z/nZ)*96units_group = Integers(n).unit_group()97group_order = units_group.order()98group_structure = units_group.invariants()99100# Field degree [Q(ζ_n) : Q] = φ(n)101field_degree = euler_phi(n)102103galois_data[n] = {104'field_degree': field_degree,105'group_order': group_order,106'group_structure': group_structure,107'units_group': units_group108}109110print(f"n = {n:2d}: [Q(ζ_{n}) : Q] = {field_degree:2d}, "111f"|Gal| = {group_order:2d}, structure = {group_structure}")112113# Detailed analysis for specific cases114print("\nDetailed Galois group analysis:")115116interesting_cases = [8, 12, 15, 16, 20]117for n in interesting_cases:118if n >= len(galois_data):119continue120121units = Integers(n).unit_group()122elements = [a for a in range(1, n) if gcd(a, n) == 1]123124print(f"\nn = {n}: Q(ζ_{n})/Q")125print(f" Units (Z/{n}Z)* = {{{', '.join(map(str, elements))}}}")126print(f" Group structure: {units.invariants()}")127print(f" Cyclic: {units.is_cyclic()}")128129# Generator information for cyclic groups130if units.is_cyclic():131# Find a generator132for a in elements:133order = Integers(n)(a).multiplicative_order()134if order == len(elements):135print(f" Generator: {a} (order {order})")136break137except:138_st_.goboom(396)139_st_.blockend()140_st_.current_tex_line = 408141_st_.blockbegin()142try:143# Analyze ramification patterns144print("Ramification Analysis in Cyclotomic Fields:")145146def analyze_ramification(n):147"""Analyze ramification of primes in Q(ζ_n)"""148print(f"\nQ(ζ_{n})/Q ramification:")149150# Get prime divisors of n151n_factorization = factor(n)152ramified_primes = [p for p, e in n_factorization]153154print(f" n = {n} = {n_factorization}")155print(f" Ramified primes: {ramified_primes}")156157# Analyze each small prime158for p in [2, 3, 5, 7, 11]:159if p > n:160break161162if p not in ramified_primes:163# Unramified case - compute splitting behavior164if gcd(p, n) == 1:165f = Integers(n)(p).multiplicative_order()166else:167f = "undefined"168print(f" p = {p}: unramified, inertia degree f = {f}")169else:170# Ramified case - find the exponent of p in the factorization171ramification_index = 0172for prime, exp in n_factorization:173if prime == p:174ramification_index = exp175break176totally_ramified = ramification_index == 1177print(f" p = {p}: ramified (e = {ramification_index}), "178f"totally ramified: {totally_ramified}")179180# Analyze several cyclotomic fields181for n in [8, 12, 15, 20, 24]:182analyze_ramification(n)183except:184_st_.goboom(449)185_st_.blockend()186_st_.current_tex_line = 468187_st_.blockbegin()188try:189import os190if not os.path.exists('figures'):191os.makedirs('figures')192193# Demonstrate quadratic reciprocity computations194print("Quadratic Reciprocity Examples:")195196def legendre_symbol(a, p):197"""Compute Legendre symbol (a/p)"""198return kronecker_symbol(a, p)199200def verify_reciprocity(p, q):201"""Verify quadratic reciprocity for primes p, q"""202left_side = legendre_symbol(p, q) * legendre_symbol(q, p)203right_side = (-1)**((p-1)//2 * (q-1)//2)204return left_side == right_side205206# Test quadratic reciprocity for several prime pairs207prime_pairs = [(3, 5), (3, 7), (5, 7), (7, 11), (11, 13), (13, 17)]208209for p, q in prime_pairs:210leg_p_q = legendre_symbol(p, q)211leg_q_p = legendre_symbol(q, p)212product = leg_p_q * leg_q_p213expected = (-1)**((p-1)//2 * (q-1)//2)214verified = verify_reciprocity(p, q)215216print(f"p = {p}, q = {q}: ({p}/{q}) = {leg_p_q:2d}, ({q}/{p}) = {leg_q_p:2d}")217print(f" Product = {product:2d}, Expected = {expected:2d}, Verified: {verified}")218219# Analysis summary for the visualization220print("\nQuadratic reciprocity visualization generated showing Legendre symbols.")221print("The reciprocity pattern demonstrates the fundamental law:")222print("For distinct odd primes p, q: (p/q)(q/p) = (-1)^((p-1)/2 * (q-1)/2)")223224# Additional analysis of specific cases225print("\nDetailed reciprocity analysis:")226small_primes = [3, 5, 7, 11, 13]227for i, p in enumerate(small_primes):228for j, q in enumerate(small_primes):229if i < j: # Only examine pairs once230symbol_pq = legendre_symbol(p, q)231symbol_qp = legendre_symbol(q, p)232print(f"({p}/{q}) = {symbol_pq:2d}, ({q}/{p}) = {symbol_qp:2d}, Product = {symbol_pq * symbol_qp:2d}")233except:234_st_.goboom(513)235_st_.blockend()236_st_.current_tex_line = 524237_st_.blockbegin()238try:239# Investigate cyclotomic class numbers240print("Class Numbers of Cyclotomic Fields:")241242def compute_cyclotomic_info(n):243"""Compute information about the n-th cyclotomic field"""244# For computational feasibility, we focus on small n245if n > 20:246return None247248field_degree = euler_phi(n)249discriminant_factor_count = len([p for p, e in factor(n)])250251return {252'n': n,253'degree': field_degree,254'conductor': n,255'discriminant_complexity': discriminant_factor_count256}257258# Analyze cyclotomic fields259cyclotomic_info = []260for n in range(1, 21):261info = compute_cyclotomic_info(n)262if info:263cyclotomic_info.append(info)264265print("Cyclotomic Field Data:")266print("n degree conductor discriminant_complexity")267print("-" * 45)268for info in cyclotomic_info:269print(f"{info['n']:2d} {info['degree']:3d} {info['conductor']:3d} {info['discriminant_complexity']:3d}")270271# Focus on specific interesting cases272interesting_fields = [7, 8, 9, 12, 15, 16, 20]273print(f"\nDetailed analysis for selected cyclotomic fields:")274275for n in interesting_fields:276if n <= 20:277phi_n = euler_phi(n)278units_structure = Integers(n).unit_group().invariants()279print(f"Q(ζ_{n}): degree {phi_n}, Gal ≅ {units_structure}")280except:281_st_.goboom(566)282_st_.blockend()283_st_.current_tex_line = 576284_st_.blockbegin()285try:286# Analyze computational complexity of cyclotomic polynomial operations287print("Computational Complexity Analysis:")288289def time_cyclotomic_computation(n_max):290"""Analyze timing for cyclotomic polynomial computations"""291import time292293timing_data = []294295for n in range(1, min(n_max + 1, 101)): # Limit for computational feasibility296start_time = time.time()297298# Compute cyclotomic polynomial299phi_n = cyclotomic_polynomial(n)300degree = phi_n.degree()301height = max(abs(c) for c in phi_n.coefficients(sparse=False))302303end_time = time.time()304computation_time = end_time - start_time305306timing_data.append({307'n': int(n),308'degree': int(degree),309'height': int(height),310'time': float(computation_time)311})312313if n <= 30 or n % 10 == 0:314print(f"n = {n:3d}: degree = {degree:3d}, "315f"height = {height:4d}, time = {computation_time:.4f}s")316317return timing_data318319# Perform timing analysis for moderate values320print("Timing analysis for cyclotomic polynomial computation:")321timing_results = time_cyclotomic_computation(50)322323# Summary analysis of complexity results324print("\nComplexity Analysis Summary:")325print(f"Analyzed cyclotomic polynomials for n = 1 to {len(timing_results)}")326327n_values = [data['n'] for data in timing_results]328degrees = [data['degree'] for data in timing_results]329heights = [data['height'] for data in timing_results]330times = [data['time'] for data in timing_results]331332print(f"Maximum degree observed: {max(degrees)} (for n = {n_values[degrees.index(max(degrees))]})")333print(f"Maximum coefficient height: {max(heights)} (for n = {n_values[heights.index(max(heights))]})")334print(f"Total computation time: {sum(times):.4f} seconds")335336# Highlight some interesting cases337interesting_n = [12, 15, 20, 24, 30, 40]338print("\nComplexity for selected values:")339for n in interesting_n:340if n <= len(timing_results):341idx = n - 1342print(f"n = {n:2d}: degree = {degrees[idx]:2d}, height = {heights[idx]:3d}, time = {times[idx]:.4f}s")343except:344_st_.goboom(634)345_st_.blockend()346_st_.endofdoc()347348349