section‹Pythagorean triples and Fermat's last theorem, case $n=4$›
theory Fermat4 imports"HOL-Computational_Algebra.Primes" begin
context begin
(* TODO: this lemma is also used in Fermat3 with a slightly different generalization to ints.
Maybe it should be generalized to factorial rings and moved to another theory. *)
private lemma nat_relprime_power_divisors: assumes n0: "0 < n"and abc: "(a::nat)*b = c^n"and relprime: "coprime a b" shows"∃ k. a = k^n" using assms proof (induct c arbitrary: a b rule: nat_less_induct) case (1 c) show ?case proof (cases "a > 1") case False hence"a = 0 ∨ a = 1"by linarith thus ?thesis using n0 power_one zero_power by (simp only: eq_sym_conv) blast next case True thenobtain p where p: "prime p""p dvd a"using prime_factor_nat[of a] by blast hence h1: "p dvd (c^n)"using1(3) dvd_mult2[of p a b] by presburger hence"(p^n) dvd (c^n)" using p(1) prime_dvd_power_nat[of p c n] dvd_power_same[of p c n] by blast moreoverhave h2: "¬ p dvd b" using p ‹coprime a b› coprime_common_divisor_nat [of a b p] by auto hence"¬ (p^n) dvd b"using n0 p(1) by (auto intro: dvd_trans dvd_power[of n p]) ultimatelyhave"(p^n) dvd a" using"1.prems" p(1) prime_elem_divprod_pow [of p a b n] by simp thenobtain a' c' where ac: "a = p^n * a'""c = p * c'" using h1 dvdE[of "p^n" a] dvdE[of p c] prime_dvd_power_nat[of p c n] p(1) by meson hence"p^n * (a' * b) = p^n * c'^n"using1(3) by (simp add: power_mult_distrib semiring_normalization_rules(18)) hence"a' * b = c'^n"using p(1) by auto moreoverhave"coprime a' b"using1(4) ac(1) by (simp add: ac_simps) moreoverhave"0 < b""0 < a"using h2 dvd_0_right gr0I True by fastforce+ thenhave"0 < c""1 < p" using p ‹a * b = c ^ n› n0 nat_0_less_mult_iff [of a b] n0 by (auto simp add: prime_gt_Suc_0_nat) hence"c' < c"using ac(2) by simp ultimatelyobtain k where"a' = k^n"using1(1) n0 by presburger hence"a = (p*k)^n"using ac(1) by (simp add: power_mult_distrib) thus ?thesis by blast qed qed
private lemma int_relprime_power_divisors: assumes"0 < n"and"0 ≤ a"and"0 ≤ b"and"(a::int) * b = c ^ n"and"coprime a b" shows"∃k. a = k^n" proof (cases "a = 0") case False from‹0 ≤ a›‹0 ≤ b›‹a * b = c ^ n›[symmetric] have"0 ≤ c ^ n" by simp hence"c^n = ∣c∣^n"using power_even_abs[of n c] zero_le_power_eq[of c n] by linarith hence"a * b = ∣c∣^n"using assms(4) by presburger hence"nat a * nat b = (nat ∣c∣)^n"using nat_mult_distrib[of "a""b"] assms(2) by (simp add: nat_power_eq) moreoverhave"0 ≤ b"using assms mult_less_0_iff[of a b] False by auto with‹0 ≤ a›‹coprime a b›have"coprime (nat a) (nat b)" using coprime_nat_abs_left_iff [of a "nat b"] by simp ultimatelyhave"∃ k. nat a = k^n" using nat_relprime_power_divisors[of n "nat a""nat b""nat ∣c∣"] assms(1) by blast thus ?thesis using assms(2) int_nat_eq[of "a"] by fastforce qed (simp add: zero_power[of n] assms(1))
text‹Proof of Fermat's last theorem for the case $n=4$: $$\forall x,y,z:~x^4 + y^4 = z^4 \Longrightarrow xyz=0.$$›
(*
NB: this lemma is quite slow, maybe use more steps *)
private lemma nat_power2_diff: "a ≥ (b::nat) ==> (a-b)^2 = a^2 + b^2 - 2*a*b" proof - assume a_ge_b: "a ≥ b" hence a2_ge_b2: "a^2 ≥ b^2"by (simp only: power_mono) from a_ge_b have ab_ge_b2: "a*b ≥ b^2"by (simp add: power2_eq_square) have"b*(a-b) + (a-b)^2 = a*(a-b)"by (simp add: power2_eq_square diff_mult_distrib) alsohave"… = a*b + a^2 + (b^2 - b^2) - 2*a*b" by (simp add: diff_mult_distrib2 power2_eq_square) alsowith a2_ge_b2 have"… = a*b + (a^2 - b^2) + b^2 - 2*a*b" by (simp add: power2_eq_square) alsowith ab_ge_b2 have"… = (a*b - b^2) + a^2 + b^2 - 2*a*b"by auto alsohave"… = b*(a-b) + a^2 + b^2 - 2*a*b" by (simp only: diff_mult_distrib2 power2_eq_square mult.commute) finallyshow ?thesis by arith qed
private lemma nat_power_le_imp_le_base: "[ n ≠ 0; a^n ≤ b^n ]==> (a::nat) ≤ b" by simp
private lemma nat_power_inject_base: "[ n ≠ 0; a^n = b^n ]==> (a::nat) = b" proof - assume"n ≠ 0"and ab: "a^n = b^n" thenobtain m where"n = Suc m"by (frule_tac n="n"in not0_implies_Suc, auto) with ab have"a^Suc m = b^Suc m"and"a ≥ 0"and"b ≥ 0"by auto thus ?thesis by (rule power_inject_base) qed
subsection‹Parametrisation of Pythagorean triples (over $\mathbb{N}$ and $\mathbb{Z}$)›
private theorem nat_euclid_pyth_triples: assumes abc: "(a::nat)^2 + b^2 = c^2"and ab_relprime: "coprime a b"and aodd: "odd a" shows"∃ p q. a = p^2 - q^2 ∧ b = 2*p*q ∧ c = p^2 + q^2 ∧ coprime p q" proof - have two0: "(2::nat) ≠ 0"by simp from abc have a2cb: "a^2 = c^2 - b^2"by arith
― ‹factor $a^2$ in coprime factors $(c-b)$ and $(c+b)$; hence both are squares› have a2factor: "a^2 = (c-b)*(c+b)" proof - have"c*b - c*b = 0"by simp with a2cb have"a^2 = c*c + c*b - c*b - b*b"by (simp add: power2_eq_square) alsohave"… = c*(c+b) - b*(c+b)" by (simp add: add_mult_distrib2 add_mult_distrib mult.commute) finallyshow ?thesis by (simp only: diff_mult_distrib) qed have a_nonzero: "a ≠ 0" proof (rule ccontr) assume"¬ a ≠ 0"hence"a = 0"by simp with aodd have"odd (0::nat)"by simp thus False by simp qed have b_less_c: "b < c" proof - from abc have"b^2 ≤ c^2"by linarith with two0 have"b ≤ c"by (rule_tac n="2"in nat_power_le_imp_le_base) moreoverhave"b ≠ c" proof assume"b=c"with a2cb have"a^2 = 0"by simp with a_nonzero show False by (simp add: power2_eq_square) qed ultimatelyshow ?thesis by auto qed hence b2_le_c2: "b^2 ≤ c^2"by (simp add: power_mono) have bc_relprime: "coprime b c" proof - from b2_le_c2 have cancelb2: "c^2-b^2+b^2 = c^2"by auto let ?g = "gcd b c" have"?g^2 = gcd (b^2) (c^2)"by simp with cancelb2 have"?g^2 = gcd (b^2) (c^2-b^2+b^2)"by simp hence"?g^2 = gcd (b^2) (c^2-b^2)"using gcd_add2[of "b^2""c^2 - b^2"] by (simp add: algebra_simps del: gcd_add1) with a2cb have"?g^2 dvd a^2"by (simp only: gcd_dvd2) hence"?g dvd a ∧ ?g dvd b"by simp hence"?g dvd gcd a b"by (simp only: gcd_greatest) with ab_relprime show ?thesis by (simp add: ac_simps gcd_eq_1_imp_coprime) qed have p2: "prime (2::nat)"by simp have factors_odd: "odd (c-b) ∧ odd (c+b)" proof (auto simp only: ccontr) assume"even (c-b)" with a2factor have"2 dvd a^2"by (simp only: dvd_mult2) with p2 have"2 dvd a"by auto with aodd show False by simp next assume"even (c+b)" with a2factor have"2 dvd a^2"by (simp only: dvd_mult) with p2 have"2 dvd a"by auto with aodd show False by simp qed have cb1: "c-b + (c+b) = 2*c" proof - have"c-b + (c+b) = ((c-b)+b)+c"by simp alsowith b_less_c have"… = (c+b-b)+c"by (simp only: diff_add_assoc2) alsohave"… = c+c"by simp finallyshow ?thesis by simp qed have cb2: "2*b + (c-b) = c+b" proof - have"2*b + (c-b) = b+b + (c - b)"by auto alsohave"… = b + ((c-b)+b)"by simp alsowith b_less_c have" … = b + (c+b-b)"by (simp only: diff_add_assoc2) finallyshow ?thesis by simp qed have factors_relprime: "coprime (c-b) (c+b)" proof - let ?g = "gcd (c-b) (c+b)" have cb1: "c-b + (c+b) = 2*c" proof - have"c-b + (c+b) = ((c-b)+b)+c"by simp alsowith b_less_c have"… = (c+b-b)+c"by (simp only: diff_add_assoc2) alsohave"… = c+c"by simp finallyshow ?thesis by simp qed have"?g = gcd (c-b + (c+b)) (c+b)"by simp with cb1 have"?g = gcd (2*c) (c+b)"by (rule_tac a="c-b + (c+b)"in back_subst) hence g2c: "?g dvd 2*c"by (simp only: gcd_dvd1) have"gcd (c-b) (2*b + (c-b)) = gcd (c-b) (2*b)" using gcd_add2[of "c - b""2*b + (c - b)"] by (simp add: algebra_simps) with cb2 have"?g = gcd (c-b) (2*b)"by (rule_tac a="2*b + (c-b)"in back_subst) hence g2b: "?g dvd 2*b"by (simp only: gcd_dvd2) with g2c have"?g dvd 2 * gcd b c"by (simp only: gcd_greatest gcd_mult_distrib_nat) with bc_relprime have"?g dvd 2"by simp moreoverhave"?g ≠ 0" using b_less_c by auto ultimatelyhave"1 ≤ ?g""?g ≤ 2" by (simp_all add: dvd_imp_le) thenhave g1or2: "?g = 2 ∨ ?g = 1" by arith moreoverhave"?g ≠ 2" proof assume"?g = 2" moreoverhave"?g dvd c - b" by simp ultimatelyshow False using factors_odd by simp qed ultimatelyshow ?thesis by (auto intro: gcd_eq_1_imp_coprime) qed from a2factor have"(c-b)*(c+b) = a^2"and"(2::nat) >1"by auto with factors_relprime have"∃ k. c-b = k^2" by (simp only: nat_relprime_power_divisors) thenobtain r where r: "c-b = r^2"by auto from a2factor have"(c+b)*(c-b) = a^2"and"(2::nat) >1"by auto with factors_relprime have"∃ k. c+b = k^2" by (simp only: nat_relprime_power_divisors ac_simps) thenobtain s where s: "c+b = s^2"by auto
― ‹now $p := (s+r)/2$ and $q := (s-r)/2$ is our solution› have rs_odd: "odd r ∧ odd s" proof (auto dest: ccontr) assume"even r"hence"2 dvd r"by presburger with r have"2 dvd (c-b)"by (simp only: power2_eq_square dvd_mult) with factors_odd show False by auto next assume"even s"hence"2 dvd s"by presburger with s have"2 dvd (c+b)"by (simp only: power2_eq_square dvd_mult) with factors_odd show False by auto qed obtain m where m: "m = s-r"by simp from r s have"r^2 ≤ s^2"by arith with two0 have"r ≤ s"by (rule_tac n="2"in nat_power_le_imp_le_base) with m have m2: "s = r + m"by simp have"even m" proof (rule ccontr) assume"odd m"with rs_odd and m2 show False by presburger qed thenobtain q where"m = 2*q" .. with m2 have q: "s = r + 2*q"by simp obtain p where p: "p = r+q"by simp have c: "c = p^2 + q^2" proof - from cb1 and r and s have"2*c = r^2 + s^2"by simp alsowith q have"… = 2*r^2+(2*q)^2+2*r*(2*q)"by algebra alsohave"… = 2*r^2+2^2*q^2+2*2*q*r"by (simp add: power_mult_distrib) alsohave"… = 2*(r^2+2*q*r+q^2)+2*q^2"by (simp add: power2_eq_square) alsowith p have"… = 2*p^2+2*q^2"by algebra finallyshow ?thesis by auto qed moreoverhave b: "b = 2*p*q" proof - from cb2 and r and s have"2*b = s^2 - r^2"by arith alsowith q have"… = (2*q)^2 + 2*r*(2*q)"by (simp add: power2_sum) alsowith p have"… = 4*q*p"by (simp add: power2_eq_square add_mult_distrib2) finallyshow ?thesis by auto qed moreoverhave a: "a = p^2 - q^2" proof - from p have"p≥q"by simp hence p2_ge_q2: "p^2 ≥ q^2"by (simp only: power_mono) from a2cb and b and c have"a^2 = (p^2 + q^2)^2 - (2*p*q)^2"by simp alsohave"… = (p^2)^2 + (q^2)^2 - 2*(p^2)*(q^2)" by (auto simp add: power2_sum power_mult_distrib ac_simps) alsowith p2_ge_q2 have"… = (p^2 - q^2)^2"by (simp only: nat_power2_diff) finallyhave"a^2 = (p^2 - q^2)^2"by simp with two0 show ?thesis by (rule_tac n="2"in nat_power_inject_base) qed moreoverhave"coprime p q" proof - let ?k = "gcd p q" have"?k dvd p ∧ ?k dvd q"by simp with b and a have"?k dvd a ∧ ?k dvd b" by (simp add: power2_eq_square) hence"?k dvd gcd a b"by (simp only: gcd_greatest) with ab_relprime show ?thesis by (auto intro: gcd_eq_1_imp_coprime) qed ultimatelyshow ?thesis by auto qed
text‹Now for the case of integers. Based on \textit{nat-euclid-pyth-triples}.›
private corollary int_euclid_pyth_triples: "[ coprime (a::int) b; odd a; a^2 + b^2 = c^2 ] ==>∃ p q. a = p^2 - q^2 ∧ b = 2*p*q ∧∣c∣ = p^2 + q^2 ∧ coprime p q" proof - assume ab_rel: "coprime a b"and aodd: "odd a"and abc: "a^2 + b^2 = c^2" let ?a = "nat∣a∣" let ?b = "nat∣b∣" let ?c = "nat∣c∣" have ab2_pos: "a^2 ≥ 0 ∧ b^2 ≥ 0"by simp hence"nat(a^2) + nat(b^2) = nat(a^2 + b^2)"by (simp only: nat_add_distrib) with abc have"nat(a^2) + nat(b^2) = nat(c^2)"by presburger hence"nat(∣a∣^2) + nat(∣b∣^2) = nat(∣c∣^2)"by simp hence new_abc: "?a^2 + ?b^2 = ?c^2" by (simp only: nat_mult_distrib power2_eq_square nat_add_distrib) moreoverfrom ab_rel have new_ab_rel: "coprime ?a ?b" by (simp add: gcd_int_def) moreoverhave new_a_odd: "odd ?a"using aodd by simp ultimatelyhave "∃ p q. ?a = p^2-q^2 ∧ ?b = 2*p*q ∧ ?c = p^2 + q^2 ∧ coprime p q" by (rule_tac a="?a"and b = "?b"and c="?c"in nat_euclid_pyth_triples) thenobtain m and n where mn: "?a = m^2-n^2 ∧ ?b = 2*m*n ∧ ?c = m^2 + n^2 ∧ coprime m n"by auto have"n^2 ≤ m^2" proof (rule ccontr) assume"¬ n^2 ≤ m^2" with mn have"?a = 0"by auto with new_a_odd show False by simp qed moreoverfrom mn have"int ?a = int(m^2 - n^2)"and"int ?b = int(2*m*n)" and"int ?c = int(m^2 + n^2)"by auto ultimatelyhave"∣a∣ = int(m^2) - int(n^2)"and"∣b∣ = int(2*m*n)" and"∣c∣ = int(m^2) + int(n^2)"by (simp add: of_nat_diff)+ hence absabc: "∣a∣ = (int m)^2 - (int n)^2 ∧∣b∣ = 2*(int m)*int n ∧∣c∣ = (int m)^2 + (int n)^2"by (simp add: power2_eq_square) from mn have mn_rel: "coprime (int m) (int n)" by (simp add: gcd_int_def) show"∃ p q. a = p^2 - q^2 ∧ b = 2*p*q ∧∣c∣ = p^2 + q^2 ∧ coprime p q"
(is"∃ p q. ?Q p q") proof (cases) assume apos: "a ≥ 0"thenobtain p where p: "p = int m"by simp hence"∃ q. ?Q p q" proof (cases) assume bpos: "b ≥ 0"thenobtain q where"q = int n"by simp with p apos bpos absabc mn_rel have"?Q p q"by simp thus ?thesis by (rule exI) next assume"¬ b≥0"hence bneg: "b<0"by simp thenobtain q where"q = - int n"by simp with p apos bneg absabc mn_rel have"?Q p q"by simp thus ?thesis by (rule exI) qed thus ?thesis by (simp only: exI) next assume"¬ a≥0"hence aneg: "a<0"by simp thenobtain p where p: "p = int n"by simp hence"∃ q. ?Q p q" proof (cases) assume bpos: "b ≥ 0"thenobtain q where"q = int m"by simp with p aneg bpos absabc mn_rel have"?Q p q" by (simp add: ac_simps) thus ?thesis by (rule exI) next assume"¬ b≥0"hence bneg: "b<0"by simp thenobtain q where"q = - int m"by simp with p aneg bneg absabc mn_rel have"?Q p q" by (simp add: ac_simps) thus ?thesis by (rule exI) qed thus ?thesis by (simp only: exI) qed qed
subsection‹Fermat's last theorem, case $n=4$›
text‹Core of the proof. Constructs a smaller solution over $\mathbb{Z}$ of $$a^4+b^4=c^2\,\land\,coprime\,a\,b\,\land\,abc\ne 0\,\land\,a~{\rm odd}.$$›
private lemma smaller_fermat4: assumes abc: "(a::int)^4+b^4=c^2"and abc0: "a*b*c ≠ 0"and aodd: "odd a" and ab_relprime: "coprime a b" shows "∃ p q r. (p^4+q^4=r^2 ∧ p*q*r ≠ 0 ∧ odd p ∧ coprime p q ∧ r^2 < c^2)" proof -
― ‹put equation in shape of a pythagorean triple and obtain $u$ and $v$› from ab_relprime have a2b2relprime: "coprime (a^2) (b^2)" by simp moreoverfrom aodd have"odd (a^2)"by presburger moreoverfrom abc have"(a^2)^2 + (b^2)^2 = c^2"by simp ultimatelyobtain u and v where uvabc: "a^2 = u^2-v^2 ∧ b^2 = 2*u*v ∧∣c∣ = u^2 + v^2 ∧ coprime u v" by (frule_tac a="a^2"in int_euclid_pyth_triples, auto) with abc0 have uv0: "u≠0 ∧ v≠0"by auto have av_relprime: "coprime a v" proof - have"gcd a v dvd gcd (a^2) v"by (simp add: power2_eq_square) moreoverfrom uvabc have"gcd v (a^2) dvd gcd (b^2) (a^2)" by simp with a2b2relprime have"gcd (a^2) v dvd (1::int)" by (simp add: ac_simps) ultimatelyhave"gcd a v dvd 1" by (rule dvd_trans) thenshow ?thesis by (simp add: gcd_eq_1_imp_coprime) qed
― ‹make again a pythagorean triple and obtain $k$ and $l$› from uvabc have"a^2 + v^2 = u^2"by simp with av_relprime and aodd obtain k l where
klavu: "a = k^2-l^2 ∧ v = 2*k*l ∧∣u∣ = k^2+l^2"and kl_rel: "coprime k l" by (frule_tac a="a"in int_euclid_pyth_triples, auto)
― ‹prove $b=2m$ and $kl(k^2 + l^2) = m^2$, for coprime $k$, $l$ and $k^2+l^2$› from uvabc have"even (b^2)"by simp hence"even b"by simp thenobtain m where bm: "b = 2*m"using evenE by blast have"∣k∣*∣l∣*∣k^2+l^2∣ = m^2" proof - from bm have"4*m^2 = b^2"by (simp only: power2_eq_square ac_simps) alsohave"… = ∣b^2∣"by simp alsowith uvabc have"… = 2*∣v∣*∣∣u∣∣"by (simp add: abs_mult) alsowith klavu have"… = 2*∣2*k*l∣*∣k^2+l^2∣"by simp alsohave"… = 4*∣k∣*∣l∣*∣k^2+l^2∣"by (auto simp add: abs_mult) finallyshow ?thesis by simp qed moreoverhave"(2::nat) > 1"by auto moreoverfrom kl_rel have"coprime ∣k∣∣l∣"by simp moreoverhave"coprime ∣l∣ (∣k^2+l^2∣)" proof - from kl_rel have"coprime (k*k) l" by simp hence"coprime (k*k+l*l) l"using gcd_add_mult [of l l "k*k"] by (simp add: ac_simps gcd_eq_1_imp_coprime) hence"coprime l (k^2+l^2)" by (simp add: power2_eq_square ac_simps) thus ?thesis by simp qed moreoverhave"coprime ∣k^2+l^2∣∣k∣" proof - from kl_rel have"coprime l k" by (simp add: ac_simps) hence"coprime (l*l) k" by simp hence"coprime (l*l+k*k) k"using gcd_add_mult[of k k "l*l"] by (simp add: ac_simps gcd_eq_1_imp_coprime) hence"coprime (k^2+l^2) k" by (simp add: power2_eq_square ac_simps) thus ?thesis by simp qed ultimatelyhave"∃ x y z. ∣k∣ = x^2 ∧∣l∣ = y^2 ∧∣k^2+l^2∣ = z^2" using int_relprime_power_divisors[of 2"∣k∣""∣l∣ * ∣k2 + l2∣" m]
int_relprime_power_divisors[of 2"∣l∣""∣k∣ * ∣k2 + l2∣" m]
int_relprime_power_divisors[of 2"∣k2 + l2∣""∣k∣*∣l∣" m] by (simp_all add: ac_simps) thenobtain α β γ where albega: "∣k∣ = α^2 ∧∣l∣ = β^2 ∧∣k^2+l^2∣ = γ^2" by auto
― ‹show this is a new solution› have"k^2 = α^4" proof - from albega have"∣k∣^2 = (α^2)^2"by simp thus ?thesis by simp qed moreoverhave"l^2 = β^4" proof - from albega have"∣l∣^2 = (β^2)^2"by simp thus ?thesis by simp qed moreoverhave gamma2: "k^2 + l^2 = γ^2" proof - have"k^2 ≥ 0 ∧ l^2 ≥ 0"by simp with albega show ?thesis by auto qed ultimatelyhave newabc: "α^4 + β^4 = γ^2"by auto from uv0 klavu albega have albega0: "α * β * γ ≠ 0"by auto
― ‹show the coprimality› have alphabeta_relprime: "coprime α β" proof (rule classical) let ?g = "gcd α β" assume"¬ coprime α β" thenhave gnot1: "?g ≠ 1" by (auto intro: gcd_eq_1_imp_coprime) have"?g > 1" proof - have"?g ≠ 0" proof assume"?g=0" hence"nat ∣α∣=0"by simp hence"α=0"by arith with albega0 show False by simp qed hence"?g>0"by auto with gnot1 show ?thesis by linarith qed moreoverhave"?g dvd gcd k l" proof - have"?g dvd α ∧ ?g dvd β"by auto with albega have"?g dvd ∣k∣∧ ?g dvd ∣l∣" by (simp add: power2_eq_square mult.commute) hence"?g dvd k ∧ ?g dvd l"by simp thus ?thesis by simp qed ultimatelyhave"gcd k l ≠ 1"by fastforce with kl_rel show ?thesis by auto qed
― ‹choose $p$ and $q$ in the right way› have"∃ p q. p^4 + q^4 = γ^2 ∧ p*q*γ ≠ 0 ∧ odd p ∧ coprime p q" proof - have"odd α ∨ odd β" proof (rule ccontr) assume"¬ (odd α ∨ odd β)" hence"even α ∧ even β"by simp thenhave"2 dvd α ∧ 2 dvd β"by simp thenhave"2 dvd gcd α β"by simp with alphabeta_relprime show False by auto qed moreover
{ assume"odd α" with newabc albega0 alphabeta_relprime obtain p q where "p=α ∧ q=β ∧ p^4 + q^4 = γ^2 ∧ p*q*γ ≠ 0 ∧ odd p ∧ coprime p q" by auto hence ?thesis by auto } moreover
{ assume"odd β" with newabc albega0 alphabeta_relprime obtain p q where "q=α ∧ p=β ∧ p^4 + q^4 = γ^2 ∧ p*q*γ ≠ 0 ∧ odd p ∧ coprime p q" by (auto simp add: ac_simps) hence ?thesis by auto } ultimatelyshow ?thesis by auto qed
― ‹show the solution is smaller› moreoverhave"γ^2 < c^2" proof - from gamma2 klavu have"γ^2 ≤∣u∣"by simp alsohave h1: "…≤∣u∣^2"using self_le_power[of "∣u∣"2] uv0 by auto alsohave h2: "…≤ u^2"by simp alsohave h3: "… < u^2 + v^2" proof - from uv0 have v2non0: "0 ≠ v^2" by simp have"0 ≤ v^2"by (rule zero_le_power2) with v2non0 have"0 < v^2"by (auto simp add: less_le) thus ?thesis by auto qed alsowith uvabc have"…≤∣c∣"by auto alsohave"…≤∣c∣^2"using self_le_power[of "∣c∣"2] h1 h2 h3 uvabc by linarith alsohave"…≤ c^2"by simp finallyshow ?thesis by simp qed ultimatelyshow ?thesis by auto qed
text‹Show that no solution exists, by infinite descent of $c^2$.›
private lemma no_rewritten_fermat4: "¬ (∃ (a::int) b. (a^4 + b^4 = c^2 ∧ a*b*c ≠ 0 ∧ odd a ∧ coprime a b))" proof (induct c rule: infinite_descent0_measure[where V="λc. nat(c^2)"]) case (0 x) have"x^2 ≥ 0"by (rule zero_le_power2) with0have"int(nat(x^2)) = 0"by auto hence"x = 0"by auto thus ?caseby auto next case (smaller x) thenobtain a b where"a^4 + b^4 = x^2"and"a*b*x ≠ 0" and"odd a"and"coprime a b"by auto hence"∃ p q r. (p^4+q^4=r^2 ∧ p*q*r ≠ 0 ∧ odd p ∧ coprime p q ∧ r^2 < x^2)"by (rule smaller_fermat4) thenobtain p q r where pqr: "p^4 + q^4 = r^2 ∧ p*q*r ≠ 0 ∧ odd p ∧ coprime p q ∧ r^2 < x^2"by auto have"r^2 ≥ 0"and"x^2 ≥ 0"by (auto simp only: zero_le_power2) hence"int(nat(r^2)) = r^2 ∧ int(nat(x^2)) = x^2"by auto with pqr have"int(nat(r^2)) < int(nat(x^2))"by auto hence"nat(r^2) < nat(x^2)"by presburger with pqr show ?caseby auto qed
text‹The theorem. Puts equation in requested shape.›
theorem fermat_4: assumes ass: "(x::int)^4 + y^4 = z^4" shows"x*y*z=0" proof (rule ccontr) let ?g = "gcd x y" let ?c = "(z div ?g)^2" assume xyz0: "x*y*z ≠ 0"
― ‹divide out the g.c.d.› hence"x ≠ 0 ∨ y ≠ 0"by simp thenobtain a b where ab: "x = ?g*a ∧ y = ?g*b ∧ coprime a b" using gcd_coprime_exists[of x y] by (auto simp: mult.commute) moreoverhave abc: "a^4 + b^4 = ?c^2 ∧ a*b*?c ≠ 0" proof - have zgab: "z^4 = ?g^4 * (a^4+b^4)" proof - from ab ass have"z^4 = (?g*a)^4+(?g*b)^4"by simp thus ?thesis by (simp only: power_mult_distrib distrib_left) qed have cgz: "z^2 = ?c * ?g^2" proof - from zgab have"?g^4 dvd z^4"by simp hence"?g dvd z"by simp hence"(z div ?g)*?g = z"by (simp only: ac_simps dvd_mult_div_cancel) with ab show ?thesis by (auto simp only: power2_eq_square ac_simps) qed with xyz0 have c0: "?c≠0"by (auto simp add: power2_eq_square) from xyz0 have g0: "?g≠0"by simp have"a^4 + b^4 = ?c^2" proof - have"?c^2 * ?g^4 = (a^4+b^4)*?g^4" proof - have"?c^2 * ?g^4 = (?c*?g^2)^2"by algebra alsowith cgz have"… = (z^2)^2"by simp alsohave"… = z^4"by algebra alsowith zgab have"… = ?g^4*(a^4+b^4)"by simp finallyshow ?thesis by simp qed with g0 show ?thesis by auto qed moreoverfrom ab xyz0 c0 have"a*b*?c≠0"by auto ultimatelyshow ?thesis by simp qed
― ‹choose the parity right› have"∃ p q. p^4 + q^4 = ?c^2 ∧ p*q*?c≠0 ∧ odd p ∧ coprime p q" proof - have"odd a ∨ odd b" proof (rule ccontr) assume"¬(odd a ∨ odd b)" hence"2 dvd a ∧ 2 dvd b"by simp hence"2 dvd gcd a b"by simp with ab show False by auto qed moreover
{ assume"odd a" thenobtain p q where"p = a"and"q = b"and"odd p"by simp with ab abc have ?thesis by auto } moreover
{ assume"odd b" thenobtain p q where"p = b"and"q = a"and"odd p"by simp with ab abc have "p^4 + q^4 = ?c^2 ∧ p*q*?c≠0 ∧ odd p ∧ coprime p q" by (simp add: ac_simps) hence ?thesis by auto } ultimatelyshow ?thesis by auto qed
― ‹show contradiction using the earlier result› thus False by (auto simp only: no_rewritten_fermat4) qed
corollary fermat_mult4: assumes xyz: "(x::int)^n + y^n = z^n"and n: "4 dvd n" shows"x*y*z=0" proof - from n obtain m where"n = m*4"by (auto simp only: ac_simps dvd_def) with xyz have"(x^m)^4 + (y^m)^4 = (z^m)^4"by (simp only: power_mult) hence"(x^m)*(y^m)*(z^m) = 0"by (rule fermat_4) thus ?thesis by auto qed
end
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.5 Sekunden
(vorverarbeitet am 2026-06-10)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.