初等数论(未完成)

初等数论

关于取模运算

在模 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\)是不成立的

posted @ 2022-10-06 18:29  djc01  阅读(81)  评论(0)    收藏  举报