欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

离散数学 - 容差原理

最编程 2024-07-05 08:20:45
...

先来看一下对于容斥原理的定义,引用百度百科

容斥原理_百度百科

现在,假定已经能够熟悉这个原理的基本内容,下面是对容斥原理的一些解释。

为了方便说明,我们把全集设为三个集合的并集A1, A2, A3

我们要求全集的基数,由容斥原理的定义可知,我们可以对单独的子集求基数,然后再减去多计算的部分即可。

很简单的两步

1.每个集合基数单独计算

2.将多减去的部分加上即可

对于容斥原理的难点,主要是第二部分。

我们会发现,在执行第二步的时候,会多减去一部分,也有可能不多减,这是子集的交集为空集的情况,然后我们会发现,我们又多加了一部分,然后依次递归,直到最后的交集是所有子集的交集的情况,因为这样的时候,前面所有的多加多减去的部分已经计算完成,只剩下最后的这一部分。

我们看这个公式

https://bkimg.cdn.bcebos.com/formula/c14b2ae75dc2656967cb2e2dedbe57cd.svg

这个公式即是对上述所说的解释。

对于(-1)^m-1这里,可以说明以下。

对于两个子集的时候,只需要减去多加的部分,即| A1交A2 |

对于三个子集的时候,在减去多加的部分的同时,怎么保证A1, A2, A3的交集不为空?

它肯定有空的时候,这是毫无疑问的,但是也有不为空的时候,这也是毫无疑问的。

那既然有不为空的时候,那怎么保证两两子集交集不会与A1,A2,A3的交集重合?既然这样,就会有多减的时候,那么再将多减去的再加回来即可。

为用数学公式统一,那么无论如何都加一下不就可以了吗?

对于四个子集的时候,怎么保证对于每三个子集交集不会有与四个子集的交集重复的情况,那这是不是又多减去了一部分?

......

上述即是 (-1)^m-1的正确性

方便使用数学的公式统一,可以更精简的写成这种形式

https://bkimg.cdn.bcebos.com/formula/8235e8b08ec7fc0c668a225a1146711b.svg

一些应用

求解欧拉函数

欧拉函数的定义是,小于n并且与n互素的数从的个数

首先任何一个自然数,都能分解为素数的乘积形式,并且,有且只有一种情况。

比如10可以分解为2*5,既然这样,任何能被5和2整除的数和10都不能为素数。

那么全集就是1-10所有自然数,应用容斥原理。

要从U中寻找和10互素的数,可以用全集的基数减去是2 倍数的数5两个子集

A:2的倍数

B:5的倍数

ans = |U| = |A| - |B| + |A\bigcap B|

ans = 9 - 4 - 1 + 0 = 4

验证:1 3 7 9

正确

推广形式

对于一个自然数n,可以将其拆分为这样的形式

n = p1^{\alpha1 }p2^{\alpha2 }...pk^{\alpha k}

Ai为i倍数组成的集合

然后有

用~A表示补集 |__| 表示向下取整

F(n) = |~A1 交 ~A2 ... 交~Ak|

可计算 |Ai| = |_n/pi_|

所以

|Ai 交Aj| = |_n/pi*pj_|

 经过一系列计算可得(不写过程了,电脑上打公式属实折磨)

最后得出的结论

F(x)  = n(1 - 1/p1)(1- 1/p2) ... (1 - 1/pk)