src/HOL/NatBin.thy
changeset 23294 9302a50a5bc9
parent 23277 aa158e145ea3
child 23307 2fe3345035c7
equal deleted inserted replaced
23293:77577fc2f141 23294:9302a50a5bc9
   615 lemmas power_nat_number_of_number_of = power_nat_number_of [of _ "number_of w", standard]
   615 lemmas power_nat_number_of_number_of = power_nat_number_of [of _ "number_of w", standard]
   616 declare power_nat_number_of_number_of [simp]
   616 declare power_nat_number_of_number_of [simp]
   617 
   617 
   618 
   618 
   619 
   619 
   620 text{*For the integers*}
   620 text{*For arbitrary rings*}
   621 
   621 
   622 lemma zpower_number_of_even:
   622 lemma power_number_of_even:
   623   "(z::int) ^ number_of (w BIT bit.B0) = (let w = z ^ (number_of w) in w * w)"
   623   fixes z :: "'a::{number_ring,recpower}"
       
   624   shows "z ^ number_of (w BIT bit.B0) = (let w = z ^ (number_of w) in w * w)"
   624 unfolding Let_def nat_number_of_def number_of_BIT bit.cases
   625 unfolding Let_def nat_number_of_def number_of_BIT bit.cases
   625 apply (rule_tac x = "number_of w" in spec, clarify)
   626 apply (rule_tac x = "number_of w" in spec, clarify)
   626 apply (case_tac " (0::int) <= x")
   627 apply (case_tac " (0::int) <= x")
   627 apply (auto simp add: nat_mult_distrib power_even_eq power2_eq_square)
   628 apply (auto simp add: nat_mult_distrib power_even_eq power2_eq_square)
   628 done
   629 done
   629 
   630 
   630 lemma zpower_number_of_odd:
   631 lemma power_number_of_odd:
   631   "(z::int) ^ number_of (w BIT bit.B1) = (if (0::int) <= number_of w                    
   632   fixes z :: "'a::{number_ring,recpower}"
       
   633   shows "z ^ number_of (w BIT bit.B1) = (if (0::int) <= number_of w
   632      then (let w = z ^ (number_of w) in z * w * w) else 1)"
   634      then (let w = z ^ (number_of w) in z * w * w) else 1)"
   633 unfolding Let_def nat_number_of_def number_of_BIT bit.cases
   635 unfolding Let_def nat_number_of_def number_of_BIT bit.cases
   634 apply (rule_tac x = "number_of w" in spec, auto)
   636 apply (rule_tac x = "number_of w" in spec, auto)
   635 apply (simp only: nat_add_distrib nat_mult_distrib)
   637 apply (simp only: nat_add_distrib nat_mult_distrib)
   636 apply simp
   638 apply simp
   637 apply (auto simp add: nat_add_distrib nat_mult_distrib power_even_eq power2_eq_square neg_nat)
   639 apply (auto simp add: nat_add_distrib nat_mult_distrib power_even_eq power2_eq_square neg_nat power_Suc)
   638 done
   640 done
   639 
   641 
   640 lemmas zpower_number_of_even_number_of =
   642 lemmas zpower_number_of_even = power_number_of_even [where 'a=int]
   641     zpower_number_of_even [of "number_of v", standard]
   643 lemmas zpower_number_of_odd = power_number_of_odd [where 'a=int]
   642 declare zpower_number_of_even_number_of [simp]
   644 
   643 
   645 lemmas power_number_of_even_number_of [simp] =
   644 lemmas zpower_number_of_odd_number_of =
   646     power_number_of_even [of "number_of v", standard]
   645     zpower_number_of_odd [of "number_of v", standard]
   647 
   646 declare zpower_number_of_odd_number_of [simp]
   648 lemmas power_number_of_odd_number_of [simp] =
   647 
   649     power_number_of_odd [of "number_of v", standard]
   648 
   650 
   649 
   651 
   650 
   652 
   651 ML
   653 ML
   652 {*
   654 {*
   707 
   709 
   708 lemma Let_Suc [simp]: "Let (Suc n) f == f (Suc n)"
   710 lemma Let_Suc [simp]: "Let (Suc n) f == f (Suc n)"
   709   by (simp add: Let_def)
   711   by (simp add: Let_def)
   710 
   712 
   711 lemma power_m1_even: "(-1) ^ (2*n) = (1::'a::{number_ring,recpower})"
   713 lemma power_m1_even: "(-1) ^ (2*n) = (1::'a::{number_ring,recpower})"
   712 by (simp add: power_mult); 
   714 by (simp add: power_mult power_Suc); 
   713 
   715 
   714 lemma power_m1_odd: "(-1) ^ Suc(2*n) = (-1::'a::{number_ring,recpower})"
   716 lemma power_m1_odd: "(-1) ^ Suc(2*n) = (-1::'a::{number_ring,recpower})"
   715 by (simp add: power_mult power_Suc); 
   717 by (simp add: power_mult power_Suc); 
   716 
   718 
   717 
   719