theory FourSquares imports"HOL-Number_Theory.Number_Theory" begin
context
fixes sum4sq_nat :: "nat ==> nat ==> nat ==> nat ==> nat" defines"sum4sq_nat a b c d ≡ a^2+b^2+c^2+d^2"
fixes is_sum4sq_nat :: "nat ==> bool" defines"is_sum4sq_nat n ≡ (∃ a b c d. n = sum4sq_nat a b c d)"
begin
(* TODO: move this lemma to the distribution (?). (It is used also in QuadForm and TwoSquares) *)
private lemma best_division_abs: "(n::int) > 0 ==>∃ k. 2 * ∣a - k*n∣≤ n" proof - assume a: "n > 0"
define k where"k = a div n" have h: "a - k * n = a mod n"by (simp add: div_mult_mod_eq algebra_simps k_def) thus ?thesis proof (cases "2 * (a mod n) ≤ n") case True hence"2 * ∣a - k*n∣≤ n"using h pos_mod_sign a by auto thus ?thesis by blast next case False hence"2 * (n - a mod n) ≤ n"by auto have"a - (k+1)*n = a mod n - n"using h by (simp add: algebra_simps) hence"2 * ∣a - (k+1)*n∣≤ n"using h pos_mod_bound[of n a] a False by fastforce thus ?thesis by blast qed qed
text‹Shows that all nonnegative integers can be written as the sum of four squares. The proof consists of the following steps:
begin{itemize}\item For every prime $p=2n+1$ the two sets of residue classes $$\{x^2 \bmod p\mid 0\le x\le n\} ~{\rm and}~ \{-1-y^2 \bmod p \mid 0 \le y \le n\}$$ both contain $n+1$ different elements and therefore they must have at least one element in common.
item Hence there exist $x,y$ such that $x^2+y^2+1^2+0^2$ is a multiple of $p$.
item The next step is to show, by an infinite descent, that $p$ itself can be written as the sum of four squares.
item Finally, using the multiplicity of this form, the same holds for all positive numbers.
end{itemize}›
private definition
sum4sq_int :: "int × int × int × int ==> int"where "sum4sq_int = (λ(a,b,c,d). a^2+b^2+c^2+d^2)"
private definition
is_sum4sq_int :: "int ==> bool"where "is_sum4sq_int n ⟷ (∃ a b c d. n = sum4sq_int(a,b,c,d))"
private lemma sum4sq_int_nat_eq: "sum4sq_nat a b c d = sum4sq_int (a, b, c, d)" unfolding sum4sq_nat_def sum4sq_int_def by simp
private lemma is_sum4sq_int_nat_eq: "is_sum4sq_nat n = is_sum4sq_int (int n)" unfolding is_sum4sq_nat_def is_sum4sq_int_def proof assume"∃a b c d. n = sum4sq_nat a b c d" thus"∃a b c d. int n = sum4sq_int (a, b, c, d)"using sum4sq_int_nat_eq by force next assume"∃a b c d. int n = sum4sq_int (a, b, c, d)" thenobtain a b c d where"int n = sum4sq_int (a, b, c, d)"by blast hence"int n = sum4sq_int (int (nat ∣a∣), int (nat ∣b∣), int (nat ∣c∣), int (nat ∣d∣))" unfolding sum4sq_int_def by simp hence"int n = int (sum4sq_nat (nat ∣a∣) (nat ∣b∣) (nat ∣c∣) (nat ∣d∣))" using sum4sq_int_nat_eq by presburger thus"∃a b c d. n = sum4sq_nat a b c d"by auto qed
private lemma is_mult_sum4sq_int: "is_sum4sq_int x ==> is_sum4sq_int y ==> is_sum4sq_int (x*y)" by (unfold is_sum4sq_int_def, auto simp only: mult_sum4sq_int, blast)
private lemma is_mult_sum4sq_nat: "is_sum4sq_nat x ==> is_sum4sq_nat y ==> is_sum4sq_nat (x*y)" using is_mult_sum4sq_int is_sum4sq_int_nat_eq by simp
private lemma mult_oddprime_is_sum4sq: "[ prime (nat p); odd p ]==> ∃ t. 0<t ∧ t<p ∧ is_sum4sq_int (p*t)" proof - assume p1: "prime (nat p)" thenhave p0: "p > 1"and"prime p" by (simp_all add: prime_int_nat_transfer prime_nat_iff) assume p2: "odd p" thenobtain n where n: "p = 2*n+1"using oddE by blast with p1 have n0: "n > 0"by (auto simp add: prime_nat_iff) let ?C = "{0 ..< p}" let ?D = "{0 .. n}" let ?f = "%x. x^2 mod p" let ?g = "%x. (-1-x^2) mod p" let ?A = "?f ` ?D" let ?B = "?g ` ?D" have finC: "finite ?C"by simp have finD: "finite ?D"by simp from p0 have AsubC: "?A ⊆ ?C"and BsubC: "?B ⊆ ?C" by auto with finC have finA: "finite ?A"and finB: "finite ?B" by (auto simp add: finite_subset) from AsubC BsubC have AunBsubC: "?A ∪ ?B ⊆ ?C"by (rule Un_least) from p0 have cardC: "card ?C = nat p"using card_atLeastZeroLessThan_int by blast from n0 have cardD: "card ?D = 1+ nat n"by simp have cardA: "card ?A = card ?D" proof - have"inj_on ?f ?D" proof (unfold inj_on_def, auto) fix x fix y assume x0: "0 ≤ x"and xn: "x ≤ n"and y0: "0 ≤ y"and yn: " y ≤ n" and xyp: "x^2 mod p = y^2 mod p" with p0 have"[x^2 = y^2] (mod p)"using cong_def by blast hence"p dvd x^2-y^2"using cong_iff_dvd_diff by blast hence"p dvd (x+y)*(x-y)"by (simp add: power2_eq_square algebra_simps) hence"p dvd x+y ∨ p dvd x-y"using‹prime p› p0 by (auto dest: prime_dvd_multD) moreover
{ assume"p dvd x+y" moreoverfrom xn yn n have"x+y < p"by auto ultimatelyhave"¬ x+y > 0"by (auto simp add: zdvd_not_zless) with x0 y0 have"x = y"by auto } ― ‹both are zero› moreover
{ assume ass: "p dvd x-y" have"x = y" proof (rule ccontr, case_tac "x-y ≥ 0") assume"x-y ≥ 0"and"x ≠ y"hence"x-y > 0"by auto with ass have"¬ x-y < p"by (auto simp add: zdvd_not_zless) with xn y0 n p0 show"False"by auto next assume"¬ 0 ≤ x-y"hence"y-x > 0"by auto moreoverfrom x0 yn n p0 have"y-x < p"by auto ultimatelyhave"¬ p dvd y-x"by (auto simp add: zdvd_not_zless) moreoverfrom ass have"p dvd -(x-y)"by (simp only: dvd_minus_iff) ultimatelyshow"False"by auto qed } ultimatelyshow"x=y"by auto qed with finD show ?thesis by (simp only: inj_on_iff_eq_card) qed have cardB: "card ?B = card ?D" proof - have"inj_on ?g ?D" proof (unfold inj_on_def, auto) fix x fix y assume x0: "0 ≤ x"and xn: "x ≤ n"and y0: "0 ≤ y"and yn: " y ≤ n" and xyp: "(-1-x^2) mod p = (-1-y^2) mod p" with p0 have"[-1-y^2 = -1-x^2] (mod p)"by (simp only: cong_def) hence"p dvd (-1-y^2) - (-1-x^2)"by (simp only: cong_iff_dvd_diff) moreoverhave"-1-y^2 - (-1-x^2) = x^2 - y^2"by arith ultimatelyhave"p dvd x^2-y^2"by simp hence"p dvd (x+y)*(x-y)"by (simp add: power2_eq_square algebra_simps) with p1 have"p dvd x+y ∨ p dvd x-y"using‹prime p› p0 by (auto dest: prime_dvd_multD) moreover
{ assume"p dvd x+y" moreoverfrom xn yn n have"x+y < p"by auto ultimatelyhave"¬ x+y > 0"by (auto simp add: zdvd_not_zless) with x0 y0 have"x = y"by auto } ― ‹both are zero› moreover
{ assume ass: "p dvd x-y" have"x = y" proof (rule ccontr, case_tac "x-y ≥ 0") assume"x-y ≥ 0"and"x ≠ y"hence"x-y > 0"by auto with ass have"¬ x-y < p"by (auto simp add: zdvd_not_zless) with xn y0 n p0 show"False"by auto next assume"¬ 0 ≤ x-y"hence"y-x > 0"by auto moreoverfrom x0 yn n p0 have"y-x < p"by auto ultimatelyhave"¬ p dvd y-x"by (auto simp add: zdvd_not_zless) moreoverfrom ass have"p dvd -(x-y)"by (simp only: dvd_minus_iff) ultimatelyshow"False"by auto qed } ultimatelyshow"x=y"by auto qed with finD show ?thesis by (simp only: inj_on_iff_eq_card) qed have"?A ∩ ?B ≠ {}" proof (rule ccontr, auto) assume ABdisj: "?A ∩ ?B = {}" from cardA cardB cardD have"2 + 2*(nat n) = card ?A + card ?B"by auto alsowith finA finB ABdisj have"… = card (?A ∪ ?B)" by (simp only: card_Un_disjoint) alsowith finC AunBsubC have"…≤ card ?C"by (simp only: card_mono) alsowith cardC have"… = nat p"by simp finallyhave"2 + 2*(nat n) ≤ nat p"by simp with n show"False"by arith qed thenobtain z where"z ∈ ?A ∧ z ∈ ?B"by auto thenobtain x y where xy: "x ∈ ?D ∧ y ∈ ?D ∧ z = x^2 mod p ∧ z = (-1-y^2) mod p"by blast with p0 have"[x^2=-1-y^2](mod p)"by (simp add: cong_def) hence"p dvd x^2-(-1-y^2)"by (simp only: cong_iff_dvd_diff) moreoverhave"x^2-(-1-y^2)=x^2+y^2+1"by arith ultimatelyhave"p dvd sum4sq_int(x,y,1,0)"by (auto simp add: sum4sq_int_def) thenobtain t where t: "p * t = sum4sq_int(x,y,1,0)"by (auto simp only: dvd_def eq_refl) hence"is_sum4sq_int (p*t)"by (unfold is_sum4sq_int_def, auto) moreoverhave"t > 0 ∧ t < p" proof have"x^2 ≥ 0 ∧ y^2 ≥ 0"by simp hence"x^2+y^2+1 > 0"by arith with t have"p*t > 0"by (unfold sum4sq_int_def, auto) moreover
{ assume"t < 0"with p0 have"p*t < p*0"by (simp only: zmult_zless_mono2) hence"p*t < 0"by simp } moreover
{ assume"t = 0"hence"p*t = 0"by simp } ultimatelyhave"¬ t < 0 ∧ t ≠ 0"by auto thus"t > 0"by simp from xy have"x^2 ≤ n^2 ∧ y^2 ≤ n^2"by (auto simp add: power_mono) hence"x^2+y^2+1 ≤ 2*n^2 + 1"by auto with t have contr: "p*t ≤ 2*n^2+1"by (simp add: sum4sq_int_def) moreover
{ assume"t > n+1" with p0 have"p*(n+1) < p*t"by (simp only: zmult_zless_mono2) with n have"p*t > (2*n+1)*n + (2*n+1)*1"by (simp only: distrib_left) hence"p*t > 2*n*n + n + 2*n + 1"by (simp only: distrib_right mult_1_left) with n0 have"p*t > 2*n^2 + 1"by (simp add: power2_eq_square) } ultimatelyhave"¬ t > n+1"by auto with n0 n show"t < p"by auto qed ultimatelyshow ?thesis by blast qed
private lemma zprime_is_sum4sq: "prime (nat p) ==> is_sum4sq_int p" proof (cases) assume p2: "p=2" hence"p = sum4sq_int(1,1,0,0)"by (auto simp add: sum4sq_int_def) thus ?thesis by (auto simp add: is_sum4sq_int_def) next assume"¬ p =2"and prp: "prime (nat p)" hence"¬ nat p = 2"by simp with prp have"2 < nat p"using prime_nat_iff by force moreoverwith prp have"odd (nat p)"using prime_odd_nat[of "nat p"] by blast ultimatelyhave"odd p"by (simp add: even_nat_iff) with prp have"∃ t. 0<t ∧ t<p ∧ is_sum4sq_int (p*t)"by (rule mult_oddprime_is_sum4sq) thenobtain a b c d t where pt_sol: "0<t ∧ t<p ∧ p*t = sum4sq_int(a,b,c,d)" by (unfold is_sum4sq_int_def, blast) hence Qt: "0<t ∧ t<p ∧ (∃ a1 a2 a3 a4. p*t = sum4sq_int(a1,a2,a3,a4))"
(is"?Q t") by blast have"?Q 1" proof (rule ccontr) assume nQ1: "¬ ?Q 1" have"¬ ?Q t" proof (induct t rule: infinite_descent0_measure[where V="λx. (nat x)- 1"], clarify) fix x a b c d assume"nat x - 1 = 0"and"x > 0"and s: "p*x=sum4sq_int(a,b,c,d)"and"x < p" moreoverhence"x = 1"by arith ultimatelyhave"?Q 1"by auto with nQ1 show False by auto next fix x assume"0 < nat x - 1"and"¬¬ ?Q x" thenobtain a1 a2 a3 a4 where ass: "1<x ∧ x<p ∧ p*x = sum4sq_int(a1,a2,a3,a4)" by auto have"∃ y. nat y - 1 < nat x - 1 ∧ ?Q y" proof (cases) assume evx: "even x" hence"even (x*p)"by simp with ass have ev1234: "even (a1^2+a2^2 + a3^2+a4^2)" by (auto simp add: sum4sq_int_def ac_simps) have"∃ b1 b2 b3 b4. p*x=sum4sq_int(b1,b2,b3,b4) ∧ even (b1+b2) ∧ even (b3+b4)" proof (cases) assume ev12: "even (a1^2+a2^2)" with ev1234 ass show ?thesis by auto next assume"¬ even (a1^2+a2^2)" hence odd12: "odd (a1^2+a2^2)"by simp with ev1234 have odd34: "odd (a3^2+a4^2)"by auto show ?thesis proof (cases) assume ev1: "even (a1^2)" with odd12 have odd2: "odd (a2^2)"by simp show ?thesis proof (cases) assume"even (a3^2)" moreoverfrom ass have"p*x = sum4sq_int(a1,a3,a2,a4)"by (auto simp add: sum4sq_int_def) ultimatelyshow ?thesis using odd2 odd34 ev1 by auto next assume"¬ even (a3^2)" moreoverfrom ass have"p*x = sum4sq_int(a1,a4,a2,a3)"by (auto simp add: sum4sq_int_def) ultimatelyshow ?thesis using odd34 odd2 ev1 by auto qed next assume odd1: "¬ even (a1^2)" with odd12 have ev2: "even (a2^2)"by simp show ?thesis proof (cases) assume"even (a3^2)" moreoverfrom ass have"sum4sq_int(a1,a4,a2,a3)=p*x"by (auto simp add: sum4sq_int_def) ultimatelyshow ?thesis using odd34 odd1 ev2 by force next assume"¬ even (a3^2)" moreoverfrom ass have"sum4sq_int(a1,a3,a2,a4)=p*x"by (auto simp add: sum4sq_int_def) ultimatelyshow ?thesis using odd34 odd1 ev2 by force qed qed qed thenobtain b1 b2 b3 b4 where b: "p*x = sum4sq_int(b1,b2,b3,b4) ∧ even (b1+b2) ∧ even (b3+b4)"by auto thenobtain c1 c3 where c13: "b1+b2 = 2*c1 ∧ b3+b4 = 2*c3" using evenE[of "b1+b2"] evenE[of "b3+b4"] by meson from b have"even (b1-b2) ∧ even (b3-b4)"by simp thenobtain c2 c4 where c24: "b1-b2 = 2*c2 ∧ b3-b4 = 2*c4" using evenE[of "b1-b2"] evenE[of "b3-b4"] by meson from evx obtain y where y: "x = 2*y"using evenE by blast hence"4*(p*y) = 2*(p*x)"by (simp add: ac_simps) alsofrom b have"… = 2*b1^2 + 2*b2^2 + 2*b3^2 + 2*b4^2" by (auto simp: sum4sq_int_def) alsohave"… = (b1 + b2)^2 + (b1 - b2)^2 + (b3 + b4)^2 + (b3 - b4)^2" by (auto simp add: power2_eq_square algebra_simps) alsowith c13 c24 have"… = 4*(c1^2 + c2^2 + c3^2 + c4^2)" by (auto simp add: power_mult_distrib) finallyhave"p * y = sum4sq_int(c1,c2,c3,c4)"by (auto simp add: sum4sq_int_def) moreoverfrom y ass have"0 < y ∧ y < p ∧ (nat y) - 1 < (nat x) - 1"by arith ultimatelyshow ?thesis by blast next assume xodd: "¬ even x" with ass have"∃ c1 c2 c3 c4. 2*∣a1-c1*x∣≤x ∧ 2*∣a2-c2*x∣≤x ∧ 2*∣a3-c3*x∣≤x ∧ 2*∣a4-c4*x∣≤x" by (simp add: best_division_abs) thenobtain b1 c1 b2 c2 b3 c3 b4 c4 where
bc_def: "b1 = a1-c1*x ∧ b2 = a2-c2*x ∧ b3 = a3-c3*x ∧ b4 = a4-c4*x" and"2*∣b1∣≤x ∧ 2*∣b2∣≤x ∧ 2*∣b3∣≤x ∧ 2*∣b4∣≤x" by blast moreoverhave"2*∣b1∣≠x ∧ 2*∣b2∣≠x ∧ 2*∣b3∣≠x ∧ 2*∣b4∣≠x"using xodd by fastforce ultimatelyhave bc_abs: "2*∣b1∣<x ∧ 2*∣b2∣<x ∧ 2*∣b3∣<x ∧ 2*∣b4∣<x"by auto let ?B = "b1^2 + b2^2 + b3^2 + b4^2" let ?C = "c1^2 + c2^2 + c3^2 + c4^2" have"x dvd ?B" proof from bc_def ass have "?B = p*x - 2*(a1*c1+a2*c2+a3*c3+a4*c4)*x + ?C*x^2" unfolding sum4sq_int_def by (auto simp add: power2_eq_square algebra_simps) thus"?B = x*(p - 2*(a1*c1+a2*c2+a3*c3+a4*c4) + ?C*x)" by (auto simp add: ac_simps power2_eq_square
distrib_left right_diff_distrib) qed thenobtain y where y: "?B = x * y"by (auto simp add: dvd_def) let ?A1 = "a1*b1 + a2*b2 + a3*b3 + a4*b4" let ?A2 = "a1*b2 - a2*b1 - a3*b4 + a4*b3" let ?A3 = "a1*b3 + a2*b4 - a3*b1 - a4*b2" let ?A4 = "a1*b4 - a2*b3 + a3*b2 - a4*b1" let ?A = "sum4sq_int(?A1,?A2,?A3,?A4)" have"x dvd ?A1 ∧ x dvd ?A2 ∧ x dvd ?A3 ∧ x dvd ?A4" proof (safe) from bc_def have "?A1 = (b1+c1*x)*b1 + (b2+c2*x)*b2 + (b3+c3*x)*b3 + (b4+c4*x)*b4" by simp alsowith y have"… = x*(y + c1*b1 + c2*b2 + c3*b3 + c4*b4)" by (auto simp add: distrib_left power2_eq_square ac_simps) finallyshow"x dvd ?A1"by auto from bc_def have "?A2 = (b1+c1*x)*b2 - (b2+c2*x)*b1 - (b3+c3*x)*b4 + (b4+c4*x)*b3" by simp alsohave"… = x*(c1*b2 - c2*b1 - c3*b4 + c4*b3)" by (auto simp add: distrib_left right_diff_distrib ac_simps) finallyshow"x dvd ?A2"by auto from bc_def have "?A3 = (b1+c1*x)*b3 + (b2+c2*x)*b4 - (b3+c3*x)*b1 - (b4+c4*x)*b2" by simp alsohave"… = x*(c1*b3 + c2*b4 - c3*b1 - c4*b2)" by (auto simp add: distrib_left right_diff_distrib ac_simps) finallyshow"x dvd ?A3"by auto from bc_def have "?A4 = (b1+c1*x)*b4 - (b2+c2*x)*b3 + (b3+c3*x)*b2 - (b4+c4*x)*b1" by simp alsohave"… = x*(c1*b4 - c2*b3 + c3*b2 - c4*b1)" by (auto simp add: distrib_left right_diff_distrib ac_simps) finallyshow"x dvd ?A4"by auto qed thenobtain d1 d2 d3 d4 where d: "?A1=x*d1 ∧ ?A2=x*d2 ∧ ?A3=x*d3 ∧ ?A4=x*d4" by (auto simp add: dvd_def) let ?D = "sum4sq_int(d1,d2,d3,d4)" from d have"x^2*?D = ?A" by (auto simp only: sum4sq_int_def power_mult_distrib distrib_left) alsohave"… = sum4sq_int(a1,a2,a3,a4)*sum4sq_int(b1,b2,b3,b4)" by (simp only: mult_sum4sq_int) alsowith y ass have"… = (p*x)*(x*y)"by (auto simp add: sum4sq_int_def) alsohave"… = x^2*(p*y)"by (simp only: power2_eq_square ac_simps) finallyhave"x^2*(?D - p*y) = 0"by (auto simp add: right_diff_distrib) with ass have"p*y = ?D"by auto moreoverhave y_l_x: "y < x" proof - have"4*b1^2 = (2*∣b1∣)^2 ∧ 4*b2^2 = (2*∣b2∣)^2 ∧ 4*b3^2 = (2*∣b3∣)^2 ∧ 4*b4^2 = (2*∣b4∣)^2"by simp with bc_abs have"4*b1^2<x^2 ∧ 4*b2^2<x^2 ∧ 4*b3^2<x^2 ∧ 4*b4^2<x^2" using power_strict_mono [of "2*∣b∣" x 2for b] by auto hence"?B < x^2"by auto with y have"x*(x-y) > 0" by (auto simp add: power2_eq_square right_diff_distrib) moreoverfrom ass have"x > 0"by simp ultimatelyshow ?thesis using zero_less_mult_pos by fastforce qed moreoverhave"y > 0" proof - have b2pos: "b1^2 ≥ 0 ∧ b2^2 ≥ 0 ∧ b3^2 ≥ 0 ∧ b4^2 ≥ 0"by simp hence"?B = 0 ∨ ?B > 0"by arith moreover
{ assume"?B = 0" moreoverfrom b2pos have "?B-b1^2 ≥ 0 ∧ ?B-b2^2 ≥ 0 ∧ ?B-b3^2 ≥ 0 ∧ ?B-b4^2 ≥ 0"by arith ultimatelyhave"b1^2 ≤ 0 ∧ b2^2 ≤ 0 ∧ b3^2 ≤ 0 ∧ b4^2 ≤ 0"by auto with b2pos have"b1^2 = 0 ∧ b2^2 = 0 ∧ b3^2 = 0 ∧ b4^2 = 0"by arith hence"b1 = 0 ∧ b2 = 0 ∧ b3 = 0 ∧ b4 = 0"by auto with bc_def have"x dvd a1 ∧ x dvd a2 ∧ x dvd a3 ∧ x dvd a4" by auto hence"x^2 dvd a1^2 ∧ x^2 dvd a2^2 ∧ x^2 dvd a3^2 ∧ x^2 dvd a4^2"by simp hence"x^2 dvd a1^2+a2^2+a3^2+a4^2"by (simp only: dvd_add) with ass have"x^2 dvd p*x"by (auto simp only: sum4sq_int_def) hence"x*x dvd x*p"by (simp only: power2_eq_square ac_simps) with ass have"nat x dvd nat p" by (simp add: nat_dvd_iff) moreoverfrom ass prp have"x ≥ 0 ∧ x ≠ 1 ∧ x ≠ p ∧ prime (nat p)"by simp ultimatelyhave"False"unfolding prime_nat_iff by auto } moreover
{ assume"?B > 0" with y have"x*y > 0"by simp moreoverfrom ass have"x > 0"by simp ultimatelyhave ?thesis using zero_less_mult_pos by blast } ultimatelyshow ?thesis by auto qed moreoverwith y_l_x have"(nat y) - 1 < (nat x) - 1"by arith moreoverfrom y_l_x ass have"y < p"by auto ultimatelyshow ?thesis by blast qed thus"∃ y. nat y - 1 < nat x - 1 ∧¬¬ ?Q y"by blast qed with Qt show"False"by simp qed thus"is_sum4sq_int p"by (auto simp add: is_sum4sq_int_def) qed
private lemma prime_is_sum4sq: "prime p ==> is_sum4sq_nat p" using zprime_is_sum4sq is_sum4sq_int_nat_eq by simp
theorem sum_of_four_squares: "is_sum4sq_nat n" proof (induction n rule: nat_less_induct) case (1 n) show ?case proof (cases "n>1") case False hence"n = 0 ∨ n = 1"by auto moreoverhave"0 = sum4sq_nat 0 0 0 0""1 = sum4sq_nat 1 0 0 0"unfolding sum4sq_nat_def by auto ultimatelyshow ?thesis unfolding is_sum4sq_nat_def by blast next case True thenobtain p m where dec: "prime p ∧ n = p * m"using prime_factor_nat[of n] by (auto elim: dvdE) moreoverhence"m<n"using n_less_m_mult_n[of m p] prime_gt_Suc_0_nat[of p] True by linarith ultimatelyhave"is_sum4sq_nat m""is_sum4sq_nat p"using1 prime_is_sum4sq by blast+ thus ?thesis using dec is_mult_sum4sq_nat by blast qed qed
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.