/-
Copyright 2026 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
import FormalConjecturesUtilLeast $k$ such that cyclotomic polynomial $\Phi_k(n)$ is prime
$a(n) = \min {k \in \mathbb{N} \mid 0 < k \wedge \text{Prime}(|\Phi_k(n)|) }$, where $\Phi_k(n)$ is the $k$-th cyclotomic polynomial evaluated at $n$.
References:
namespace OeisA117545Least $k > 0$ such that $|\Phi_k(n)|$ is prime, or $0$ if no such $k$ exists.
noncomputable def a (n : ℕ) : ℕ :=
sInf {k : ℕ | 0 < k ∧ ((Polynomial.cyclotomic k ℤ).eval (n : ℤ)).natAbs.Prime}
Value of the sequence a at 1.
h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 1 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 1 = 2
exact h_least.csInf_eq All goals completed! 🐙
Value of the sequence a at 2.
@[category test, AMS 11]
theorem a_2 : a 2 = 2 := by ⊢ a 2 = 2
have h_least : IsLeast {k : ℕ | 0 < k ∧ ((Polynomial.cyclotomic k ℤ).eval (2 :
ℤ)).natAbs.Prime} 2 := by
constructor left ⊢ 2 ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs}right ⊢ 2 ∈ lowerBounds {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
· left ⊢ 2 ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2 simp only [Set.mem_ofPred_eq] left ⊢ 0 < 2 ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 2 ℤ)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
refine ⟨by ⊢ 0 < 2 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2 decide All goals completed! 🐙 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2, ?_⟩
have : Polynomial.cyclotomic 2 ℤ = Polynomial.X + 1 := Polynomial.cyclotomic_two ℤ left this:Polynomial.cyclotomic 2 ℤ = Polynomial.X + 1⊢ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 2 ℤ)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
rw [this left this:Polynomial.cyclotomic 2 ℤ = Polynomial.X + 1⊢ Nat.Prime (Polynomial.eval 2 (Polynomial.X + 1)).natAbs left this:Polynomial.cyclotomic 2 ℤ = Polynomial.X + 1⊢ Nat.Prime (Polynomial.eval 2 (Polynomial.X + 1)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2]left this:Polynomial.cyclotomic 2 ℤ = Polynomial.X + 1⊢ Nat.Prime (Polynomial.eval 2 (Polynomial.X + 1)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
norm_num All goals completed! 🐙 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
· right ⊢ 2 ∈ lowerBounds {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2 intro k hk right k:ℕhk:k ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs}⊢ 2 ≤ k h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
simp only [Set.mem_ofPred_eq] at hk right k:ℕhk:0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs⊢ 2 ≤ k h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
by_contra! h right k:ℕhk:0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbsh:k < 2⊢ False h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
have hk_pos := hk.1 right k:ℕhk:0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbsh:k < 2hk_pos:0 < k⊢ False h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
interval_cases k right.«1» k:ℕhk:0 < 1 ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbsh:1 < 2hk_pos:0 < 1⊢ False h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
have hk2 := hk.2 right.«1» k:ℕhk:0 < 1 ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbsh:1 < 2hk_pos:0 < 1hk2:Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbs⊢ False h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
have h1 : Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1 := Polynomial.cyclotomic_one ℤ right.«1» k:ℕhk:0 < 1 ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbsh:1 < 2hk_pos:0 < 1hk2:Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbsh1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ False h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
rw [h1 right.«1» k:ℕhk:0 < 1 ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbsh:1 < 2hk_pos:0 < 1hk2:Nat.Prime (Polynomial.eval 2 (Polynomial.X - 1)).natAbsh1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ False right.«1» k:ℕhk:0 < 1 ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbsh:1 < 2hk_pos:0 < 1hk2:Nat.Prime (Polynomial.eval 2 (Polynomial.X - 1)).natAbsh1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ False h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2] at hk2right.«1» k:ℕhk:0 < 1 ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbsh:1 < 2hk_pos:0 < 1hk2:Nat.Prime (Polynomial.eval 2 (Polynomial.X - 1)).natAbsh1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ False h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
revert hk2 right.«1» k:ℕhk:0 < 1 ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic 1 ℤ)).natAbsh:1 < 2hk_pos:0 < 1h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 2 (Polynomial.X - 1)).natAbs → False h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
norm_num h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 2 (Polynomial.cyclotomic k ℤ)).natAbs} 2⊢ a 2 = 2
exact h_least.csInf_eq All goals completed! 🐙
Value of the sequence a at 3.
@[category test, AMS 11]
theorem a_3 : a 3 = 1 := by ⊢ a 3 = 1
have h_least : IsLeast {k : ℕ | 0 < k ∧ ((Polynomial.cyclotomic k ℤ).eval (3 :
ℤ)).natAbs.Prime} 1 := by
constructor left ⊢ 1 ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs}right ⊢ 1 ∈ lowerBounds {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1
· left ⊢ 1 ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1 simp only [Set.mem_ofPred_eq] left ⊢ 0 < 1 ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic 1 ℤ)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1
refine ⟨by ⊢ 0 < 1 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1 decide All goals completed! 🐙 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1, ?_⟩
have h1 : Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1 := Polynomial.cyclotomic_one ℤ left h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic 1 ℤ)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1
rw [h1 left h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 3 (Polynomial.X - 1)).natAbs left h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 3 (Polynomial.X - 1)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1]left h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 3 (Polynomial.X - 1)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1
norm_num All goals completed! 🐙 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1
· right ⊢ 1 ∈ lowerBounds {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1 intro k hk right k:ℕhk:k ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs}⊢ 1 ≤ k h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1
exact hk.1 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 3 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 3 = 1
exact h_least.csInf_eq All goals completed! 🐙
Value of the sequence a at 4.
@[category test, AMS 11]
theorem a_4 : a 4 = 1 := by ⊢ a 4 = 1
have h_least : IsLeast {k : ℕ | 0 < k ∧ ((Polynomial.cyclotomic k ℤ).eval (4 :
ℤ)).natAbs.Prime} 1 := by
constructor left ⊢ 1 ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs}right ⊢ 1 ∈ lowerBounds {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1
· left ⊢ 1 ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1 simp only [Set.mem_ofPred_eq] left ⊢ 0 < 1 ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic 1 ℤ)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1
refine ⟨by ⊢ 0 < 1 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1 decide All goals completed! 🐙 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1, ?_⟩
have h1 : Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1 := Polynomial.cyclotomic_one ℤ left h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic 1 ℤ)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1
rw [h1 left h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 4 (Polynomial.X - 1)).natAbs left h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 4 (Polynomial.X - 1)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1]left h1:Polynomial.cyclotomic 1 ℤ = Polynomial.X - 1⊢ Nat.Prime (Polynomial.eval 4 (Polynomial.X - 1)).natAbs h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1
norm_num All goals completed! 🐙 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1
· right ⊢ 1 ∈ lowerBounds {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1 intro k hk right k:ℕhk:k ∈ {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs}⊢ 1 ≤ k h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1
exact hk.1 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1 h_least:IsLeast {k | 0 < k ∧ Nat.Prime (Polynomial.eval 4 (Polynomial.cyclotomic k ℤ)).natAbs} 1⊢ a 4 = 1
exact h_least.csInf_eq All goals completed! 🐙Is $a(n)$ defined for all $n \ge 1$? That is, for every $n \ge 1$, does there exist $k > 0$ such that $|\Phi_k(n)|$ is prime?
@[category research open, AMS 11]
theorem conjecture (n : ℕ) (hn : 0 < n) :
∃ k > 0, ((Polynomial.cyclotomic k ℤ).eval (n : ℤ)).natAbs.Prime := by n:ℕhn:0 < n⊢ ∃ k > 0, Nat.Prime (Polynomial.eval (↑n) (Polynomial.cyclotomic k ℤ)).natAbs
sorry All goals completed! 🐙end OeisA117545