published: 2022/5/20 update: 2022/5/20
自分なりに包除原理やオイラー関数について整理しておきたかったのでメモを書きます。正確な情報は文献抄を見たほうがいいです。
intersection
からunion
に変換する公式。
ただし、i
の要素数。
正直自信がないです
そこで、右辺では要素
とかけます。一方、二項定理より
となるので、任意の要素
これをメモしたかった。
bit
全探索を使って書けます。
100以下の2, 3, 5
の倍数について考えます。
fn main() {
let nums = vec![2, 3, 5];
let mut counter = 0;
for bit in 0..1 << nums.len() {
// 2進数のときの1の数をカウント
let popcount = bit.count_ones();
let mut mul = 1;
for i in 0..nums.len() {
if bit & 1 << nums.len() {
mul *= nums[i]
}
}
if mul == 1 {
continue;
}
if popcount % 2 == 1 {
counter += 100 / mul;
} else {
counter -= 100 / mul;
}
}
println!("{}", counter)
}
倍数性がわかるので、素因数分解すれば互いに素な数を数え上げるのとかにも使えます。
任意の自然数
このとき、
が成り立つ。
任意の
また、一般に、任意の積集合において、
が成り立つ(ex., 100以下の10の倍数は2の倍数かつ5の倍数なので、100/(2*5))。
ここで、和集合
が示せればよい。
包除原理を使うと
となり示せた。
包除原理から離れてしまうが、個人的にはこっちのほうが理解しやすかった。
記事に間違い等ありましたら、お気軽に以下までご連絡ください
E-mail: illumination.k.27|gmail.com ("|" replaced to "@")
Twitter: @illuminationK
当HPを応援してくれる方は下のリンクからお布施をいただけると非常に励みになります。
OfuseCopyright © illumination-k 2020-2022.