src/HOL/Parity.thy
changeset 71958 4320875eb8a1
parent 71853 30d92e668b52
child 71965 d45f5d4c41bd
equal deleted inserted replaced
71957:3e162c63371a 71958:4320875eb8a1
  1294 
  1294 
  1295 lemma drop_bit_of_bool [simp]:
  1295 lemma drop_bit_of_bool [simp]:
  1296   "drop_bit n (of_bool b) = of_bool (n = 0 \<and> b)"
  1296   "drop_bit n (of_bool b) = of_bool (n = 0 \<and> b)"
  1297   by (cases n) simp_all
  1297   by (cases n) simp_all
  1298 
  1298 
  1299 lemma take_bit_eq_0_imp_dvd:
       
  1300   "take_bit n a = 0 \<Longrightarrow> 2 ^ n dvd a"
       
  1301   by (simp add: take_bit_eq_mod mod_0_imp_dvd)
       
  1302 
       
  1303 lemma even_take_bit_eq [simp]:
  1299 lemma even_take_bit_eq [simp]:
  1304   \<open>even (take_bit n a) \<longleftrightarrow> n = 0 \<or> even a\<close>
  1300   \<open>even (take_bit n a) \<longleftrightarrow> n = 0 \<or> even a\<close>
  1305   by (simp add: take_bit_rec [of n a])
  1301   by (simp add: take_bit_rec [of n a])
  1306 
  1302 
  1307 lemma take_bit_take_bit [simp]:
  1303 lemma take_bit_take_bit [simp]:
  1386   assume \<open>2 ^ m \<noteq> 0\<close>
  1382   assume \<open>2 ^ m \<noteq> 0\<close>
  1387   with that show \<open>bit (take_bit n a) m \<longleftrightarrow> bit (if even a then 0 else 2 ^ n - 1) m\<close>
  1383   with that show \<open>bit (take_bit n a) m \<longleftrightarrow> bit (if even a then 0 else 2 ^ n - 1) m\<close>
  1388     by (simp add: bit_take_bit_iff bit_mask_iff stable_imp_bit_iff_odd)
  1384     by (simp add: bit_take_bit_iff bit_mask_iff stable_imp_bit_iff_odd)
  1389 qed
  1385 qed
  1390 
  1386 
       
  1387 lemma exp_dvdE:
       
  1388   assumes \<open>2 ^ n dvd a\<close>
       
  1389   obtains b where \<open>a = push_bit n b\<close>
       
  1390 proof -
       
  1391   from assms obtain b where \<open>a = 2 ^ n * b\<close> ..
       
  1392   then have \<open>a = push_bit n b\<close>
       
  1393     by (simp add: push_bit_eq_mult ac_simps)
       
  1394   with that show thesis .
       
  1395 qed
       
  1396 
       
  1397 lemma take_bit_eq_0_iff:
       
  1398   \<open>take_bit n a = 0 \<longleftrightarrow> 2 ^ n dvd a\<close> (is \<open>?P \<longleftrightarrow> ?Q\<close>)
       
  1399 proof
       
  1400   assume ?P
       
  1401   then show ?Q
       
  1402 	  by (simp add: take_bit_eq_mod mod_0_imp_dvd)
       
  1403 next
       
  1404   assume ?Q
       
  1405   then obtain b where \<open>a = push_bit n b\<close>
       
  1406     by (rule exp_dvdE)
       
  1407   then show ?P
       
  1408     by (simp add: take_bit_push_bit)
       
  1409 qed
       
  1410 
  1391 end
  1411 end
  1392 
  1412 
  1393 instantiation nat :: semiring_bit_shifts
  1413 instantiation nat :: semiring_bit_shifts
  1394 begin
  1414 begin
  1395 
  1415 
  1463   by (simp add: push_bit_eq_mult Parity.push_bit_eq_mult)
  1483   by (simp add: push_bit_eq_mult Parity.push_bit_eq_mult)
  1464 
  1484 
  1465 lemma take_bit_add:
  1485 lemma take_bit_add:
  1466   "take_bit n (take_bit n a + take_bit n b) = take_bit n (a + b)"
  1486   "take_bit n (take_bit n a + take_bit n b) = take_bit n (a + b)"
  1467   by (simp add: take_bit_eq_mod mod_simps)
  1487   by (simp add: take_bit_eq_mod mod_simps)
  1468 
       
  1469 lemma take_bit_eq_0_iff:
       
  1470   "take_bit n a = 0 \<longleftrightarrow> 2 ^ n dvd a"
       
  1471   by (simp add: take_bit_eq_mod mod_eq_0_iff_dvd)
       
  1472 
  1488 
  1473 lemma take_bit_of_1_eq_0_iff [simp]:
  1489 lemma take_bit_of_1_eq_0_iff [simp]:
  1474   "take_bit n 1 = 0 \<longleftrightarrow> n = 0"
  1490   "take_bit n 1 = 0 \<longleftrightarrow> n = 0"
  1475   by (simp add: take_bit_eq_mod)
  1491   by (simp add: take_bit_eq_mod)
  1476 
  1492