Theory Basic_Modular_Forms_Mero_UHP
section ‹Some concrete level 1 modular forms›
theory Basic_Modular_Forms_Mero_UHP
imports "Elliptic_Functions.Basic_Modular_Forms" Modular_Forms
begin
subsection ‹Eisenstein series›
definition E_mero_uhp :: "nat ⇒ mero_uhp" ("ℰ")
where "E_mero_uhp n = mero_uhp (Eisenstein_E n)"
lemma mero_uhp_rel_E [mero_uhp_rel_intros]: "mero_uhp_rel (ℰ n) (Eisenstein_E n)"
unfolding E_mero_uhp_def
by (intro mero_uhp_rel_mero_uhp analytic_on_imp_meromorphic_on analytic_intros)
(auto elim!: Reals_cases)
lemma E_mero_uhp_0 [simp]: "ℰ 0 = 1"
proof -
have "mero_uhp_rel (ℰ 0) (Eisenstein_E 0)"
by mero_uhp_rel
also have "mero_uhp_rel … (eval_mero_uhp 1)"
by (rule mero_uhp_relI_weak) (auto simp: complex_is_Real_iff)
finally show ?thesis
by (rule mero_uhp_rel_imp_eq_mero_uhp)
qed
lemma E_mero_uhp_odd:
assumes "odd n"
shows "ℰ n = 0"
proof -
have "mero_uhp_rel (ℰ n) (Eisenstein_E n)"
by mero_uhp_rel
also from assms have "Eisenstein_E n = (λ_. 0)"
by (auto simp: Eisenstein_E_def fun_eq_iff)
also have "mero_uhp_rel … (0 :: mero_uhp)"
by mero_uhp_rel
finally show ?thesis
by (rule mero_uhp_rel_imp_eq_mero_uhp)
qed
lemma holo_uhp_E_mero_uhp: "holo_uhp (ℰ n)"
proof (rule holo_uhp_mero_uhp_rel_transfer)
show "mero_uhp_rel (ℰ n) (Eisenstein_E n)"
by mero_uhp_rel
qed (auto intro!: analytic_intros simp: complex_is_Real_iff)
lemma not_is_pole_E_mero_uhp [simp]: "¬is_pole (ℰ n) z"
using holo_uhp_E_mero_uhp by (auto simp: holo_uhp_def)
lemma poles_mero_uhp_E_mero_uhp [simp]: "poles_mero_uhp (ℰ n) = {}"
by (auto simp: poles_mero_uhp_def)
lemma eval_E_mero_uhp [simp]: "Im z > 0 ⟹ eval_mero_uhp (ℰ n) z = Eisenstein_E n z"
unfolding E_mero_uhp_def
by (intro eval_mero_uhp_mero_uhp analytic_on_imp_meromorphic_on analytic_intros)
(auto elim!: Reals_cases)
interpretation Eisenstein_E: fourier_expansion_holomorphic_explicit "Suc 0" "ℰ n" "fps_Eisenstein_E n"
proof
show "holo_uhp (ℰ n)"
using holo_uhp_E_mero_uhp by simp
next
show "compose_modgrp_mero_uhp (ℰ n) (shift_modgrp (int (Suc 0))) = ℰ n"
proof -
have "mero_uhp_rel (compose_modgrp_mero_uhp (ℰ n) (shift_modgrp (int (Suc 0))))
(λz. Eisenstein_E n (apply_modgrp (shift_modgrp (int (Suc 0))) z))"
by mero_uhp_rel
also have "… = Eisenstein_E n"
by (simp add: Eisenstein_E_plus1)
also have "mero_uhp_rel … (ℰ n)"
by mero_uhp_rel
finally show "compose_modgrp_mero_uhp (ℰ n) (shift_modgrp (int (Suc 0))) = ℰ n"
by (rule mero_uhp_rel_imp_eq_mero_uhp)
qed
interpret fourier_expansion_locale "Suc 0" "ℰ n"
proof
have "mero_uhp_rel (compose_modgrp_mero_uhp (ℰ n) (shift_modgrp (int (Suc 0))))
(λz. Eisenstein_E n (apply_modgrp (shift_modgrp (int (Suc 0))) z))"
by mero_uhp_rel
also have "… = Eisenstein_E n"
by (simp add: Eisenstein_E_plus1)
also have "mero_uhp_rel … (ℰ n)"
by mero_uhp_rel
finally show "compose_modgrp_mero_uhp (ℰ n) (shift_modgrp (int (Suc 0))) = ℰ n"
by (rule mero_uhp_rel_imp_eq_mero_uhp)
qed auto
have "q_Eisenstein_E n has_laurent_expansion fps_to_fls (fps_Eisenstein_E n)"
by (intro has_laurent_expansion_fps fps_expansion_intros)
also have "?this ⟷ fourier_expansion (Suc 0) (ℰ n) has_laurent_expansion fps_to_fls (fps_Eisenstein_E n)"
proof (rule has_laurent_expansion_cong)
have "∀⇩F x in at_𝗂∞. q_Eisenstein_E n (to_q 1 x) = fourier_expansion 1 (ℰ n) (to_q 1 x)"
using eventually_at_ii_inf[of 0] by eventually_elim (auto simp: Eisenstein_E_fourier)
thus "∀⇩F q in at 0. q_Eisenstein_E n q = fourier_expansion (Suc 0) (ℰ n) q"
by (subst eventually_at_ii_inf_to_q[of 1]) auto
qed auto
also have "… ⟷ ℰ n has_laurent_expansion_at_𝗂∞[Suc 0] fps_to_fls (fps_Eisenstein_E n)"
by (simp add: has_laurent_expansion_at_ii_inf_def fourier_expansion_locale_axioms)
finally show "ℰ n has_laurent_expansion_at_𝗂∞[Suc 0] fps_to_fls (fps_Eisenstein_E n)" .