Library PrimeGapS1.MaynardBasis
From Stdlib Require Import List Lia.
From mathcomp Require Import all_ssreflect zify.
From PrimeGapS1 Require Import Witness.
Import ListNotations.
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
Definition maynard_basis : list (nat × nat) :=
[ (0, 0); (1, 0); (0, 1); (2, 0); (1, 1); (3, 0)
; (0, 2); (2, 1); (4, 0); (1, 2); (3, 1); (5, 0)
; (0, 3); (2, 2); (4, 1); (6, 0); (1, 3); (3, 2)
; (5, 1); (7, 0); (0, 4); (2, 3); (4, 2); (6, 1)
; (8, 0); (1, 4); (3, 3); (5, 2); (7, 1); (9, 0)
; (0, 5); (2, 4); (4, 3); (6, 2); (8, 1); (10, 0)
; (1, 5); (3, 4); (5, 3); (7, 2); (9, 1); (11, 0)
]%nat.
Lemma maynard_basis_size : length maynard_basis = 42.
Proof. reflexivity. Qed.
Lemma maynard_basis_eq_witness : maynard_basis = Witness.basis.
Proof. vm_compute. reflexivity. Qed.
Definition canonical_basis : seq (nat × nat) :=
[seq p <- [seq (b, c) | b <- iota 0 12, c <- iota 0 6]
| (p.1 + 2 × p.2 ≤ 11)%N].
Lemma maynard_basis_perm_canonical :
perm_eq maynard_basis canonical_basis.
Proof. by vm_compute. Qed.
Lemma canonical_basis_spec p :
(p \in canonical_basis) = (p.1 + 2 × p.2 ≤ 11)%N.
Proof.
case: p ⇒ b c.
rewrite /canonical_basis mem_filter.
case Hp: (b + 2 × c ≤ 11)%N ⇒ /=; last by [].
have Hb : b \in iota 0 12.
rewrite mem_iota /= add0n ltnS.
by apply: leq_trans Hp; rewrite leq_addr.
have Hc : c \in iota 0 6.
rewrite mem_iota /= add0n.
have H2c : 2 × c ≤ 11 by apply: leq_trans Hp; rewrite leq_addl.
lia.
exact: (allpairs_f (fun a d ⇒ (a, d)) Hb Hc).
Qed.
Lemma maynard_basis_spec p :
(p \in maynard_basis) = (p.1 + 2 × p.2 ≤ 11)%N.
Proof.
by rewrite (perm_mem maynard_basis_perm_canonical) canonical_basis_spec.
Qed.
Lemma maynard_basis_uniq : uniq maynard_basis.
Proof. by vm_compute. Qed.