Documentation

Mathlib.Data.Int.CardIntervalMod

Counting elements in an interval with given residue #

The theorems in this file generalise Nat.card_multiples in Mathlib/Data/Nat/Factorization/Basic.lean to all integer intervals and any fixed residue (not just zero, which reduces to the multiples). Theorems are given for Ico and Ioc intervals.

theorem Int.Ico_filter_modEq_eq (a b : โ„ค) {r : โ„ค} (v : โ„ค) :
{x โˆˆ Finset.Ico a b | x โ‰ก v [ZMOD r]} = Finset.map { toFun := fun (x : โ„ค) => x + v, inj' := โ‹ฏ } ({x โˆˆ Finset.Ico (a - v) (b - v) | r โˆฃ x})
theorem Int.Ioc_filter_modEq_eq (a b : โ„ค) {r : โ„ค} (v : โ„ค) :
{x โˆˆ Finset.Ioc a b | x โ‰ก v [ZMOD r]} = Finset.map { toFun := fun (x : โ„ค) => x + v, inj' := โ‹ฏ } ({x โˆˆ Finset.Ioc (a - v) (b - v) | r โˆฃ x})
theorem Int.Ico_filter_dvd_eq (a b : โ„ค) {r : โ„ค} (hr : 0 < r) :
{x โˆˆ Finset.Ico a b | r โˆฃ x} = Finset.map { toFun := fun (x : โ„ค) => x * r, inj' := โ‹ฏ } (Finset.Ico โŒˆโ†‘a / โ†‘rโŒ‰ โŒˆโ†‘b / โ†‘rโŒ‰)
theorem Int.Ioc_filter_dvd_eq (a b : โ„ค) {r : โ„ค} (hr : 0 < r) :
{x โˆˆ Finset.Ioc a b | r โˆฃ x} = Finset.map { toFun := fun (x : โ„ค) => x * r, inj' := โ‹ฏ } (Finset.Ioc โŒŠโ†‘a / โ†‘rโŒ‹ โŒŠโ†‘b / โ†‘rโŒ‹)
theorem Int.Ico_filter_dvd_card (a b : โ„ค) {r : โ„ค} (hr : 0 < r) :
โ†‘{x โˆˆ Finset.Ico a b | r โˆฃ x}.card = max (โŒˆโ†‘b / โ†‘rโŒ‰ - โŒˆโ†‘a / โ†‘rโŒ‰) 0

There are โŒˆb / rโŒ‰ - โŒˆa / rโŒ‰ multiples of r in [a, b), if a โ‰ค b.

theorem Int.Ioc_filter_dvd_card (a b : โ„ค) {r : โ„ค} (hr : 0 < r) :
โ†‘{x โˆˆ Finset.Ioc a b | r โˆฃ x}.card = max (โŒŠโ†‘b / โ†‘rโŒ‹ - โŒŠโ†‘a / โ†‘rโŒ‹) 0

There are โŒŠb / rโŒ‹ - โŒŠa / rโŒ‹ multiples of r in (a, b], if a โ‰ค b.

theorem Int.Ico_filter_modEq_card (a b : โ„ค) {r : โ„ค} (hr : 0 < r) (v : โ„ค) :
โ†‘{x โˆˆ Finset.Ico a b | x โ‰ก v [ZMOD r]}.card = max (โŒˆ(โ†‘b - โ†‘v) / โ†‘rโŒ‰ - โŒˆ(โ†‘a - โ†‘v) / โ†‘rโŒ‰) 0

There are โŒˆ(b - v) / rโŒ‰ - โŒˆ(a - v) / rโŒ‰ numbers congruent to v mod r in [a, b), if a โ‰ค b.

theorem Int.Ioc_filter_modEq_card (a b : โ„ค) {r : โ„ค} (hr : 0 < r) (v : โ„ค) :
โ†‘{x โˆˆ Finset.Ioc a b | x โ‰ก v [ZMOD r]}.card = max (โŒŠ(โ†‘b - โ†‘v) / โ†‘rโŒ‹ - โŒŠ(โ†‘a - โ†‘v) / โ†‘rโŒ‹) 0

There are โŒŠ(b - v) / rโŒ‹ - โŒŠ(a - v) / rโŒ‹ numbers congruent to v mod r in (a, b], if a โ‰ค b.

theorem Nat.Ico_filter_modEq_cast (a b : โ„•) {r v : โ„•} :
Finset.map castEmbedding ({x โˆˆ Finset.Ico a b | x โ‰ก v [MOD r]}) = {x โˆˆ Finset.Ico โ†‘a โ†‘b | x โ‰ก โ†‘v [ZMOD โ†‘r]}
theorem Nat.Ioc_filter_modEq_cast (a b : โ„•) {r v : โ„•} :
Finset.map castEmbedding ({x โˆˆ Finset.Ioc a b | x โ‰ก v [MOD r]}) = {x โˆˆ Finset.Ioc โ†‘a โ†‘b | x โ‰ก โ†‘v [ZMOD โ†‘r]}
theorem Nat.Ico_filter_modEq_card (a b : โ„•) {r : โ„•} (hr : 0 < r) (v : โ„•) :
โ†‘{x โˆˆ Finset.Ico a b | x โ‰ก v [MOD r]}.card = max (โŒˆ(โ†‘b - โ†‘v) / โ†‘rโŒ‰ - โŒˆ(โ†‘a - โ†‘v) / โ†‘rโŒ‰) 0

There are โŒˆ(b - v) / rโŒ‰ - โŒˆ(a - v) / rโŒ‰ numbers congruent to v mod r in [a, b), if a โ‰ค b. Nat version of Int.Ico_filter_modEq_card.

theorem Nat.Ioc_filter_modEq_card (a b : โ„•) {r : โ„•} (hr : 0 < r) (v : โ„•) :
โ†‘{x โˆˆ Finset.Ioc a b | x โ‰ก v [MOD r]}.card = max (โŒŠ(โ†‘b - โ†‘v) / โ†‘rโŒ‹ - โŒŠ(โ†‘a - โ†‘v) / โ†‘rโŒ‹) 0

There are โŒŠ(b - v) / rโŒ‹ - โŒŠ(a - v) / rโŒ‹ numbers congruent to v mod r in (a, b], if a โ‰ค b. Nat version of Int.Ioc_filter_modEq_card.

theorem Nat.count_modEq_card_eq_ceil (b : โ„•) {r : โ„•} (hr : 0 < r) (v : โ„•) :
โ†‘(count (fun (x : โ„•) => x โ‰ก v [MOD r]) b) = โŒˆ(โ†‘b - โ†‘(v % r)) / โ†‘rโŒ‰

There are โŒˆ(b - v % r) / rโŒ‰ numbers in [0, b) congruent to v mod r.

theorem Nat.count_modEq_card (b : โ„•) {r : โ„•} (hr : 0 < r) (v : โ„•) :
count (fun (x : โ„•) => x โ‰ก v [MOD r]) b = b / r + if v % r < b % r then 1 else 0

There are b / r + [v % r < b % r] numbers in [0, b) congruent to v mod r, where [ยท] is the Iverson bracket.