From mathcomp Require Import all_ssreflect. (* 京大・理・2009年 *) Record ext2 : Set := Ext2 {pnat: nat; pirr: nat}. Definition prod2 (a b : ext2) := Ext2 (pnat a * pnat b + 2 * pirr a * pirr b) (pnat a * pirr b + pirr a * pnat b). Section Problem1. Variables a b : nat. Hypothesis odd_a : odd a. Hypothesis Hab : coprime a b. Definition ab := Ext2 a b. Theorem odd_a2 : odd (pnat (prod2 ab ab)). Proof. rewrite /=. Search _ odd addn. by rewrite odd_add odd_mul odd_a /= -mulnA mul2n odd_double. Qed. Lemma coprimeMDl k c d : coprime c (k * c + d) = coprime c d. Proof. by rewrite /coprime gcdnMDl. Qed. Theorem mpr_a2 : coprime (pnat (prod2 ab ab)) (pirr (prod2 ab ab)). Proof. rewrite /=. rewrite [b*a]mulnC addnn -muln2. rewrite !coprime_mulr. rewrite coprime_sym coprimeMDl. rewrite !coprime_mulr !Hab. rewrite coprimen2 odd_a /=. rewrite addnC coprime_sym coprimeMDl. rewrite !coprime_mulr coprime_sym !Hab /=. (* have ->: 2 * b * b = b * b * 2 by ring. *) rewrite -mulnA mulnC coprime_sym coprimeMDl. by rewrite coprime_mulr !coprime2n odd_a. Qed. End Problem1. Section Problem2. Lemma odd_coprime2 ab n : odd (pnat ab) -> coprime (pnat ab) (pirr ab) -> let ab2n := iter n (fun ab => prod2 ab ab) ab in odd (pnat ab2n) && coprime (pnat ab2n) (pirr ab2n). Proof. elim: n => [|n IHn] odd_a copr_ab. Admitted. Lemma prod2A a b c : prod2 a (prod2 b c) = prod2 (prod2 a b) c. Proof. rewrite /prod2. destruct a, b, c => /=. f_equal; ring. Qed. Lemma prod2e a : prod2 a (Ext2 1 0) = a. Admitted. Lemma prod2_iter n ab x : iter n (prod2 ab) x = prod2 (iter n (prod2 ab) (Ext2 1 0)) x. Admitted. Lemma prod2_2n n ab : iter n (fun ab => prod2 ab ab) ab = iter (2^n) (prod2 ab) (Ext2 1 0). Admitted. Lemma prod2_2n_Sn n ab : iter n (fun ab => prod2 ab ab) ab = iter (2^n - n.+1) (prod2 ab) (iter n (prod2 ab) ab). Proof. have Hn : 2^n - n.+1 + n.+1 = 2^n. by rewrite subnK // ltn_expl. Admitted. Lemma not_odd_coprime ab ab' n : odd (pnat ab) -> coprime (pnat ab) (pirr ab) -> odd (pnat ab') && coprime (pnat ab') (pirr ab') = false -> let abn := iter n (prod2 ab) ab' in odd (pnat abn) && coprime (pnat abn) (pirr abn) = false. Proof. move=> odd_a copr_ab. elim: n ab' => // n IHn ab' Hab'. move: {IHn}(IHn (prod2 ab ab')). rewrite iterSr. apply. case odd_a': (odd (pnat ab')) Hab'. Admitted. Lemma odd_coprime ab n : odd (pnat ab) -> coprime (pnat ab) (pirr ab) -> let abn := iter n (prod2 ab) ab in odd (pnat abn) && coprime (pnat abn) (pirr abn). Proof. move=> odd_a copr_ab /=. set abn := iter n _ _. case Hneg: (_ && _) => //. move: (not_odd_coprime _ _ (2^n - n.+1) odd_a copr_ab Hneg). rewrite -prod2_2n_Sn => <-. by apply odd_coprime2. Qed. End Problem2. Section Nagoya2013. Definition Sk k n := \sum_(1<=i 1. Definition Tm n := \sum_(1<=k i _. by rewrite Sk1 muln1. rewrite big_mkord. congr subn. apply eq_bigr => i _. by rewrite !exp1n !muln1. Qed. Lemma Tm2 : Tm 2 = 3^m - 3. Proof. rewrite /Tm. have ->: 3^m - 3 = 2^m - 2 + (3^m - 1 - 2^m). rewrite addnC. rewrite addnBA. rewrite subnK. by rewrite -subnDA. rewrite subn1 -ltnS prednK. by apply ltn_exp2r, ltnW. by rewrite expn_gt0. rewrite -{1}(exp1n m). rewrite ltn_exp2r //. by apply ltnW. rewrite -Tm1. rewrite [in 3^m](_ : 3 = 1+2) //. rewrite Pascal. transitivity (Tm 1 + (\sum_(1 <= k < m) 'C(m,k) * 2^k)). rewrite -big_split /=. apply eq_bigr => i _. rewrite -mulnDr. congr muln. rewrite /Sk !big_cons !big_nil. by rewrite !addn0. congr addn. transitivity ((\sum_(0 <= k < m.+1) 'C(m,k) * 2^k) - 1 - 2^m). Qed. Theorem Tmn n : Tm n.+1 = n.+2^m - n.+2. Proof. elim:n => [|n IHn] /=. by apply Tm1. Admitted. Theorem Skp p k : p > 2 -> prime p -> 1 <= k < p.-1 -> p %| Sk k p.-1. Admitted. End Nagoya2013.