{"content":"import Mathlib\n\nopen Nat Finset\n\nnoncomputable def A005187 (e : ℕ) : ℕ :=\n  Finset.sum (Finset.range (e + 1)) fun k ↦ e / (2^k)\n\nnoncomputable def A046644 (n : ℕ) : ℚ :=\n  if n = 0 then 0\n  else n.factorization.prod fun _ e ↦ (2 : ℚ) ^ (A005187 e)\n\nnoncomputable def A317940_f : ℕ → ℚ :=\n  WellFounded.fix (measure id).wf fun n IH ↦\n    if n = 0 then 0\n    else if n = 1 then 1\n    else\n      let A_n : ℚ := A046644 n\n      let sum_of_products : ℚ := Finset.sum (divisors n) fun d ↦\n        if h_prop : d > 1 ∧ d < n then\n          have d_lt_n : d < n := h_prop.2\n          let q := n / d\n          have q_lt_n : q < n := Nat.div_lt_self (Nat.pos_of_ne_zero (by omega)) h_prop.1\n          IH d d_lt_n * IH q q_lt_n\n        else 0\n      (A_n - sum_of_products) / 2\n\nnamespace A317940Verified\n\ndef ExactSpec : Prop := ∀ n : ℕ, n > 0 → A317940_f n ≥ 0\n\nnoncomputable def d : ℕ → ℚ :=\n  Nat.evenOddRec (1 / 2)\n    (fun r _ => 1 / (2 : ℚ) ^ (2 * r + 1))\n    (fun r x => 2 * x - 1 / (2 : ℚ) ^ (2 * r + 2))\n\n@[simp] theorem d_zero : d 0 = 1 / 2 := by\n  simp [d]\n\n@[simp] theorem d_even (r : ℕ) :\n    d (2 * r) = 1 / (2 : ℚ) ^ (2 * r + 1) := by\n  simp [d, Nat.evenOddRec_even]\n\n@[simp] theorem d_odd (r : ℕ) :\n    d (2 * r + 1) = 2 * d r - 1 / (2 : ℚ) ^ (2 * r + 2) := by\n  simp [d, Nat.evenOddRec_odd]\n\ntheorem d_lower : ∀ n : ℕ, 1 / (2 : ℚ) ^ (n + 1) ≤ d n := by\n  intro n\n  induction n using Nat.evenOddRec with\n  | h0 => norm_num [d]\n  | h_even r ih =>\n      simp [d_even]\n  | h_odd r ih =>\n      rw [d_odd]\n      have hexp : r + 1 ≤ 2 * r + 2 := by omega\n      have hbase :\n          1 / (2 : ℚ) ^ (2 * r + 2) ≤ 1 / (2 : ℚ) ^ (r + 1) := by\n        exact one_div_pow_le_one_div_pow_of_le (by norm_num) hexp\n      have hle : 1 / (2 : ℚ) ^ (2 * r + 2) ≤ d r := hbase.trans ih\n      linarith\n\ntheorem d_pos (n : ℕ) : 0 < d n := by\n  have hpow : 0 < 1 / (2 : ℚ) ^ (n + 1) := by positivity\n  exact lt_of_lt_of_le hpow (d_lower n)\n\nnoncomputable def a : ℕ → ℚ :=\n  WellFounded.fix (measure id).wf fun n IH ↦\n    match n with\n    | 0 => 1\n    | m + 1 =>\n        Finset.sum (range (m + 1))\n            (fun i => d i * IH (m - i) (Nat.lt_succ_of_le (Nat.sub_le m i))) /\n          (2 * (m + 1))\n\n@[simp] theorem a_zero : a 0 = 1 := by\n  unfold a\n  rw [WellFounded.fix_eq]\n\ntheorem a_succ (m : ℕ) :\n    a (m + 1) =\n      Finset.sum (range (m + 1)) (fun i => d i * a (m - i)) /\n        (2 * (m + 1)) := by\n  unfold a\n  rw [WellFounded.fix_eq]\n\ntheorem a_pos (n : ℕ) : 0 < a n := by\n  induction n using Nat.strong_induction_on with\n  | h n ih =>\n      cases n with\n      | zero => simp\n      | succ m =>\n          rw [a_succ]\n          have hnonneg :\n              ∀ i ∈ range (m + 1), 0 ≤ d i * a (m - i) := by\n            intro i hi\n            exact mul_nonneg (le_of_lt (d_pos i))\n              (le_of_lt (ih (m - i) (Nat.lt_succ_of_le (Nat.sub_le m i))))\n          have hsum :\n              0 < Finset.sum (range (m + 1)) (fun i => d i * a (m - i)) := by\n            rw [sum_pos_iff_of_nonneg hnonneg]\n            refine ⟨0, by simp, ?_⟩\n            simpa using mul_pos (d_pos 0) (ih m (Nat.lt_succ_self m))\n          have hden : 0 < (2 * (m + 1) : ℚ) := by positivity\n          exact div_pos hsum hden\n\nnoncomputable def b : ℕ → ℚ :=\n  Nat.evenOddRec 1\n    (fun _ x => x)\n    (fun _ x => x / 2)\n\n@[simp] theorem b_zero : b 0 = 1 := by\n  simp [b]\n\n@[simp] theorem b_even (r : ℕ) : b (2 * r) = b r := by\n  simp [b, Nat.evenOddRec_even]\n\n@[simp] theorem b_odd (r : ℕ) : b (2 * r + 1) = b r / 2 := by\n  simp [b, Nat.evenOddRec_odd]\n\ntheorem b_pos (n : ℕ) : 0 < b n := by\n  induction n using Nat.evenOddRec with\n  | h0 => norm_num [b]\n  | h_even r ih => simpa using ih\n  | h_odd r ih =>\n      rw [b_odd]\n      positivity\n\ntheorem sum_range_even_odd_even (f : ℕ → ℚ) (m : ℕ) :\n    Finset.sum (range (2 * m + 1)) f =\n      Finset.sum (range (m + 1)) (fun r => f (2 * r)) +\n      Finset.sum (range m) (fun r => f (2 * r + 1)) := by\n  induction m with\n  | zero => simp\n  | succ m ih =>\n      calc\n        Finset.sum (range (2 * (m + 1) + 1)) f =\n            Finset.sum (range (2 * m + 1)) f + f (2 * m + 1) + f (2 * m + 2) := by\n              rw [show 2 * (m + 1) + 1 = ((2 * m + 1) + 1) + 1 by omega,\n                Finset.sum_range_succ, Finset.sum_range_succ]\n        _ = (Finset.sum (range (m + 1)) (fun r => f (2 * r)) +\n              Finset.sum (range m) (fun r => f (2 * r + 1))) +\n              f (2 * m + 1) + f (2 * m + 2) := by rw [ih]\n        _ = Finset.sum (range (m + 2)) (fun r => f (2 * r)) +\n              Finset.sum (range (m + 1)) (fun r => f (2 * r + 1)) := by\n              simp only [Finset.sum_range_succ]\n              rw [show 2 * (m + 1) = 2 * m + 2 by omega]\n              ring\n\ntheorem sum_range_even_odd_odd (f : ℕ → ℚ) (m : ℕ) :\n    Finset.sum (range (2 * m + 2)) f =\n      Finset.sum (range (m + 1)) (fun r => f (2 * r)) +\n      Finset.sum (range (m + 1)) (fun r => f (2 * r + 1)) := by\n  have hodd :\n      Finset.sum (range (m + 1)) (fun r => f (2 * r + 1)) =\n        Finset.sum (range m) (fun r => f (2 * r + 1)) + f (2 * m + 1) := by\n    simpa using Finset.sum_range_succ (fun r => f (2 * r + 1)) m\n  calc\n    Finset.sum (range (2 * m + 2)) f =\n        Finset.sum (range (2 * m + 1)) f + f (2 * m + 1) := by\n          rw [show 2 * m + 2 = (2 * m + 1) + 1 by omega,\n            Finset.sum_range_succ]\n    _ = (Finset.sum (range (m + 1)) (fun r => f (2 * r)) +\n          Finset.sum (range m) (fun r => f (2 * r + 1))) + f (2 * m + 1) := by\n          rw [sum_range_even_odd_even]\n    _ = Finset.sum (range (m + 1)) (fun r => f (2 * r)) +\n          Finset.sum (range (m + 1)) (fun r => f (2 * r + 1)) := by\n          rw [hodd]\n          ring\n\ntheorem geometric_shift (m : ℕ) :\n    Finset.sum (range (m + 1))\n        (fun r => 1 / (2 : ℚ) ^ (2 * r + 1) * b (m - r)) =\n      b m / 2 +\n        Finset.sum (range m)\n          (fun r => 1 / (2 : ℚ) ^ (2 * r + 3) * b (m - r - 1)) := by\n  rw [Finset.sum_range_succ', add_comm]\n  congr 1\n  simp only [Nat.sub_zero]\n  rw [div_eq_mul_inv]\n  ring\n\ntheorem b_derivative_coeff (n : ℕ) :\n    (n + 1 : ℚ) * b (n + 1) =\n      Finset.sum (range (n + 1)) (fun i => d i * b (n - i)) := by\n  induction n using Nat.evenOddStrongRec with\n  | h_odd m ih =>\n      rw [show 2 * m + 1 + 1 = 2 * (m + 1) by omega, b_even]\n      rw [show 2 * (m + 1) = 2 * m + 2 by omega, sum_range_even_odd_odd]\n      have heven :\n          Finset.sum (range (m + 1))\n              (fun r => d (2 * r) * b ((2 * m + 1) - 2 * r)) =\n            Finset.sum (range (m + 1))\n              (fun r => 1 / (2 : ℚ) ^ (2 * r + 2) * b (m - r)) := by\n        apply Finset.sum_congr rfl\n        intro r hr\n        have hrle : r ≤ m := by\n          have := Finset.mem_range.mp hr\n          omega\n        rw [d_even, show 2 * m + 1 - 2 * r = 2 * (m - r) + 1 by omega,\n          b_odd, show 2 * r + 2 = (2 * r + 1) + 1 by omega, pow_succ]\n        ring\n      have hodd :\n          Finset.sum (range (m + 1))\n              (fun r => d (2 * r + 1) * b ((2 * m + 1) - (2 * r + 1))) =\n            Finset.sum (range (m + 1))\n              (fun r => (2 * d r - 1 / (2 : ℚ) ^ (2 * r + 2)) * b (m - r)) := by\n        apply Finset.sum_congr rfl\n        intro r hr\n        have hrle : r ≤ m := by\n          have := Finset.mem_range.mp hr\n          omega\n        rw [d_odd, show 2 * m + 1 - (2 * r + 1) = 2 * (m - r) by omega,\n          b_even]\n      rw [heven, hodd]\n      have hcancel :\n          Finset.sum (range (m + 1))\n              (fun r => 1 / (2 : ℚ) ^ (2 * r + 2) * b (m - r)) +\n            Finset.sum (range (m + 1))\n              (fun r => (2 * d r - 1 / (2 : ℚ) ^ (2 * r + 2)) * b (m - r)) =\n            2 * Finset.sum (range (m + 1)) (fun r => d r * b (m - r)) := by\n        rw [← Finset.sum_add_distrib, Finset.mul_sum]\n        apply Finset.sum_congr rfl\n        intro r hr\n        ring\n      rw [hcancel]\n      have him := ih m (by omega)\n      rw [← him]\n      push_cast\n      ring\n  | h_even M ih =>\n      cases M with\n      | zero =>\n          have hb1 : b 1 = 1 / 2 := by simpa using b_odd 0\n          norm_num [hb1, d_zero, b_zero]\n      | succ m =>\n          rw [b_odd]\n          rw [sum_range_even_odd_even]\n          have heven :\n              Finset.sum (range (m + 2))\n                  (fun r => d (2 * r) * b (2 * (m + 1) - 2 * r)) =\n                Finset.sum (range (m + 2))\n                  (fun r => 1 / (2 : ℚ) ^ (2 * r + 1) * b (m + 1 - r)) := by\n            apply Finset.sum_congr rfl\n            intro r hr\n            have hrle : r ≤ m + 1 := by\n              have := Finset.mem_range.mp hr\n              omega\n            rw [d_even, show 2 * (m + 1) - 2 * r = 2 * (m + 1 - r) by omega,\n              b_even]\n          have hodd :\n              Finset.sum (range (m + 1))\n                  (fun r => d (2 * r + 1) * b (2 * (m + 1) - (2 * r + 1))) =\n                Finset.sum (range (m + 1))\n                  (fun r => d r * b (m - r) -\n                    1 / (2 : ℚ) ^ (2 * r + 3) * b (m - r)) := by\n            apply Finset.sum_congr rfl\n            intro r hr\n            have hrle : r ≤ m := by\n              have := Finset.mem_range.mp hr\n              omega\n            rw [d_odd, show 2 * (m + 1) - (2 * r + 1) = 2 * (m - r) + 1 by omega,\n              b_odd, show 2 * r + 3 = (2 * r + 2) + 1 by omega, pow_succ]\n            ring\n          rw [heven, hodd, geometric_shift, Finset.sum_sub_distrib]\n          have hshift :\n              Finset.sum (range (m + 1))\n                  (fun r => 1 / (2 : ℚ) ^ (2 * r + 3) * b (m + 1 - r - 1)) =\n                Finset.sum (range (m + 1))\n                  (fun r => 1 / (2 : ℚ) ^ (2 * r + 3) * b (m - r)) := by\n            apply Finset.sum_congr rfl\n            intro r hr\n            rw [show m + 1 - r - 1 = m - r by omega]\n          rw [hshift]\n          have him := ih m (by omega)\n          rw [← him]\n          push_cast\n          ring\n\nnoncomputable def Aseries : PowerSeries ℚ := PowerSeries.mk a\nnoncomputable def Dseries : PowerSeries ℚ := PowerSeries.mk d\nnoncomputable def Qseries : PowerSeries ℚ := Aseries * Aseries\n\ntheorem Aseries_derivative :\n    PowerSeries.derivative ℚ Aseries =\n      PowerSeries.C (1 / 2 : ℚ) * (Dseries * Aseries) := by\n  ext n\n  rw [PowerSeries.coeff_derivative, PowerSeries.coeff_C_mul,\n    PowerSeries.coeff_mul, Nat.sum_antidiagonal_eq_sum_range_succ_mk]\n  simp only [Aseries, Dseries, PowerSeries.coeff_mk]\n  rw [a_succ]\n  have hn : (n + 1 : ℚ) ≠ 0 := by positivity\n  field_simp\n\ntheorem Qseries_derivative :\n    PowerSeries.derivative ℚ Qseries = Dseries * Qseries := by\n  unfold Qseries\n  change PowerSeries.derivativeFun (Aseries * Aseries) =\n    Dseries * (Aseries * Aseries)\n  rw [PowerSeries.derivativeFun_mul]\n  simp only [smul_eq_mul]\n  have hA := Aseries_derivative\n  change PowerSeries.derivativeFun Aseries =\n    PowerSeries.C (1 / 2 : ℚ) * (Dseries * Aseries) at hA\n  rw [hA]\n  have hC :\n      (PowerSeries.C (1 / 2 : ℚ) : PowerSeries ℚ) +\n        PowerSeries.C (1 / 2 : ℚ) = 1 := by\n    ext n\n    cases n with\n    | zero => norm_num\n    | succ n => simp\n  calc\n    Aseries * (PowerSeries.C (1 / 2 : ℚ) * (Dseries * Aseries)) +\n        Aseries * (PowerSeries.C (1 / 2 : ℚ) * (Dseries * Aseries)) =\n      ((PowerSeries.C (1 / 2 : ℚ) : PowerSeries ℚ) +\n        PowerSeries.C (1 / 2 : ℚ)) * (Dseries * (Aseries * Aseries)) := by ring\n    _ = Dseries * (Aseries * Aseries) := by rw [hC, one_mul]\n\nnoncomputable def Bseries : PowerSeries ℚ := PowerSeries.mk b\n\ntheorem Bseries_derivative :\n    PowerSeries.derivative ℚ Bseries = Dseries * Bseries := by\n  ext n\n  rw [PowerSeries.coeff_derivative, PowerSeries.coeff_mul,\n    Nat.sum_antidiagonal_eq_sum_range_succ_mk]\n  simp only [Bseries, Dseries, PowerSeries.coeff_mk]\n  simpa [mul_comm] using b_derivative_coeff n\n\ntheorem Qseries_constant : PowerSeries.constantCoeff Qseries = 1 := by\n  simp [Qseries, Aseries, a_zero]\n\ntheorem Bseries_constant : PowerSeries.constantCoeff Bseries = 1 := by\n  simp [Bseries, b_zero]\n\ntheorem ode_unique (F G : PowerSeries ℚ)\n    (hF : PowerSeries.derivative ℚ F = Dseries * F)\n    (hG : PowerSeries.derivative ℚ G = Dseries * G)\n    (h0 : PowerSeries.constantCoeff F = PowerSeries.constantCoeff G) :\n    F = G := by\n  ext n\n  induction n using Nat.strong_induction_on with\n  | h n ih =>\n      cases n with\n      | zero =>\n          simpa [PowerSeries.coeff_zero_eq_constantCoeff_apply] using h0\n      | succ m =>\n          have hFc := congrArg (PowerSeries.coeff m) hF\n          have hGc := congrArg (PowerSeries.coeff m) hG\n          rw [PowerSeries.coeff_derivative, PowerSeries.coeff_mul,\n            Nat.sum_antidiagonal_eq_sum_range_succ_mk] at hFc hGc\n          have hs :\n              Finset.sum (range (m + 1))\n                  (fun i => PowerSeries.coeff i Dseries *\n                    PowerSeries.coeff (m - i) F) =\n                Finset.sum (range (m + 1))\n                  (fun i => PowerSeries.coeff i Dseries *\n                    PowerSeries.coeff (m - i) G) := by\n            apply Finset.sum_congr rfl\n            intro i hi\n            congr 1\n            exact ih (m - i) (Nat.lt_succ_of_le (Nat.sub_le m i))\n          rw [hs] at hFc\n          have hmul :\n              PowerSeries.coeff (m + 1) F * (m + 1 : ℚ) =\n                PowerSeries.coeff (m + 1) G * (m + 1 : ℚ) :=\n            hFc.trans hGc.symm\n          exact mul_right_cancel₀ (by positivity) hmul\n\ntheorem Qseries_eq_Bseries : Qseries = Bseries := by\n  apply ode_unique Qseries Bseries Qseries_derivative Bseries_derivative\n  rw [Qseries_constant, Bseries_constant]\n\ntheorem A005187_rec (n : ℕ) :\n    A005187 n = n + A005187 (n / 2) := by\n  cases n with\n  | zero => simp [A005187]\n  | succ n =>\n      unfold A005187\n      rw [Finset.sum_range_succ', add_comm]\n      simp only [pow_zero, Nat.div_one]\n      congr 1\n      have hterm (k : ℕ) :\n          (n + 1) / 2 ^ (k + 1) = ((n + 1) / 2) / 2 ^ k := by\n        symm\n        rw [Nat.div_div_eq_div_mul, mul_comm, ← pow_succ]\n      simp_rw [hterm]\n      let q := (n + 1) / 2\n      have hq_lt : q < n + 1 := by\n        dsimp [q]\n        exact Nat.div_lt_self (by omega) (by omega)\n      have hsubset : range (q + 1) ⊆ range (n + 1) := by\n        intro k hk\n        simp only [Finset.mem_range] at hk ⊢\n        omega\n      symm\n      apply Finset.sum_subset hsubset\n      intro k hk_big hk_small\n      have hk_lt : k < n + 1 := Finset.mem_range.mp hk_big\n      have hk_ge : q + 1 ≤ k := by\n        by_contra h\n        have : k < q + 1 := by omega\n        exact hk_small (Finset.mem_range.mpr this)\n      have hqk : q < k := by omega\n      have hkpow : k < 2 ^ k := Nat.lt_two_pow_self\n      have hqpow : q < 2 ^ k := lt_trans hqk hkpow\n      exact Nat.div_eq_of_lt hqpow\n\ntheorem four_pow_mul_b (n : ℕ) :\n    (4 : ℚ) ^ n * b n = (2 : ℚ) ^ (A005187 n) := by\n  have h4 (r : ℕ) : (4 : ℚ) ^ r = (2 : ℚ) ^ (2 * r) := by\n    calc\n      (4 : ℚ) ^ r = ((2 : ℚ) ^ 2) ^ r := by norm_num\n      _ = (2 : ℚ) ^ (2 * r) := by rw [pow_mul]\n  induction n using Nat.evenOddRec with\n  | h0 => norm_num [A005187, b_zero]\n  | h_even r ih =>\n      rw [b_even, A005187_rec, show 2 * r / 2 = r by omega]\n      calc\n        (4 : ℚ) ^ (2 * r) * b r =\n            (4 : ℚ) ^ r * ((4 : ℚ) ^ r * b r) := by\n              rw [show 2 * r = r + r by omega, pow_add]\n              ring\n        _ = (4 : ℚ) ^ r * (2 : ℚ) ^ (A005187 r) := by rw [ih]\n        _ = (2 : ℚ) ^ (2 * r) * (2 : ℚ) ^ (A005187 r) := by rw [h4]\n        _ = (2 : ℚ) ^ (2 * r + A005187 r) :=\n          (pow_add (2 : ℚ) (2 * r) (A005187 r)).symm\n  | h_odd r ih =>\n      rw [b_odd, A005187_rec, show (2 * r + 1) / 2 = r by omega]\n      calc\n        (4 : ℚ) ^ (2 * r + 1) * (b r / 2) =\n            (2 : ℚ) ^ (2 * r + 1) * ((4 : ℚ) ^ r * b r) := by\n              rw [show 2 * r + 1 = r + r + 1 by omega,\n                pow_add, pow_add, h4]\n              ring\n        _ = (2 : ℚ) ^ (2 * r + 1) * (2 : ℚ) ^ (A005187 r) := by rw [ih]\n        _ = (2 : ℚ) ^ (2 * r + 1 + A005187 r) :=\n          (pow_add (2 : ℚ) (2 * r + 1) (A005187 r)).symm\n\nnoncomputable def c (n : ℕ) : ℚ := (4 : ℚ) ^ n * a n\n\ntheorem c_pos (n : ℕ) : 0 < c n := by\n  exact mul_pos (pow_pos (by norm_num) n) (a_pos n)\n\nnoncomputable def Cseries : PowerSeries ℚ := PowerSeries.rescale 4 Aseries\n\ntheorem Cseries_sq_eq :\n    Cseries * Cseries = PowerSeries.rescale 4 Bseries := by\n  unfold Cseries\n  rw [← map_mul]\n  change PowerSeries.rescale 4 Qseries = PowerSeries.rescale 4 Bseries\n  rw [Qseries_eq_Bseries]\n\ntheorem c_convolution (n : ℕ) :\n    Finset.sum (range (n + 1)) (fun i => c i * c (n - i)) =\n      (2 : ℚ) ^ (A005187 n) := by\n  have h := congrArg (PowerSeries.coeff n) Cseries_sq_eq\n  rw [PowerSeries.coeff_mul, Nat.sum_antidiagonal_eq_sum_range_succ_mk,\n    PowerSeries.coeff_rescale] at h\n  simp only [Cseries, Aseries, Bseries, PowerSeries.coeff_rescale,\n    PowerSeries.coeff_mk] at h\n  exact h.trans (four_pow_mul_b n)\n\n@[simp] theorem c_zero : c 0 = 1 := by\n  simp [c]\n\nnoncomputable def rootAF : ArithmeticFunction ℚ :=\n  ⟨fun n => if n = 0 then 0 else n.factorization.prod fun _ e => c e, by simp⟩\n\nnoncomputable def targetAF : ArithmeticFunction ℚ :=\n  ⟨A046644, by simp [A046644]⟩\n\n@[simp] theorem targetAF_apply (n : ℕ) : targetAF n = A046644 n := rfl\n\n@[simp] theorem rootAF_prime_pow {p e : ℕ} (hp : p.Prime) :\n    rootAF (p ^ e) = c e := by\n  simp [rootAF, hp.ne_zero, hp.factorization_pow, c_zero]\n\n@[simp] theorem targetAF_prime_pow {p e : ℕ} (hp : p.Prime) :\n    targetAF (p ^ e) = (2 : ℚ) ^ (A005187 e) := by\n  have hzero : (2 : ℚ) ^ (A005187 0) = 1 := by simp [A005187]\n  simp [targetAF, A046644, hp.ne_zero, hp.factorization_pow,\n    Finsupp.prod_single_index, hzero]\n\ntheorem rootAF_multiplicative : rootAF.IsMultiplicative := by\n  rw [ArithmeticFunction.IsMultiplicative.iff_ne_zero]\n  constructor\n  · simp [rootAF]\n  · intro m n hm hn hcop\n    change (if m * n = 0 then 0 else\n        (m * n).factorization.prod fun _ e => c e) =\n      (if m = 0 then 0 else m.factorization.prod fun _ e => c e) *\n        (if n = 0 then 0 else n.factorization.prod fun _ e => c e)\n    rw [if_neg (mul_ne_zero hm hn), if_neg hm, if_neg hn,\n      Nat.factorization_mul_of_coprime hcop,\n      ← Finsupp.prod_add_index_of_disjoint]\n    exact hcop.disjoint_primeFactors\n\ntheorem targetAF_multiplicative : targetAF.IsMultiplicative := by\n  rw [ArithmeticFunction.IsMultiplicative.iff_ne_zero]\n  constructor\n  · simp [targetAF, A046644]\n  · intro m n hm hn hcop\n    change (if m * n = 0 then 0 else\n        (m * n).factorization.prod fun _ e => (2 : ℚ) ^ (A005187 e)) =\n      (if m = 0 then 0 else\n          m.factorization.prod fun _ e => (2 : ℚ) ^ (A005187 e)) *\n        (if n = 0 then 0 else\n          n.factorization.prod fun _ e => (2 : ℚ) ^ (A005187 e))\n    rw [if_neg (mul_ne_zero hm hn), if_neg hm, if_neg hn,\n      Nat.factorization_mul_of_coprime hcop,\n      ← Finsupp.prod_add_index_of_disjoint]\n    exact hcop.disjoint_primeFactors\n\ntheorem mul_apply_divisors (f g : ArithmeticFunction ℚ) (n : ℕ) :\n    (f * g) n =\n      Finset.sum (divisors n) (fun d => f d * g (n / d)) := by\n  rw [ArithmeticFunction.mul_apply, ← Nat.map_div_right_divisors,\n    Finset.sum_map, Function.Embedding.coeFn_mk]\n\ntheorem rootAF_sq_prime_pow {p e : ℕ} (hp : p.Prime) :\n    (rootAF * rootAF) (p ^ e) = (2 : ℚ) ^ (A005187 e) := by\n  rw [mul_apply_divisors, Nat.divisors_prime_pow hp, Finset.sum_map]\n  simp only [Function.Embedding.coeFn_mk]\n  calc\n    Finset.sum (range (e + 1))\n        (fun j => rootAF (p ^ j) * rootAF (p ^ e / p ^ j)) =\n      Finset.sum (range (e + 1))\n        (fun j => c j * c (e - j)) := by\n          apply Finset.sum_congr rfl\n          intro j hj\n          have hje : j ≤ e := Nat.le_of_lt_succ (Finset.mem_range.mp hj)\n          have hdiv : p ^ e / p ^ j = p ^ (e - j) := by\n            apply Nat.div_eq_of_eq_mul_left\n            · exact pow_pos hp.pos j\n            · rw [← pow_add]\n              congr 1\n              omega\n          rw [rootAF_prime_pow hp, hdiv, rootAF_prime_pow hp]\n    _ = (2 : ℚ) ^ (A005187 e) := c_convolution e\n\ntheorem rootAF_sq_eq_target : rootAF * rootAF = targetAF := by\n  apply (ArithmeticFunction.IsMultiplicative.eq_iff_eq_on_prime_powers\n      (rootAF * rootAF)\n      (rootAF_multiplicative.mul rootAF_multiplicative)\n      targetAF targetAF_multiplicative).2\n  intro p e hp\n  rw [rootAF_sq_prime_pow hp, targetAF_prime_pow hp]\n\nnoncomputable def interiorSum (f : ArithmeticFunction ℚ) (n : ℕ) : ℚ :=\n  Finset.sum (divisors n) fun d =>\n    if d > 1 ∧ d < n then f d * f (n / d) else 0\n\ntheorem square_decomp (f : ArithmeticFunction ℚ)\n    (hf1 : f 1 = 1) {n : ℕ} (hn : 1 < n) :\n    (f * f) n = 2 * f n + interiorSum f n := by\n  rw [mul_apply_divisors]\n  have hn0 : n ≠ 0 := by omega\n  calc\n    Finset.sum (divisors n) (fun d => f d * f (n / d)) =\n        Finset.sum (divisors n) (fun d =>\n          (if d = 1 then f n else 0) +\n          (if d = n then f n else 0) +\n          (if d > 1 ∧ d < n then f d * f (n / d) else 0)) := by\n      apply Finset.sum_congr rfl\n      intro d hd\n      have hdpos : 0 < d := Nat.pos_of_mem_divisors hd\n      have hdle : d ≤ n := Nat.divisor_le hd\n      by_cases h1 : d = 1\n      · subst d\n        have hne : (1 : ℕ) ≠ n := _root_.ne_of_lt hn\n        simp [hf1, hne]\n      by_cases hdn : d = n\n      · subst d\n        rw [Nat.div_self (by omega), hf1]\n        simp [h1]\n      have hgt : 1 < d := by omega\n      have hlt : d < n := lt_of_le_of_ne hdle hdn\n      simp [h1, hdn, hgt, hlt]\n    _ = 2 * f n + interiorSum f n := by\n      rw [Finset.sum_add_distrib, Finset.sum_add_distrib]\n      simp [interiorSum, hn0]\n      ring\n\ntheorem rootAF_rec {n : ℕ} (hn : 1 < n) :\n    rootAF n = (A046644 n - interiorSum rootAF n) / 2 := by\n  have hsquare := congrArg (fun F : ArithmeticFunction ℚ => F n) rootAF_sq_eq_target\n  change (rootAF * rootAF) n = A046644 n at hsquare\n  rw [square_decomp rootAF rootAF_multiplicative.map_one hn] at hsquare\n  linarith\n\ntheorem A317940_f_unfold (n : ℕ) :\n    A317940_f n =\n      if n = 0 then 0\n      else if n = 1 then 1\n      else\n        let A_n : ℚ := A046644 n\n        let sum_of_products : ℚ := Finset.sum (divisors n) fun d =>\n          if _h_prop : d > 1 ∧ d < n then\n            A317940_f d * A317940_f (n / d)\n          else 0\n        (A_n - sum_of_products) / 2 := by\n  unfold A317940_f\n  rw [WellFounded.fix_eq]\n\ntheorem A317940_f_eq_rootAF (n : ℕ) : A317940_f n = rootAF n := by\n  induction n using Nat.strong_induction_on with\n  | h n ih =>\n      rw [A317940_f_unfold]\n      by_cases h0 : n = 0\n      · subst n\n        simp [rootAF]\n      by_cases h1 : n = 1\n      · subst n\n        rw [if_neg (by omega), if_pos rfl]\n        exact rootAF_multiplicative.map_one.symm\n      have hn : 1 < n := by omega\n      rw [if_neg h0, if_neg h1]\n      have hsum :\n          Finset.sum (divisors n) (fun d =>\n            if _h_prop : d > 1 ∧ d < n then\n              A317940_f d * A317940_f (n / d)\n            else 0) = interiorSum rootAF n := by\n        unfold interiorSum\n        apply Finset.sum_congr rfl\n        intro d hd\n        by_cases hp : d > 1 ∧ d < n\n        · rw [dif_pos hp, if_pos hp, ih d hp.2]\n          have hq : n / d < n :=\n            Nat.div_lt_self (Nat.pos_of_ne_zero h0) hp.1\n          rw [ih (n / d) hq]\n        · rw [dif_neg hp, if_neg hp]\n      rw [hsum]\n      exact (rootAF_rec hn).symm\n\ntheorem rootAF_pos {n : ℕ} (hn : 0 < n) : 0 < rootAF n := by\n  change 0 < (if n = 0 then 0 else\n    n.factorization.prod fun _ e => c e)\n  rw [if_neg hn.ne']\n  unfold Finsupp.prod\n  apply Finset.prod_pos\n  intro p hp\n  exact c_pos _\n\ntheorem A317940_nonnegative (n : ℕ) (hn : n > 0) :\n    A317940_f n ≥ 0 := by\n  rw [A317940_f_eq_rootAF]\n  exact le_of_lt (rootAF_pos hn)\n\ntheorem exact_spec_verified : ExactSpec := by\n  intro n hn\n  exact A317940_nonnegative n hn\n\nend A317940Verified\n\n\ntheorem A317940_f_nonnegative (n : ℕ) (h : n > 0) :\n    A317940_f n ≥ 0 :=\n  A317940Verified.A317940_nonnegative n h\n\n","failed_declarations":[],"lean_messages":{"errors":[],"infos":[],"warnings":[]},"okay":true,"timings":{"candidate_ms":2653,"declarations_ms":10884,"formal_statement_ms":300,"total_ms":13843},"tool_messages":{"errors":[],"infos":["Imports mismatch detected. Overriding with default header. If this behavior is not desired, please turn `ignoreImports` off. Default header:\n\nimport Mathlib\n"],"warnings":[]},"info":{"request_id":"39e85d96-0c5d-4739-bbec-006c1352b84a","environment":"lean-4.27.0","total_request_time_ms":13951,"queue_time_ms":4,"execution_time_ms":13947,"cached_response":true,"_executor_commit_sha":"9e04b75","_executor_docker_image_id":"sha256:d18b06d91e818fb926890a53a7ed716a049a612f5262eb795180490fa7bf825d","_executor_artifact_sha256":"3583cf2d9faa59f80612b336bcabbef133f30aba7dde9b108118f87ace0e6480","environment_wait_time_us":3074,"environment_total_time_us":13924236,"environment_pool_size":63}}