Library PrimeGapS1.Cert
From Stdlib Require Import ZArith.
From mathcomp Require Import all_ssreflect all_algebra.
Import GRing.Theory.
From PrimeGapS1 Require Import IntMat Witness.
From PrimeGapS1 Require Import MaynardVerify MaynardSpec MaynardSpecBridge.
From PrimeGapS1.MaynardVerify Require Import Def.
Local Open Scope ring_scope.
Lemma D_M1_pos : Z.lt 0 D_M1. Proof. by vm_compute. Qed.
Lemma D_M2_pos : Z.lt 0 D_M2. Proof. by vm_compute. Qed.
Opaque M1_entry_matchZ M2_entry_matchZ.
Lemma M1_spec_eq_int {i j} :
(i < 42)%nat → (j < 42)%nat →
M1_spec_ij i j = Z2rat (mat_get M1_int i j) / Z2rat D_M1.
Proof.
move⇒ Hi Hj.
rewrite M1_spec_rat_eq.
have Hmatch : M1_entry_matchZ i j = true := M1_entry_match_in_grid Hi Hj.
rewrite M1_entry_matchZ_E in Hmatch.
move/Z.eqb_eq: Hmatch ⇒ Hcross.
rewrite [m1_num_den_at i j]surjective_pairing.
by apply: qfrac_eq_div;
[exact: m1_num_den_at_den_pos | exact: D_M1_pos | exact: Hcross].
Qed.
Lemma M2_spec_eq_int {i j} :
(i < 42)%nat → (j < 42)%nat →
M2_spec_ij i j = Z2rat (mat_get M2_int i j) / Z2rat D_M2.
Proof.
move⇒ Hi Hj.
rewrite M2_spec_rat_eq.
have Hmatch : M2_entry_matchZ i j = true := M2_entry_match_in_grid Hi Hj.
rewrite M2_entry_matchZ_E in Hmatch.
move/Z.eqb_eq: Hmatch ⇒ Hcross.
rewrite [m2_num_den_at i j]surjective_pairing.
by apply: qfrac_eq_div;
[exact: m2_num_den_at_den_pos | exact: D_M2_pos | exact: Hcross].
Qed.