src/HOL/Library/Parity.thy
changeset 25600 73431bd8c4c4
parent 25594 43c718438f9f
child 25691 8f8d83af100a
equal deleted inserted replaced
25599:afdff3ad4057 25600:73431bd8c4c4
     1 (*  Title:      HOL/Library/Parity.thy
     1 (*  Title:      HOL/Library/Parity.thy
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Jeremy Avigad
     3     Author:     Jeremy Avigad, Jacques D. Fleuriot
     4 *)
     4 *)
     5 
     5 
     6 header {* Even and Odd for int and nat *}
     6 header {* Even and Odd for int and nat *}
     7 
     7 
     8 theory Parity
     8 theory Parity
    36     "0 <= x ==> (x::int) < 2 ==> x = 0 | x = 1"
    36     "0 <= x ==> (x::int) < 2 ==> x = 0 | x = 1"
    37   by presburger
    37   by presburger
    38 
    38 
    39 lemma neq_one_mod_two [simp, presburger]: 
    39 lemma neq_one_mod_two [simp, presburger]: 
    40   "((x::int) mod 2 ~= 0) = (x mod 2 = 1)" by presburger
    40   "((x::int) mod 2 ~= 0) = (x mod 2 = 1)" by presburger
       
    41 
    41 
    42 
    42 subsection {* Behavior under integer arithmetic operations *}
    43 subsection {* Behavior under integer arithmetic operations *}
    43 
    44 
    44 lemma even_times_anything: "even (x::int) ==> even (x * y)"
    45 lemma even_times_anything: "even (x::int) ==> even (x * y)"
    45   by (simp add: even_def zmod_zmult1_eq')
    46   by (simp add: even_def zmod_zmult1_eq')
   166 lemma even_nat_equiv_def2: "even (x::nat) = (EX y. x = Suc (Suc 0) * y)"
   167 lemma even_nat_equiv_def2: "even (x::nat) = (EX y. x = Suc (Suc 0) * y)"
   167   by presburger
   168   by presburger
   168 
   169 
   169 lemma odd_nat_equiv_def2: "odd (x::nat) = (EX y. x = Suc(Suc (Suc 0) * y))"
   170 lemma odd_nat_equiv_def2: "odd (x::nat) = (EX y. x = Suc(Suc (Suc 0) * y))"
   170   by presburger
   171   by presburger
       
   172 
   171 
   173 
   172 subsection {* Parity and powers *}
   174 subsection {* Parity and powers *}
   173 
   175 
   174 lemma  minus_one_even_odd_power:
   176 lemma  minus_one_even_odd_power:
   175      "(even x --> (- 1::'a::{comm_ring_1,recpower})^x = 1) &
   177      "(even x --> (- 1::'a::{comm_ring_1,recpower})^x = 1) &
   308 lemma power_minus_odd [simp]: "odd n ==>
   310 lemma power_minus_odd [simp]: "odd n ==>
   309     (- x)^n = - (x^n::'a::{recpower,comm_ring_1})"
   311     (- x)^n = - (x^n::'a::{recpower,comm_ring_1})"
   310   apply (subst power_minus)
   312   apply (subst power_minus)
   311   apply simp
   313   apply simp
   312   done
   314   done
       
   315 
       
   316 
       
   317 subsection {* General Lemmas About Division *}
       
   318 
       
   319 lemma Suc_times_mod_eq: "1<k ==> Suc (k * m) mod k = 1" 
       
   320 apply (induct "m")
       
   321 apply (simp_all add: mod_Suc)
       
   322 done
       
   323 
       
   324 declare Suc_times_mod_eq [of "number_of w", standard, simp]
       
   325 
       
   326 lemma [simp]: "n div k \<le> (Suc n) div k"
       
   327 by (simp add: div_le_mono) 
       
   328 
       
   329 lemma Suc_n_div_2_gt_zero [simp]: "(0::nat) < n ==> 0 < (n + 1) div 2"
       
   330 by arith
       
   331 
       
   332 lemma div_2_gt_zero [simp]: "(1::nat) < n ==> 0 < n div 2" 
       
   333 by arith
       
   334 
       
   335 lemma mod_mult_self3 [simp]: "(k*n + m) mod n = m mod (n::nat)"
       
   336 by (simp add: mult_ac add_ac)
       
   337 
       
   338 lemma mod_mult_self4 [simp]: "Suc (k*n + m) mod n = Suc m mod n"
       
   339 proof -
       
   340   have "Suc (k * n + m) mod n = (k * n + Suc m) mod n" by simp
       
   341   also have "... = Suc m mod n" by (rule mod_mult_self3) 
       
   342   finally show ?thesis .
       
   343 qed
       
   344 
       
   345 lemma mod_Suc_eq_Suc_mod: "Suc m mod n = Suc (m mod n) mod n"
       
   346 apply (subst mod_Suc [of m]) 
       
   347 apply (subst mod_Suc [of "m mod n"], simp) 
       
   348 done
       
   349 
       
   350 
       
   351 subsection {* More Even/Odd Results *}
       
   352  
       
   353 lemma even_mult_two_ex: "even(n) = (\<exists>m::nat. n = 2*m)"
       
   354 by (simp add: even_nat_equiv_def2 numeral_2_eq_2)
       
   355 
       
   356 lemma odd_Suc_mult_two_ex: "odd(n) = (\<exists>m. n = Suc (2*m))"
       
   357 by (simp add: odd_nat_equiv_def2 numeral_2_eq_2)
       
   358 
       
   359 lemma even_add [simp]: "even(m + n::nat) = (even m = even n)" 
       
   360 by auto
       
   361 
       
   362 lemma odd_add [simp]: "odd(m + n::nat) = (odd m \<noteq> odd n)"
       
   363 by auto
       
   364 
       
   365 lemma div_Suc: "Suc a div c = a div c + Suc 0 div c +
       
   366     (a mod c + Suc 0 mod c) div c" 
       
   367   apply (subgoal_tac "Suc a = a + Suc 0")
       
   368   apply (erule ssubst)
       
   369   apply (rule div_add1_eq, simp)
       
   370   done
       
   371 
       
   372 lemma lemma_even_div2 [simp]: "even (n::nat) ==> (n + 1) div 2 = n div 2"
       
   373 apply (simp add: numeral_2_eq_2) 
       
   374 apply (subst div_Suc)  
       
   375 apply (simp add: even_nat_mod_two_eq_zero) 
       
   376 done
       
   377 
       
   378 lemma lemma_not_even_div2 [simp]: "~even n ==> (n + 1) div 2 = Suc (n div 2)"
       
   379 apply (simp add: numeral_2_eq_2) 
       
   380 apply (subst div_Suc)  
       
   381 apply (simp add: odd_nat_mod_two_eq_one) 
       
   382 done
       
   383 
       
   384 lemma even_num_iff: "0 < n ==> even n = (~ even(n - 1 :: nat))" 
       
   385 by (case_tac "n", auto)
       
   386 
       
   387 lemma even_even_mod_4_iff: "even (n::nat) = even (n mod 4)"
       
   388 apply (induct n, simp)
       
   389 apply (subst mod_Suc, simp) 
       
   390 done
       
   391 
       
   392 lemma lemma_odd_mod_4_div_2: "n mod 4 = (3::nat) ==> odd((n - 1) div 2)"
       
   393 apply (rule_tac t = n and n1 = 4 in mod_div_equality [THEN subst])
       
   394 apply (simp add: even_num_iff)
       
   395 done
       
   396 
       
   397 lemma lemma_even_mod_4_div_2: "n mod 4 = (1::nat) ==> even ((n - 1) div 2)"
       
   398 by (rule_tac t = n and n1 = 4 in mod_div_equality [THEN subst], simp)
   313 
   399 
   314 
   400 
   315 text {* Simplify, when the exponent is a numeral *}
   401 text {* Simplify, when the exponent is a numeral *}
   316 
   402 
   317 lemmas power_0_left_number_of = power_0_left [of "number_of w", standard]
   403 lemmas power_0_left_number_of = power_0_left [of "number_of w", standard]
   360 qed
   446 qed
   361 
   447 
   362 
   448 
   363 subsection {* Miscellaneous *}
   449 subsection {* Miscellaneous *}
   364 
   450 
       
   451 lemma odd_pos: "odd (n::nat) \<Longrightarrow> 0 < n"
       
   452   by (cases n, simp_all)
       
   453 
   365 lemma [presburger]:"(x + 1) div 2 = x div 2 \<longleftrightarrow> even (x::int)" by presburger
   454 lemma [presburger]:"(x + 1) div 2 = x div 2 \<longleftrightarrow> even (x::int)" by presburger
   366 lemma [presburger]: "(x + 1) div 2 = x div 2 + 1 \<longleftrightarrow> odd (x::int)" by presburger
   455 lemma [presburger]: "(x + 1) div 2 = x div 2 + 1 \<longleftrightarrow> odd (x::int)" by presburger
   367 lemma even_plus_one_div_two: "even (x::int) ==> (x + 1) div 2 = x div 2"  by presburger
   456 lemma even_plus_one_div_two: "even (x::int) ==> (x + 1) div 2 = x div 2"  by presburger
   368 lemma odd_plus_one_div_two: "odd (x::int) ==> (x + 1) div 2 = x div 2 + 1" by presburger
   457 lemma odd_plus_one_div_two: "odd (x::int) ==> (x + 1) div 2 = x div 2 + 1" by presburger
   369 
   458 
   370 lemma div_Suc: "Suc a div c = a div c + Suc 0 div c +
       
   371     (a mod c + Suc 0 mod c) div c" 
       
   372   apply (subgoal_tac "Suc a = a + Suc 0")
       
   373   apply (erule ssubst)
       
   374   apply (rule div_add1_eq, simp)
       
   375   done
       
   376 
       
   377 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger
   459 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger
   378 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger
   460 lemma [presburger]: "(Suc x) div Suc (Suc 0) = x div Suc (Suc 0) \<longleftrightarrow> even x" by presburger
   379 lemma even_nat_plus_one_div_two: "even (x::nat) ==>
   461 lemma even_nat_plus_one_div_two: "even (x::nat) ==>
   380     (Suc x) div Suc (Suc 0) = x div Suc (Suc 0)" by presburger
   462     (Suc x) div Suc (Suc 0) = x div Suc (Suc 0)" by presburger
   381 
   463