初等数论(未完成)
初等数论
关于取模运算
在模 p 意义下,加减乘法都能保留原有的运算性质
(a mod p + b mod p) mod p = (a + b) mod p
(a mod p − b mod p) mod p = (a − b) mod p
(a mod p) × (b mod p) mod p = (a × b) mod p
类似交换律,结合律,乘法分配律也依然满足 因此,计数题为了方便计算,经常会要求输出答案对某个数取模。
最小公倍数
求解最小公倍数的方法是辗转相除法。
int gcd(int x, int y) {
if(y == 0) return 0;
else return gcd(y, x % y);
}
exgcd
对于方程 ax + by = gcd(a, b),exgcd 可以求出一组整数解。
如果 \(b = 0\),则 \(x = 1\),\(y = 0\);
否则递归 \(exgcd(b, a ~mod~ b)\),并求出一组解 \(x ′\) ,$ y ′$ 此时 \(x = y ′\) , \(y = x ′ − ⌊ \frac{a}{b} ⌋y ′\) 是该方程的一组解
exgcd 的一个重要应用是求逆元
逆元及求法
当 \(ax≡1(modb)\), x即为 a 在mod b 意义下的逆元。
逆元的数学符号是 inv ,a 在mod b 意义下的逆元记作 inv(a,b)。注意不要写反了。
简单来说逆元就是在mod某个数意义下的倒数。例如5x≡1(mod3)x=2是满足10=1(mod3)所以称2是5在mod3意义下的逆.
逆元有什么用呢?在取模意义下,对于某个数做除法是不行的,正确做法是呈上某个数的逆元再取模。
exgcd 求逆元
\(ax + py = gcd(a, p) = 1\) 那么 \(a*x\) \(mod\) $ p = 1$
x 为逆元。
欧拉定理
当 gcd(a, p) = 1 时 \(a ^{φ(p)} = 1(modp)\)
$\varphi(nm) = \varphi(n) * \varphi(m),n,m \in \mathbb{P} $
费马小定理
如果 p 是质数且 \(p ∤ a\),则 \(a^{p−1} (modp)\)
也就是 \(a^{p - 2} ~mod~p\) 即为 \(a\) 的逆元。
利用费马小定理求逆元需要用到快速幂。
int power(int a, int b, int p) {
int ans = 1 % p;
for (; b; b >>= 1) {
if (b & 1) ans = (ans * a) % p;
a = (a * a) % p;
}
return ans;
}
signed main() {
n = read(), p = read();
for (int i = 1; i <= n; i++)
cout << power(i, p - 2, p) << endl;
}
线性递推求逆元
首先我们有一个,\(1^{−1}≡1(mod~p)\)
然后设 $ p=k∗i+r,(1<r<i<p) $也就是 \(k\) 是 \(p/i\) 的商,\(r\) 是余数 。
再将这个式子放到(\(mod~p\))意义下就会得到:
\(k∗i+r≡0(mod~p)\)
然后乘上i−1,r−1就可以得到:
\(k∗r−1+i−1≡0(mod~p)\)
\(i−1≡−k∗r−1(mod~p)\)
\(i−1≡−⌊pi⌋∗(p~mod~i)−1(mod~p)\)
于是,我们就可以从前面推出当前的逆元了。
inv[1] = 1;
for (int i = 2; i <= n; i++)
inv[i] = (p - p / i) * inv[p % i] % p;
阶乘的逆元
因为有如下一个递推关系。
\(inv[i+1]=\frac{1}{(i+1)!}\)
\(inv[i+1]∗(i+1)=\frac{1}{i!}=inv[i]\)
所以我们可以求出\(n!\)的逆元,然后逆推,就可以求出\(1...n!\)所有的逆元了。
递推式为
\(inv[i+1]∗(i+1)=inv[i]\)
所以我们可以求出 \(∀i,i!,\frac{1}{i!}\)的取值了。
然后这个也可以导出$ \frac{1}{i }(mod~p) $的取值,也就是
\(\frac{1}{i!}×(i−1)!=\frac{1}{i}(mod~p)\)
草稿(不要看)
除法:mod p 后再除不对(p 是质数)
任何一个 b * a, 不知p, 想要回去就乘上a的乘法逆元(乘上逆元相当于做除法)。
逆元求法
拓展gcd:
对于方程 ax + by = gcd(a, b),exgcd 可以求出一组整数解。 如果 b = 0,则 x = 1,y = 0 否则递归 exgcd(b, a mod b),并求出一组解 x ′ , y ′ 此时 x = y ′ , y = x ′ − ⌊ a/ b ⌋y ′ 是该方程的一组解
求解 \(ax + py = gcd(a, p) = 1\) 那么 \(a*x\) \(mod\) $ p = 1$
x 为逆元
费马小定理
\(a^{p - 2}, a^{p - 1}\) 是 \(a\) 的逆元
矩阵 把A变为I的过程就是把I变成A的逆的过程
线性同余方程
裴蜀定理
内容 \(ax+by=c\) ,\(x \in Z^*, y \in Z*\) ,则其成立的充要条件是 \(\gcd(a, b) | c\)
证明
它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.
拓展裴蜀定理 例题
中国剩余定理
中国剩余定理是一种用于求解诸如
\(\begin{cases}x≡a_1\;\;(mod\;\;m_1)\\x≡a_2\;\;(mod\;\;m_2)\\ \cdots \cdots\\x≡a_k\;\;(mod\;\;m_k)\\\end{cases}\)
形式的同余方程组的定理,其中,\(m_1,m_2,...,m_k\) 为两两互质的整数,我们的目的,是找出\(x\)的最小非负整数解。
解法
我们设 M=\(\prod_{i=1}^{k}m_i\qquad\) \(M_i=\frac{M}{m_i}\qquad\) \(M_it_i≡1\;\;(mod\;\;m_i)\)
其中\(1≤i≤k\)。
显然,MM表示所有方程组的模的乘积;\(M_i\) 表示除第ii个方程外,其余所有方程的模的乘积;\(t_i\) 则为\(M_i\)的逆元。
我们可以构造出一个解\(x=\sum_{i=1}^{k}a_iM_it_i\)
由此,任意解\(x_0\)即为 \(x+k*M\)
最小正整数解 \(x_{min}=x_0\,\%\,M\)
Notice: 有人可能会问,\(x=\sum_{i=1}^{k}a_iM_it_i\)中,\(M_it_i\)难道不为1吗?
仔细看,这里x后面跟的是等号,而前面的\(M_it_i≡1\;\;(mod\;\;m_i)≡1\)只有在\(m_i\)的剩余系中才成立,换句话讲,在实数系中,\(M_it_i=1\)是不成立的

浙公网安备 33010602011771号