mathlib documentation

data.​int.​basic

data.​int.​basic

@[instance]

Equations
@[instance]

Equations
@[instance]

Equations
@[instance]
def int.​ring  :

Equations
theorem int.​abs_eq_nat_abs (a : ℤ) :

theorem int.​nat_abs_abs (a : ℤ) :

theorem int.​sign_mul_abs (a : ℤ) :
a.sign * abs a = a

@[instance]

@[instance]

@[simp]
theorem int.​add_def {a b : ℤ} :
a.add b = a + b

@[simp]
theorem int.​mul_def {a b : ℤ} :
a.mul b = a * b

@[simp]
theorem int.​coe_nat_mul_neg_succ (m n : ℕ) :
↑m * -[1+ n] = -(↑m * ↑(n.succ))

@[simp]
theorem int.​neg_succ_mul_coe_nat (m n : ℕ) :
-[1+ m] * ↑n = -(↑(m.succ) * ↑n)

@[simp]
theorem int.​neg_succ_mul_neg_succ (m n : ℕ) :
-[1+ m] * -[1+ n] = ↑(m.succ) * ↑(n.succ)

@[simp]
theorem int.​coe_nat_le {m n : ℕ} :
↑m ≤ ↑n ↔ m ≤ n

@[simp]
theorem int.​coe_nat_lt {m n : ℕ} :
↑m < ↑n ↔ m < n

@[simp]
theorem int.​coe_nat_inj' {m n : ℕ} :
↑m = ↑n ↔ m = n

@[simp]
theorem int.​coe_nat_pos {n : ℕ} :
0 < ↑n ↔ 0 < n

@[simp]
theorem int.​coe_nat_eq_zero {n : ℕ} :
↑n = 0 ↔ n = 0

theorem int.​coe_nat_ne_zero {n : ℕ} :
↑n ≠ 0 ↔ n ≠ 0

theorem int.​coe_nat_nonneg (n : ℕ) :
0 ≤ ↑n

theorem int.​coe_nat_succ_pos (n : ℕ) :
0 < ↑(n.succ)

@[simp]
theorem int.​coe_nat_abs (n : ℕ) :

def int.​succ  :
ℤ → ℤ

Immediate successor of an integer: succ n = n + 1

Equations
def int.​pred  :
ℤ → ℤ

Immediate predecessor of an integer: pred n = n - 1

Equations
theorem int.​pred_succ (a : ℤ) :
a.succ.pred = a

theorem int.​succ_pred (a : ℤ) :
a.pred.succ = a

theorem int.​neg_succ (a : ℤ) :
-a.succ = (-a).pred

theorem int.​succ_neg_succ (a : ℤ) :
(-a.succ).succ = -a

theorem int.​neg_pred (a : ℤ) :
-a.pred = (-a).succ

theorem int.​pred_neg_pred (a : ℤ) :
(-a.pred).pred = -a

theorem int.​pred_nat_succ (n : ℕ) :

theorem int.​neg_nat_succ (n : ℕ) :

theorem int.​lt_succ_self (a : ℤ) :
a < a.succ

theorem int.​pred_self_lt (a : ℤ) :
a.pred < a

theorem int.​add_one_le_iff {a b : ℤ} :
a + 1 ≤ b ↔ a < b

theorem int.​lt_add_one_iff {a b : ℤ} :
a < b + 1 ↔ a ≤ b

theorem int.​le_add_one {a b : ℤ} :
a ≤ b → a ≤ b + 1

theorem int.​sub_one_lt_iff {a b : ℤ} :
a - 1 < b ↔ a ≤ b

theorem int.​le_sub_one_iff {a b : ℤ} :
a ≤ b - 1 ↔ a < b

theorem int.​induction_on {p : ℤ → Prop} (i : ℤ) :
p 0 → (∀ (i : ℕ), p ↑i → p (↑i + 1)) → (∀ (i : ℕ), p (-↑i) → p (-↑i - 1)) → p i

def int.​induction_on' {C : ℤ → Sort u_1} (z b : ℤ) :
C b → (Π (k : ℤ), b ≤ k → C k → C (k + 1)) → (Π (k : ℤ), k ≤ b → C k → C (k - 1)) → C z

Equations
theorem int.​nat_abs_add_le (a b : ℤ) :

theorem int.​nat_abs_mul (a b : ℤ) :

@[simp]
theorem int.​nat_abs_mul_self' (a : ℤ) :
↑(a.nat_abs) * ↑(a.nat_abs) = a * a

@[simp]
theorem int.​nat_abs_eq_zero {a : ℤ} :
a.nat_abs = 0 ↔ a = 0

theorem int.​nat_abs_lt_nat_abs_of_nonneg_of_lt {a b : ℤ} :
0 ≤ a → a < b → a.nat_abs < b.nat_abs

@[simp]
theorem int.​of_nat_div (m n : ℕ) :

@[simp]
theorem int.​coe_nat_div (m n : ℕ) :
↑(m / n) = ↑m / ↑n

theorem int.​neg_succ_of_nat_div (m : ℕ) {b : ℤ} :
0 < b → -[1+ m] / b = -(↑m / b + 1)

@[simp]
theorem int.​div_neg (a b : ℤ) :
a / -b = -(a / b)

theorem int.​div_of_neg_of_pos {a b : ℤ} :
a < 0 → 0 < b → a / b = -((-a - 1) / b + 1)

theorem int.​div_nonneg {a b : ℤ} :
0 ≤ a → 0 ≤ b → 0 ≤ a / b

theorem int.​div_nonpos {a b : ℤ} :
0 ≤ a → b ≤ 0 → a / b ≤ 0

theorem int.​div_neg' {a b : ℤ} :
a < 0 → 0 < b → a / b < 0

theorem int.​zero_div (b : ℤ) :
0 / b = 0

theorem int.​div_zero (a : ℤ) :
a / 0 = 0

@[simp]
theorem int.​div_one (a : ℤ) :
a / 1 = a

theorem int.​div_eq_zero_of_lt {a b : ℤ} :
0 ≤ a → a < b → a / b = 0

theorem int.​div_eq_zero_of_lt_abs {a b : ℤ} :
0 ≤ a → a < abs b → a / b = 0

theorem int.​add_mul_div_right (a b : ℤ) {c : ℤ} :
c ≠ 0 → (a + b * c) / c = a / c + b

theorem int.​add_mul_div_left (a : ℤ) {b : ℤ} (c : ℤ) :
b ≠ 0 → (a + b * c) / b = a / b + c

@[simp]
theorem int.​mul_div_cancel (a : ℤ) {b : ℤ} :
b ≠ 0 → a * b / b = a

@[simp]
theorem int.​mul_div_cancel_left {a : ℤ} (b : ℤ) :
a ≠ 0 → a * b / a = b

@[simp]
theorem int.​div_self {a : ℤ} :
a ≠ 0 → a / a = 1

theorem int.​of_nat_mod (m n : ℕ) :
↑m % ↑n = int.of_nat (m % n)

@[simp]
theorem int.​coe_nat_mod (m n : ℕ) :
↑(m % n) = ↑m % ↑n

theorem int.​neg_succ_of_nat_mod (m : ℕ) {b : ℤ} :
0 < b → -[1+ m] % b = b - 1 - ↑m % b

@[simp]
theorem int.​mod_neg (a b : ℤ) :
a % -b = a % b

@[simp]
theorem int.​mod_abs (a b : ℤ) :
a % abs b = a % b

theorem int.​zero_mod (b : ℤ) :
0 % b = 0

theorem int.​mod_zero (a : ℤ) :
a % 0 = a

theorem int.​mod_one (a : ℤ) :
a % 1 = 0

theorem int.​mod_eq_of_lt {a b : ℤ} :
0 ≤ a → a < b → a % b = a

theorem int.​mod_nonneg (a : ℤ) {b : ℤ} :
b ≠ 0 → 0 ≤ a % b

theorem int.​mod_lt_of_pos (a : ℤ) {b : ℤ} :
0 < b → a % b < b

theorem int.​mod_lt (a : ℤ) {b : ℤ} :
b ≠ 0 → a % b < abs b

theorem int.​mod_add_div_aux (m n : ℕ) :
↑n - (↑m % ↑n + 1) - (↑n * (↑m / ↑n) + ↑n) = -[1+ m]

theorem int.​mod_add_div (a b : ℤ) :
a % b + b * (a / b) = a

theorem int.​mod_def (a b : ℤ) :
a % b = a - b * (a / b)

@[simp]
theorem int.​add_mul_mod_self {a b c : ℤ} :
(a + b * c) % c = a % c

@[simp]
theorem int.​add_mul_mod_self_left (a b c : ℤ) :
(a + b * c) % b = a % b

@[simp]
theorem int.​add_mod_self {a b : ℤ} :
(a + b) % b = a % b

@[simp]
theorem int.​add_mod_self_left {a b : ℤ} :
(a + b) % a = b % a

@[simp]
theorem int.​mod_add_mod (m n k : ℤ) :
(m % n + k) % n = (m + k) % n

@[simp]
theorem int.​add_mod_mod (m n k : ℤ) :
(m + n % k) % k = (m + n) % k

theorem int.​add_mod (a b n : ℤ) :
(a + b) % n = (a % n + b % n) % n

theorem int.​add_mod_eq_add_mod_right {m n k : ℤ} (i : ℤ) :
m % n = k % n → (m + i) % n = (k + i) % n

theorem int.​add_mod_eq_add_mod_left {m n k : ℤ} (i : ℤ) :
m % n = k % n → (i + m) % n = (i + k) % n

theorem int.​mod_add_cancel_right {m n k : ℤ} (i : ℤ) :
(m + i) % n = (k + i) % n ↔ m % n = k % n

theorem int.​mod_add_cancel_left {m n k i : ℤ} :
(i + m) % n = (i + k) % n ↔ m % n = k % n

theorem int.​mod_sub_cancel_right {m n k : ℤ} (i : ℤ) :
(m - i) % n = (k - i) % n ↔ m % n = k % n

theorem int.​mod_eq_mod_iff_mod_sub_eq_zero {m n k : ℤ} :
m % n = k % n ↔ (m - k) % n = 0

@[simp]
theorem int.​mul_mod_left (a b : ℤ) :
a * b % b = 0

@[simp]
theorem int.​mul_mod_right (a b : ℤ) :
a * b % a = 0

theorem int.​mul_mod (a b n : ℤ) :
a * b % n = a % n * (b % n) % n

theorem int.​mod_self {a : ℤ} :
a % a = 0

@[simp]
theorem int.​mod_mod_of_dvd (n : ℤ) {m k : ℤ} :
m ∣ k → n % k % m = n % m

@[simp]
theorem int.​mod_mod (a b : ℤ) :
a % b % b = a % b

theorem int.​sub_mod (a b n : ℤ) :
(a - b) % n = (a % n - b % n) % n

@[simp]
theorem int.​mul_div_mul_of_pos {a : ℤ} (b c : ℤ) :
0 < a → a * b / (a * c) = b / c

@[simp]
theorem int.​mul_div_mul_of_pos_left (a : ℤ) {b : ℤ} (c : ℤ) :
0 < b → a * b / (c * b) = a / c

@[simp]
theorem int.​mul_mod_mul_of_pos {a : ℤ} (b c : ℤ) :
0 < a → a * b % (a * c) = a * (b % c)

theorem int.​lt_div_add_one_mul_self (a : ℤ) {b : ℤ} :
0 < b → a < (a / b + 1) * b

theorem int.​abs_div_le_abs (a b : ℤ) :
abs (a / b) ≤ abs a

theorem int.​div_le_self {a : ℤ} (b : ℤ) :
0 ≤ a → a / b ≤ a

theorem int.​mul_div_cancel_of_mod_eq_zero {a b : ℤ} :
a % b = 0 → b * (a / b) = a

theorem int.​div_mul_cancel_of_mod_eq_zero {a b : ℤ} :
a % b = 0 → a / b * b = a

theorem int.​mod_two_eq_zero_or_one (n : ℤ) :
n % 2 = 0 ∨ n % 2 = 1

theorem int.​coe_nat_dvd {m n : ℕ} :
↑m ∣ ↑n ↔ m ∣ n

theorem int.​coe_nat_dvd_left {n : ℕ} {z : ℤ} :

theorem int.​coe_nat_dvd_right {n : ℕ} {z : ℤ} :

theorem int.​dvd_antisymm {a b : ℤ} :
0 ≤ a → 0 ≤ b → a ∣ b → b ∣ a → a = b

theorem int.​dvd_of_mod_eq_zero {a b : ℤ} :
b % a = 0 → a ∣ b

theorem int.​mod_eq_zero_of_dvd {a b : ℤ} :
a ∣ b → b % a = 0

theorem int.​dvd_iff_mod_eq_zero (a b : ℤ) :
a ∣ b ↔ b % a = 0

theorem int.​dvd_sub_of_mod_eq {a b c : ℤ} :
a % b = c → b ∣ a - c

If a % b = c then b divides a - c.

theorem int.​nat_abs_dvd {a b : ℤ} :
↑(a.nat_abs) ∣ b ↔ a ∣ b

theorem int.​dvd_nat_abs {a b : ℤ} :
a ∣ ↑(b.nat_abs) ↔ a ∣ b

theorem int.​div_mul_cancel {a b : ℤ} :
b ∣ a → a / b * b = a

theorem int.​mul_div_cancel' {a b : ℤ} :
a ∣ b → a * (b / a) = b

theorem int.​mul_div_assoc (a : ℤ) {b c : ℤ} :
c ∣ b → a * b / c = a * (b / c)

theorem int.​div_dvd_div {a b c : ℤ} :
a ∣ b → b ∣ c → b / a ∣ c / a

theorem int.​eq_mul_of_div_eq_right {a b c : ℤ} :
b ∣ a → a / b = c → a = b * c

theorem int.​div_eq_of_eq_mul_right {a b c : ℤ} :
b ≠ 0 → a = b * c → a / b = c

theorem int.​div_eq_iff_eq_mul_right {a b c : ℤ} :
b ≠ 0 → b ∣ a → (a / b = c ↔ a = b * c)

theorem int.​div_eq_iff_eq_mul_left {a b c : ℤ} :
b ≠ 0 → b ∣ a → (a / b = c ↔ a = c * b)

theorem int.​eq_mul_of_div_eq_left {a b c : ℤ} :
b ∣ a → a / b = c → a = c * b

theorem int.​div_eq_of_eq_mul_left {a b c : ℤ} :
b ≠ 0 → a = c * b → a / b = c

theorem int.​neg_div_of_dvd {a b : ℤ} :
b ∣ a → -a / b = -(a / b)

theorem int.​add_div_of_dvd {a b c : ℤ} :
c ∣ a → c ∣ b → (a + b) / c = a / c + b / c

theorem int.​div_sign (a b : ℤ) :
a / b.sign = a * b.sign

@[simp]
theorem int.​sign_mul (a b : ℤ) :
(a * b).sign = a.sign * b.sign

theorem int.​sign_eq_div_abs (a : ℤ) :
a.sign = a / abs a

theorem int.​mul_sign (i : ℤ) :
i * i.sign = ↑(i.nat_abs)

theorem int.​le_of_dvd {a b : ℤ} :
0 < b → a ∣ b → a ≤ b

theorem int.​eq_one_of_dvd_one {a : ℤ} :
0 ≤ a → a ∣ 1 → a = 1

theorem int.​eq_one_of_mul_eq_one_right {a b : ℤ} :
0 ≤ a → a * b = 1 → a = 1

theorem int.​eq_one_of_mul_eq_one_left {a b : ℤ} :
0 ≤ b → a * b = 1 → b = 1

theorem int.​of_nat_dvd_of_dvd_nat_abs {a : ℕ} {z : ℤ} :
a ∣ z.nat_abs → ↑a ∣ z

theorem int.​dvd_nat_abs_of_of_nat_dvd {a : ℕ} {z : ℤ} :
↑a ∣ z → a ∣ z.nat_abs

theorem int.​pow_dvd_of_le_of_pow_dvd {p m n : ℕ} {k : ℤ} :
m ≤ n → ↑(p ^ n) ∣ k → ↑(p ^ m) ∣ k

theorem int.​dvd_of_pow_dvd {p k : ℕ} {m : ℤ} :
1 ≤ k → ↑(p ^ k) ∣ m → ↑p ∣ m

theorem int.​div_mul_le (a : ℤ) {b : ℤ} :
b ≠ 0 → a / b * b ≤ a

theorem int.​div_le_of_le_mul {a b c : ℤ} :
0 < c → a ≤ b * c → a / c ≤ b

theorem int.​mul_lt_of_lt_div {a b c : ℤ} :
0 < c → a < b / c → a * c < b

theorem int.​mul_le_of_le_div {a b c : ℤ} :
0 < c → a ≤ b / c → a * c ≤ b

theorem int.​le_div_of_mul_le {a b c : ℤ} :
0 < c → a * c ≤ b → a ≤ b / c

theorem int.​le_div_iff_mul_le {a b c : ℤ} :
0 < c → (a ≤ b / c ↔ a * c ≤ b)

theorem int.​div_le_div {a b c : ℤ} :
0 < c → a ≤ b → a / c ≤ b / c

theorem int.​div_lt_of_lt_mul {a b c : ℤ} :
0 < c → a < b * c → a / c < b

theorem int.​lt_mul_of_div_lt {a b c : ℤ} :
0 < c → a / c < b → a < b * c

theorem int.​div_lt_iff_lt_mul {a b c : ℤ} :
0 < c → (a / c < b ↔ a < b * c)

theorem int.​le_mul_of_div_le {a b c : ℤ} :
0 ≤ b → b ∣ a → a / b ≤ c → a ≤ c * b

theorem int.​lt_div_of_mul_lt {a b c : ℤ} :
0 ≤ b → b ∣ c → a * b < c → a < c / b

theorem int.​lt_div_iff_mul_lt {a b : ℤ} (c : ℤ) :
0 < c → c ∣ b → (a < b / c ↔ a * c < b)

theorem int.​div_pos_of_pos_of_dvd {a b : ℤ} :
0 < a → 0 ≤ b → b ∣ a → 0 < a / b

theorem int.​div_eq_div_of_mul_eq_mul {a b c d : ℤ} :
d ∣ c → b ≠ 0 → d ≠ 0 → a * d = b * c → a / b = c / d

theorem int.​eq_mul_div_of_mul_eq_mul_of_dvd_left {a b c d : ℤ} :
b ≠ 0 → b ∣ c → b * a = c * d → a = c / b * d

theorem int.​eq_zero_of_dvd_of_nat_abs_lt_nat_abs {a b : ℤ} :
a ∣ b → b.nat_abs < a.nat_abs → b = 0

If an integer with larger absolute value divides an integer, it is zero.

theorem int.​eq_zero_of_dvd_of_nonneg_of_lt {a b : ℤ} :
0 ≤ a → a < b → b ∣ a → a = 0

theorem int.​eq_of_mod_eq_of_nat_abs_sub_lt_nat_abs {a b c : ℤ} :
a % b = c → (a - c).nat_abs < b.nat_abs → a = c

If two integers are congruent to a sufficiently large modulus, they are equal.

@[simp]
theorem int.​neg_add_neg (m n : ℕ) :
-[1+ m] + -[1+ n] = -[1+ (m + n).succ]

theorem int.​to_nat_eq_max (a : ℤ) :
↑(a.to_nat) = max a 0

@[simp]
theorem int.​to_nat_zero  :
0.to_nat = 0

@[simp]
theorem int.​to_nat_one  :
1.to_nat = 1

@[simp]
theorem int.​to_nat_of_nonneg {a : ℤ} :
0 ≤ a → ↑(a.to_nat) = a

@[simp]
theorem int.​to_nat_sub_of_le (a b : ℤ) :
b ≤ a → ↑((a + -b).to_nat) = a + -b

@[simp]
theorem int.​to_nat_coe_nat (n : ℕ) :

@[simp]
theorem int.​to_nat_coe_nat_add_one {n : ℕ} :
(↑n + 1).to_nat = n + 1

theorem int.​le_to_nat (a : ℤ) :

@[simp]
theorem int.​to_nat_le {a : ℤ} {n : ℕ} :

@[simp]
theorem int.​lt_to_nat {n : ℕ} {a : ℤ} :
n < a.to_nat ↔ ↑n < a

theorem int.​to_nat_le_to_nat {a b : ℤ} :
a ≤ b → a.to_nat ≤ b.to_nat

theorem int.​to_nat_lt_to_nat {a b : ℤ} :
0 < b → (a.to_nat < b.to_nat ↔ a < b)

theorem int.​lt_of_to_nat_lt {a b : ℤ} :
a.to_nat < b.to_nat → a < b

theorem int.​to_nat_add {a b : ℤ} :
0 ≤ a → 0 ≤ b → (a + b).to_nat = a.to_nat + b.to_nat

theorem int.​to_nat_add_one {a : ℤ} :
0 ≤ a → (a + 1).to_nat = a.to_nat + 1

theorem int.​mem_to_nat' (a : ℤ) (n : ℕ) :

@[simp]
theorem int.​units_nat_abs (u : units ℤ) :

theorem int.​units_eq_one_or (u : units ℤ) :
u = 1 ∨ u = -1

@[simp]
theorem int.​bodd_zero  :

@[simp]
theorem int.​bodd_one  :

@[simp]
theorem int.​bodd_two  :

@[simp]
theorem int.​bodd_coe (n : ℕ) :

@[simp]

@[simp]

@[simp]
theorem int.​bodd_neg (n : ℤ) :
(-n).bodd = n.bodd

@[simp]
theorem int.​bodd_add (m n : ℤ) :
(m + n).bodd = bxor m.bodd n.bodd

@[simp]
theorem int.​bodd_mul (m n : ℤ) :
(m * n).bodd = m.bodd && n.bodd

theorem int.​bodd_add_div2 (n : ℤ) :
cond n.bodd 1 0 + 2 * n.div2 = n

theorem int.​div2_val (n : ℤ) :
n.div2 = n / 2

theorem int.​bit0_val (n : ℤ) :
bit0 n = 2 * n

theorem int.​bit1_val (n : ℤ) :
bit1 n = 2 * n + 1

theorem int.​bit_val (b : bool) (n : ℤ) :
int.bit b n = 2 * n + cond b 1 0

theorem int.​bit_decomp (n : ℤ) :

def int.​bit_cases_on {C : ℤ → Sort u} (n : ℤ) :
(Π (b : bool) (n : ℤ), C (int.bit b n)) → C n

Equations
@[simp]
theorem int.​bit_zero  :

@[simp]
theorem int.​bit_coe_nat (b : bool) (n : ℕ) :

@[simp]
theorem int.​bit_neg_succ (b : bool) (n : ℕ) :

@[simp]
theorem int.​bodd_bit (b : bool) (n : ℤ) :
(int.bit b n).bodd = b

@[simp]
theorem int.​div2_bit (b : bool) (n : ℤ) :
(int.bit b n).div2 = n

@[simp]
theorem int.​test_bit_zero (b : bool) (n : ℤ) :
(int.bit b n).test_bit 0 = b

@[simp]
theorem int.​test_bit_succ (m : ℕ) (b : bool) (n : ℤ) :

theorem int.​bitwise_diff  :
int.bitwise (λ (a b : bool), a && !b) = int.ldiff

@[simp]
theorem int.​bitwise_bit (f : bool → bool → bool) (a : bool) (m : ℤ) (b : bool) (n : ℤ) :
int.bitwise f (int.bit a m) (int.bit b n) = int.bit (f a b) (int.bitwise f m n)

@[simp]
theorem int.​lor_bit (a : bool) (m : ℤ) (b : bool) (n : ℤ) :
(int.bit a m).lor (int.bit b n) = int.bit (a || b) (m.lor n)

@[simp]
theorem int.​land_bit (a : bool) (m : ℤ) (b : bool) (n : ℤ) :
(int.bit a m).land (int.bit b n) = int.bit (a && b) (m.land n)

@[simp]
theorem int.​ldiff_bit (a : bool) (m : ℤ) (b : bool) (n : ℤ) :
(int.bit a m).ldiff (int.bit b n) = int.bit (a && !b) (m.ldiff n)

@[simp]
theorem int.​lxor_bit (a : bool) (m : ℤ) (b : bool) (n : ℤ) :
(int.bit a m).lxor (int.bit b n) = int.bit (bxor a b) (m.lxor n)

@[simp]
theorem int.​lnot_bit (b : bool) (n : ℤ) :
(int.bit b n).lnot = int.bit (!b) n.lnot

@[simp]
theorem int.​test_bit_bitwise (f : bool → bool → bool) (m n : ℤ) (k : ℕ) :
(int.bitwise f m n).test_bit k = f (m.test_bit k) (n.test_bit k)

@[simp]
theorem int.​test_bit_lor (m n : ℤ) (k : ℕ) :
(m.lor n).test_bit k = m.test_bit k || n.test_bit k

@[simp]
theorem int.​test_bit_land (m n : ℤ) (k : ℕ) :
(m.land n).test_bit k = m.test_bit k && n.test_bit k

@[simp]
theorem int.​test_bit_ldiff (m n : ℤ) (k : ℕ) :

@[simp]
theorem int.​test_bit_lxor (m n : ℤ) (k : ℕ) :
(m.lxor n).test_bit k = bxor (m.test_bit k) (n.test_bit k)

@[simp]
theorem int.​test_bit_lnot (n : ℤ) (k : ℕ) :

theorem int.​shiftl_add (m : ℤ) (n : ℕ) (k : ℤ) :
m.shiftl (↑n + k) = (m.shiftl ↑n).shiftl k

theorem int.​shiftl_sub (m : ℤ) (n : ℕ) (k : ℤ) :
m.shiftl (↑n - k) = (m.shiftl ↑n).shiftr k

@[simp]
theorem int.​shiftl_neg (m n : ℤ) :
m.shiftl (-n) = m.shiftr n

@[simp]
theorem int.​shiftr_neg (m n : ℤ) :
m.shiftr (-n) = m.shiftl n

@[simp]
theorem int.​shiftl_coe_nat (m n : ℕ) :

@[simp]
theorem int.​shiftr_coe_nat (m n : ℕ) :

@[simp]
theorem int.​shiftr_neg_succ (m n : ℕ) :

theorem int.​shiftr_add (m : ℤ) (n k : ℕ) :

theorem int.​shiftl_eq_mul_pow (m : ℤ) (n : ℕ) :
m.shiftl ↑n = m * ↑(2 ^ n)

theorem int.​shiftr_eq_div_pow (m : ℤ) (n : ℕ) :
m.shiftr ↑n = m / ↑(2 ^ n)

theorem int.​one_shiftl (n : ℕ) :
1.shiftl ↑n = ↑(2 ^ n)

@[simp]
theorem int.​zero_shiftl (n : ℤ) :
0.shiftl n = 0

@[simp]
theorem int.​zero_shiftr (n : ℤ) :
0.shiftr n = 0

theorem int.​exists_least_of_bdd {P : ℤ → Prop} :
(∃ (b : ℤ), ∀ (z : ℤ), P z → b ≤ z) → (∃ (z : ℤ), P z) → (∃ (lb : ℤ), P lb ∧ ∀ (z : ℤ), P z → lb ≤ z)

theorem int.​exists_greatest_of_bdd {P : ℤ → Prop} :
(∃ (b : ℤ), ∀ (z : ℤ), P z → z ≤ b) → (∃ (z : ℤ), P z) → (∃ (ub : ℤ), P ub ∧ ∀ (z : ℤ), P z → z ≤ ub)