@ZCDHJ
2018-10-05T13:09:16.000000Z
字数 4784
阅读 650
数学
欧拉筛法中的每个合数都只会被其最小的质因子(也可以说是最大的因子)筛去,所以复杂度是 的。
过程大概就是枚举那每一个最大的因子与最小的质因子,需要注意的是如果那个最小的质因子是另一个枚举的因子的质因数,那么后面的质因子就应不再枚举,这里令素数表为 。
如果 ,那么 的最小质因子就是 , 及后面的质数也一样,如果这时不退出的话一些数就会被重复筛去。
任意一个大于 的整数 都能分解为几个质数之积,就像下面这个形式
为什么是唯一的呢?因为如果任意一个 减一,那就需要再补一个 的因子,然而 都是质数,所以分解唯一。
其实就是分解质因数。但是这个暴力枚举的复杂度是
之前说了线性筛能够保证用每一个数最小的质因子来筛去某一个数,其实就是可以 求出每个数最小的质因子,那么就可以用来加速多个数质因数分解。前几天打 cf 的时候遇到了这样的一道题。。。
一些算术基本定理的推论:
对于不定方程 ,只有当 时才有整数解。
这个没啥好讲的,但我还是要证明一下。
令 为 , 为 ,。对于 任意公因数 ,, 那么 ,也就是 ,所以 的公因数集合与 的公因数集合相同。
根据前面的裴蜀定理可知,不定方程 ,只有当 时才有整数解 。那么我们只要求出一组 的特解,就可以求出一组原方程的特解。
那么该怎么求解呢?
扩展欧几里得可以解决这个问题,求出一组 最小的解。
推导过程:
我们已知 ,那么 。化简得 。因为只要求一组解,我们可以直接这样子:
这个算法来自《九章算数》,它原本是为约分而设计的,但适用于任何求最大公因数的问题。
可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
请自行翻译
大概就是有两个式子
这里默认
因为对于 的任意公因数 ,,所以上式得证。
还有 ,这个式子显然成立。
在高精度下求 gcd 可考虑用更相减损术代替欧几里得。
其实更相减损术很像这个 Stein 算法
众所周知,欧几里得算法求 gcd 很♂快
但是在算大整数的时候,需要试商,就会变慢。Stein 算法很好的解决了这个问题。
如果 中有一个奇数,那我们就可以将另一个数中的质因子 全部约去,因为这个时候两数的 gcd 不可能是 的倍数。
剩下的就和更相减损术差不多。
欧拉函数等于 。也就是与 互质并小于 的数的个数。
算数基本定理有 ,那么 。
大概证明一下
的质因子 会在与 互质的数集合中筛去 个数,质因子 同理。因为一个数的质因子不会大于 ,所以 一定小于 ,那么在 中, 的倍数就会被筛去两次,所以容斥一下,答案加上 。
化简可得 。
分解 的质因数时可以求出 。
然后有些性质
那么就可以线性筛出 到 内的 。
如果正整数 互质,就有 。
还是如果 互质,,那么这个就可以在指数很大的时候用来降幂。
若 为素数,有 。
其实就是欧拉定理中的 为素数时两边乘个 。
当 互质时,有一个正整数 满足 。称这个数 为 在模 意义下的乘法逆元。化简得 。想一想,前面欧拉定理是不是讲过 “如果正整数 互质,就有 。”?那么 就是 的乘法逆元,直接上快速幂。当然也可以用扩展欧几里得来求方程 的解。
但是还有一种线性递推逆元的办法。
现在要求 的逆元 ,设 。。
那么有,两边乘上 得 。最后有 。也就是 。
但是这样可能求出来的逆元是个负数,所以加上个 。也就是 。那么这样子就可以线性递推出 到 范围内模 意义下的逆元了。
然后因为同余的传递性,。打个表以及根据上面的性质可以发现,其实在 的时候, 到 的逆元是有循环节的。所以在求 的逆元的时候,可以直接先把 模 。
有同余方程组
中国剩余定理,是中国古代数学家孙子智慧的结晶,用来求解如上的一元线性同余方程组。
现在令 为 ,也就是所有 的 LCM, 为 ,,也就是 在模 下的乘法逆元。所以 ,。 这时, 就是方程组的一个特解。
方程的通解又可以表示为 。所以某些题在求最小正整数解的时候,可以直接模个 ,再加至非负整数。
现在 不再互质了怎么办?
扩展中国剩余定理可以很好地解决这个问题。
先令前 个 的 LCM 为 ,假设已经求出前 个方程的一个特解 ,那么其通解可以表示为 。现在就是要求出一个 i,使得 x+ip≡a_k \pmod {m_k},这个可以用扩展欧几里得来求解。那么新迭代下来的解为 x+ip,做 n 次扩展欧几里得就可以求出整个方程组的一组特解,求最小正整数解的方法与上面一样。
表示最后是上谷歌找到如何打 斯特林数 的正确姿势
n \brack m 表示 n 个不同元素分成 m 个圆排列的方案数。
有递推公式 {n \brack m}={n-1 \brack m}*(n-1)+{n-1 \brack m-1}。
{n \brace m} 表示 n 个不同元素分成 m 个集合的方案数。
有递推公式 {n \brace m}={n-1 \brace m}*m+{n-1 \brace m-1}。