总体来说,质数有无穷多个。其分布存在一定规律。
对于任何一个数,其分解质因数有且仅有一种方式分解。即, x = ∏ i = 1 k p i a i x=\prod_{i=1}^{k} p_i^{a_i} x=∏i=1kpiai,此方式唯一。
题意:给定一个序列,可能执行以下四种操作:
解法:
可以通过欧几里得算法在 O ( log n ) O(\log n) O(logn) 时间复杂度内求出两个数的最大公约数。其原理是, gcd ( a , b ) = gcd ( a − b , b ) \gcd(a,b)=\gcd(a-b,b) gcd(a,b)=gcd(a−b,b),进而等于 gcd ( a − k b , b ) \gcd(a-kb,b) gcd(a−kb,b),因而改减法为取模,即 gcd ( a m o d b , b ) \gcd(a \mod b,b) gcd(amodb,b)。每次两个数中必有一个要折半以上,因而总体时间复杂度为 O ( log a + log b ) O(\log a+\log b) O(loga+logb)。
扩展欧几里得算法通常是用于解决形如 a x + b y = c ax+by=c ax+by=c 的丢番图方程。由裴蜀定理可知,其有解的充分必要条件为 gcd ( a , b ) ∣ c \gcd(a,b)|c gcd(a,b)∣c。同时,若 gcd ( a , b ) ∣ c \gcd(a,b)|c gcd(a,b)∣c,则存在整数 x , y x,y x,y 满足 a x + b y = c ax+by=c ax+by=c。
考虑先解决一个特殊问题:求解 a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)。使用 gcd ( a , b ) = gcd ( a m o d b , b ) \gcd(a,b)=\gcd(a \mod b,b) gcd(a,b)=gcd(amodb,b),因而我们可以写出两个等价的方程:
{ a x + b y = gcd ( a , b ) ( a m o d b ) x ′ + b y ′ = gcd ( a m o d b , b ) \left\{ \begin{array}{c} ax+by=\gcd(a,b) \\ (a \mod b)x'+by'=\gcd(a \mod b,b)\\ \end{array} \right. {ax+by=gcd(a,b)(amodb)x′+by′=gcd(amodb,b)
带入 a m o d b = a − b ⌊ a b ⌋ \displaystyle a\mod b=a-b\lfloor \frac{a}{b} \rfloor amodb=a−b⌊ba⌋,则可化简第二式为 a y ′ + b ( x ′ − y ′ ⌊ a b ⌋ ) ay'+b(x'-y' \lfloor \frac{a}{b} \rfloor) ay′+b(x′−y′⌊ba⌋)。因而产生了递推关系: x = y ′ , y = x ′ − y ′ ⌊ a b ⌋ x=y',y=x'-y'\lfloor \frac{a}{b} \rfloor x=y′,y=x′−y′⌊ba⌋。考虑递归的边界条件 b = 0 b=0 b=0,此时带入 x = 1 , y = 0 x=1,y=0 x=1,y=0,按照上式递推即可求出原式的解。
若 c = k gcd ( a , b ) c=k\gcd(a,b) c=kgcd(a,b),只需要将解乘以 k k k 倍即可得到特解。
由线性方程解的结构可知,线性方程的通解形式为“齐次方程通解+非齐次方程特解”。此处的非齐次方程即为 a x + b y = c ax+by=c ax+by=c,其次方程为 a x + b y = 0 ax+by=0 ax+by=0。后者的通解是非常容易写出的:
{ x = t b gcd ( a , b ) y = − t a gcd ( a , b ) \left\{ \begin{array}{c} x=\frac{tb}{\gcd(a,b)}\\ y=-\frac{ta}{\gcd(a,b)}\\ \end{array} \right. {x=gcd(a,b)tby=−gcd(a,b)ta
因而最后 a x + b y = c ax+by=c ax+by=c 的通解为:
{ x = x 0 + t b gcd ( a , b ) y = y 0 + t a gcd ( a , b ) \left\{ \begin{array}{c} x=x_0+\frac{tb}{\gcd(a,b)}\\ y=y_0+\frac{ta}{\gcd(a,b)}\\ \end{array} \right. {x=x0+gcd(a,b)tby=y0+gcd(a,b)ta
其中 x 0 , y 0 x_0,y_0 x0,y0 即为使用扩展欧几里得算法计算出的一组特解。
同余符号的定义:若 a ≡ b m o d m a \equiv b\mod m a≡bmodm,则有 m ∣ b − a m|b-a m∣b−a,即 b = k m + a b=km+a b=km+a。反之也成立。
同余的基本性质:
所谓线性同余方程,即是给定 a , b , m a,b,m a,b,m,求解 a x ≡ b m o d m ax \equiv b \mod m ax≡bmodm 的解。一个基本的想法是利用同余的定义,将其转化为丢番图方程 a x + m y = b ax+my=b ax+my=b 的解。而这个方程可以由扩展欧几里得算法解决。
若 b = 1 b=1 b=1,则求出的 x x x 即为 a a a 在模 m m m 意义下的逆元。
威尔逊定理:对于质数 p p p, ( p − 1 ) ! ≡ − 1 m o d p (p-1)! \equiv -1 \mod p (p−1)!≡−1modp,其逆定理也成立。
由威尔逊定理,可以推出费马小定理:若 p p p 为质数, a a a 为与 p p p 互质的任意正整数,则有 a p − 1 ≡ m o d p a^{p-1}\equiv \mod p ap−1≡modp。
证明: a , 2 a , 3 a , ⋯ , ( p − 1 ) a a,2a,3a,\cdots,(p-1)a a,2a,3a,⋯,(p−1)a 中均无 p p p 的倍数,也不两两同余,因而该数列模 p p p 一定是一个 [ 1 , p − 1 ] [1,p-1] [1,p−1] 的一个排列。因而, a p − 1 ( p − 1 ) ! ≡ ( p − 1 ) ! m o d p a^{p-1} (p-1)!\equiv (p-1)! \mod p ap−1(p−1)!≡(p−1)!modp。又 ( p − 1 ) ! ≡ − 1 m o d p (p-1)! \equiv -1 \mod p (p−1)!≡−1modp,因而 a p − 1 ≡ 1 m o d p a^{p-1} \equiv 1 \mod p ap−1≡1modp。
特别的,由于对 a = k p a=kp a=kp 的情况, a p − 1 ≡ 1 m o d p a^{p-1} \equiv 1 \mod p ap−1≡1modp 不成立,而 a p ≡ a m o d p a^p \equiv a \mod p ap≡amodp 则对一切正整数成立,因而费马小定理也写作 a p ≡ a m o d p a^p \equiv a \mod p ap≡amodp。
逆元,即是在模 m m m 意义下,对于整数 a a a,满足方程 a x ≡ 1 m o d m ax \equiv 1 \mod m ax≡1modm 的 x x x。其作用是将取模意义下无法处理的除法用乘法代表了。
例如,要求 a b m o d m \displaystyle \frac{a}{b} \mod m bamodm,即可求出 b b b 在模 m m m 意义下的逆元 x x x,则有 a b ≡ a x m o d b \displaystyle \frac{a}{b} \equiv ax \mod b ba≡axmodb。
显然,由裴蜀定理,当 gcd ( b , m ) ≠ 1 \gcd(b,m) \neq 1 gcd(b,m)=1 时, b b b 无模 m m m 意义下的逆元。
求逆元的方法很多。对于质数,可以考虑使用费马小定理:因为 a p − 1 ≡ 1 m o d p a^{p-1} \equiv 1 \mod p ap−1≡1modp,因而 a a a 的逆元可以取 a p − 2 a^{p-2} ap−2。
若 m m m 不是质数,则可以考虑使用扩展欧几里得算法进行计算。此法不常用。
还有一个线性递推的方法。首先 1 − 1 ≡ 1 m o d m 1^{-1} \equiv 1 \mod m 1−1≡1modm。考虑 ∀ i ∈ [ 2 , p − 1 ] \forall i \in[2,p-1] ∀i∈[2,p−1],均有 k i + r ≡ 0 m o d p ki+r \equiv 0 \mod p ki+r≡0modp。两边乘以 i − 1 , r − 1 i^{-1},r^{-1} i−1,r−1 有 i − 1 ≡ − k r − 1 m o d p i^{-1} \equiv -kr^{-1} \mod p i−1≡−kr−1modp,即 i − 1 ≡ ⌊ p i ⌋ ( p m o d i ) − 1 m o d p i^{-1} \equiv \lfloor \frac{p}{i} \rfloor (p \mod i) ^{-1} \mod p i−1≡⌊ip⌋(pmodi)−1modp。写成代码,就是:
inv[i]=-(p/i)*inv[p%i];
剩余系,即将 N N N 中的所有数按照对给定模数 m m m 分成 m m m 个等价类,通常取 [ 0 , m − 1 ] [0,m-1] [0,m−1] 作为等价类的代表元。
简化剩余系,指余数与 m m m 互质的一些等价类。为了统计简化剩余系的等价类数目,我们引入欧拉函数 φ ( m ) \varphi(m) φ(m) 来表示这个数目。容易注意到, φ ( m ) \varphi(m) φ(m) 表示了小于 m m m 的数中与 m m m 互质数的数目(注意: 1 1 1 也算与 m m m 互质的数)。
考虑剩余系的遍历:任取一个整数 x x x,用 x x x 加 m m m 次 1 1 1,即可走完所有的剩余系。这是因为, [ x , x + m − 1 ] [x,x+ m-1] [x,x+m−1] 包含全部的剩余系。
但是对于简化剩余系,它的遍历就没有这么简单了:显然我们不能通过上面这种方式了,因为加一之后可能导致遍历到非简化剩余系中元素。
记 a a a 为 m m m 简化剩余系中的元素, a ′ a' a′ 为 m ′ m' m′ 简化剩余系中元素,考虑用一种方式去遍历这两个简化剩余系,那么容易得到, a m ′ + a ′ m am'+a'm am′+a′m 遍历了 m m ′ mm' mm′ 的简化剩余系。
因而我们可以推出,当 gcd ( m , m ′ ) = 1 \gcd(m,m')=1 gcd(m,m′)=1, φ ( m ) φ ( m ′ ) = φ ( m m ′ ) \varphi(m) \varphi(m')=\varphi(m m') φ(m)φ(m′)=φ(mm′)。这种性质,被称为积性函数——若 ∀ a , b , gcd ( a , b ) = 1 \forall a,b,\gcd(a,b)=1 ∀a,b,gcd(a,b)=1,有 f ( a b ) = f ( a ) f ( b ) f(ab)=f(a)f(b) f(ab)=f(a)f(b),则称 f f f 为积性函数;若 ∀ a , b \forall a,b ∀a,b,均有 f ( a b ) = f ( a ) f ( b ) f(ab)=f(a)f(b) f(ab)=f(a)f(b),则称 f f f 为完全积性函数。
利用欧拉函数的积性,我们可以得到以下一些欧拉函数的性质:
而这就是欧拉定理:当 gcd ( a , m ) = 1 \gcd(a,m)=1 gcd(a,m)=1 时, a φ ( m ) ≡ 1 m o d m a^{\varphi (m)} \equiv 1 \mod m aφ(m)≡1modm。容易发现,费马小定理是欧拉定理的一个特例。
因而这指出了另一条计算逆元的方法: a φ ( m ) − 1 a^{\varphi(m)-1} aφ(m)−1 一定为 a a a 的逆元。
如果求单个数的欧拉函数,可以考虑枚举其质因子,在 O ( n ) O(\sqrt{n}) O(n) 的时间内完成。如果要求多个,则可以考虑其线性筛法。方法与线性筛素数类似,仅加上一个利用积性函数求解 φ \varphi φ 的过程。
注意到 a φ ( m ) ≡ 1 m o d m a^{\varphi(m)} \equiv 1 \mod m aφ(m)≡1modm,因而可以认为 a a a 的幂关于 m m m 的模数是关于 φ ( m ) \varphi(m) φ(m) 为周期的。所以我们有结论:对指数取模,使用 φ ( m ) \varphi(m) φ(m)。
线性同余方程组的一般形式为:
{ x ≡ b 1 m o d m 1 x ≡ b 2 m o d m 2 x ≡ b 3 m o d m 3 ⋯ x ≡ b n m o d m n \left\{ \begin{array}{c} x \equiv b_1 \mod m_1 \\ x \equiv b_2 \mod m_2 \\ x \equiv b_3 \mod m_3 \\ \cdots \\ x \equiv b_n \mod m_n \end{array} \right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡b1modm1x≡b2modm2x≡b3modm3⋯x≡bnmodmn
如果 m i m_i mi 两两互质,我们可以考虑使用中国剩余定理。其基本思想为只考虑一个方程,利用各方程的独立性,逐项进行变量代换,最后求出通解。
记 N = ∏ i = 1 n m i N=\prod_{i=1}^{n} m_i N=∏i=1nmi,考虑以下的新的同余方程组:
{ x ≡ 0 m o d m 1 x ≡ 0 m o d m 2 x ≡ 0 m o d m 3 ⋯ x ≡ 1 m o d m i ⋯ x ≡ 0 m o d m n \left\{ \begin{array}{c} x \equiv 0 \mod m_1 \\ x \equiv 0 \mod m_2 \\ x \equiv 0 \mod m_3 \\ \cdots \\ x \equiv 1 \mod m_i \\ \cdots \\ x \equiv 0 \mod m_n \end{array} \right. ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧x≡0modm1x≡0modm2x≡0modm3⋯x≡1modmi⋯x≡0modmn
令 x = N m i y \displaystyle x=\frac{N}{m_i} y x=miNy,即解 N m i y ≡ 1 m o d m i \displaystyle \frac{N}{m_i} y \equiv 1\mod m_i miNy≡1modmi,解完后回带即可求出 x i x_i xi。依次解完这 n n n 个方程组,则有通解 x = ∑ i = 1 n b i x i \displaystyle x=\sum_{i=1}^{n} b_i x_i x=i=1∑nbixi。POJ 1006 满足该条件,可以直接使用。
考虑另一种解法:合并法(增量法),将两组使用扩展欧几里得算法进行合并。例如,考虑前两个方程:
{ x ≡ b 1 m o d m 1 x ≡ b 2 m o d m 2 \left\{ \begin{array}{c} x \equiv b_1 \mod m_1 \\ x \equiv b_2 \mod m_2 \\ \end{array} \right. {x≡b1modm1x≡b2modm2
显然第一个方程的通解为 x = b 1 + k m 1 x=b_1+km_1 x=b1+km1,带入第二个方程可得 b 1 + k m 1 ≡ b 2 m o d m 2 b_1+km_1 \equiv b_2 \mod m_2 b1+km1≡b2modm2。该方程又可以转化为丢番图方程,使用扩展欧几里得算法进行求解。最后可以合并到只剩一个方程,此时解完。该种方法可以不满足模数两两互质。
中国剩余定理用处不仅在求解同余线性方程组。对于一个合数做模数的情况(例如组合数对合数取模),可以考虑将模数的合数使用整数唯一分解定理,分解成若干个质数乘积,得到若干个对质数的同余线性方程组,然后用中国剩余定理,解同余方程组做合并。
考虑一种特殊的线性同余方程组:
{ x ≡ b 1 m o d p a 1 x ≡ b 2 m o d p a 2 x ≡ b 3 m o d p a 3 ⋯ x ≡ b n m o d p a n , a 1 ≥ a 2 ≥ a 3 ≥ ⋯ ≥ a n \left\{ \begin{array}{c} x \equiv b_1 \mod p^{a_1} \\ x \equiv b_2 \mod p^{a_2} \\ x \equiv b_3 \mod p^{a_3} \\ \cdots \\ x \equiv b_n \mod p^{a_n} \end{array} \right., a_1\geq a_2 \geq a_3 \geq \cdots \geq a_n ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡b1modpa1x≡b2modpa2x≡b3modpa3⋯x≡bnmodpan,a1≥a2≥a3≥⋯≥an
其有解的充要条件为
{ b 1 ≡ b 2 m o d p a 2 b 2 ≡ b 3 m o d p a 3 ⋯ b n − 1 ≡ b n m o d p a n \left\{ \begin{array}{c} b_1 \equiv b_2 \mod p^{a_2} \\ b_2 \equiv b_3 \mod p^{a_3} \\ \cdots \\ b_{n-1} \equiv b_n \mod p^{a_n} \end{array} \right. ⎩⎪⎪⎨⎪⎪⎧b1≡b2modpa2b2≡b3modpa3⋯bn−1≡bnmodpan
并且其解为 x ≡ b 1 m o d p a 1 x \equiv b_1 \mod p^{a_1} x≡b1modpa1。
利用这个性质可以利用中国剩余定理,解决线性同余方程组中模数不互质的情况。将每一个方程中的合数模数全部拆分成若干个模质数幂次的线性方程组,然后分组先解决每个质数的问题。如果某一组质数报告无解,则原方程无解,反之则可以去掉所有模数次数低的方程,仅保留模数次数最高的方程。剩下的就是模数均互质的情况,进而可以使用中国剩余定理。
解多项式同余方程,即是求解一个函数 f ( x ) ≡ 0 m o d p k f(x) \equiv 0 \mod p^k f(x)≡0modpk 的根。可以证明,若 f ( x ) f(x) f(x) 为 n n n 次多项式,则其在模 p p p 意义下至多只有 n n n 个解。(拉格朗日定理)
通常首先求出 f ( x ) ≡ 0 m o d p f(x) \equiv 0 \mod p f(x)≡0modp 的根 x 0 x_0 x0,此处并无一般快速方法。然后递推次数。
注意到 f ( x k + 1 ) ≡ 0 m o d p k + 1 f(x_{k+1}) \equiv 0 \mod p^{k+1} f(xk+1)≡0modpk+1 一定都是 f ( x k + 1 ) ≡ 0 m o d p k f(x_{k+1}) \equiv 0 \mod p^k f(xk+1)≡0modpk 的解,因而考虑从 { x k } \{x_k\} {xk} 的解集中筛选 x k + 1 x_{k+1} xk+1 出来。
考虑令 x k + 1 = x k + t p k x_{k+1}=x_k+t p^k xk+1=xk+tpk,求解 t t t。将 f ( x ) f(x) f(x) 在 x k x_k xk 出做二阶泰勒展开,容易得到 f ( x ) = f ( x k ) + f ′ ( x k ) t p k f(x)=f(x_k)+f'(x_k)tp^k f(x)=f(xk)+f′(xk)tpk+f’’(\xi) (tpk)2$。显然其高阶无穷小均可被 p k + 1 p^{k+1} pk+1 整除,因而省略。所以可以转化为线性同余方程 t f ′ ( x k ) ≡ − f ( x k ) p k m o d p \displaystyle tf'(x_k) \equiv -\frac{f(x_k)}{p^k} \mod p tf′(xk)≡−pkf(xk)modp。
对 f ′ ( x k ) f'(x_k) f′(xk) 是否对 p p p 整除讨论出 t t t 解的情况:
有了这个递推之后,很容易推广到任意高阶。
在实数域上,如果 a x = b a^x=b ax=b,则有 x = log a b x=\log_{a} b x=logab。在取模的运算中,不能直接这么写,通常使用 x = i n d a b x={\rm ind}_{a} b x=indab。而这也叫离散对数。
离散对数通常解决的问题是求解 a x ≡ b m o d p a^x \equiv b \mod p ax≡bmodp。
一般使用接近暴力的 BSGS 算法:其解有形式 x = α ⌈ p ⌉ − β , x ∈ [ 0 , φ ( a ) x=\alpha \lceil \sqrt{p} \rceil - \beta,x \in[0, \varphi(a) x=α⌈p⌉−β,x∈[0,φ(a)。因而 α \alpha α 仅有 p \sqrt{p} p 个取值。在操作的过程中,只需枚举这根号个 α \alpha α 的值并逐一检验即可。
但是 BSGS 有其局限性:仅能处理模数为质数的情况。因而产生了扩展 BSGS 算法。令 d = gcd ( a , p ) d=\gcd(a,p) d=gcd(a,p),两侧同时除以 d d d,得到 a x d ≡ b d m o d p d \displaystyle \frac{a^x}{d}\equiv \frac{b}{d} \mod \frac{p}{d} dax≡dbmoddp,直到 p p p 变成质数或者中途存在一个 b b b 无法被 d d d 整除的情况,报告无解即可。
通常对于模数较大的情况,可以采用递推法( n , m n,m n,m 均较小)或阶乘法( n , m n,m n,m 较大)。注意当模数与 n , m n,m n,m 同阶时要特别判定 p ! p! p! 的逆元——此时逆元不存在。
而对于小素数,常用 Lucas 定理。考虑组合数都是 ( 1 + x ) n (1+x)^n (1+x)n 的系数,对二项式进行展开,有 ( 1 + x ) p m o d p = ( 1 + x p ) m o d p (1+x)^p \mod p=(1+x^p) \mod p (1+x)pmodp=(1+xp)modp,因为中间每一项均含 p p p。
将 n n n 用 p p p 表示,则有 ( 1 + x ) n = ( 1 + x ) ⌊ p n p ⌋ ( 1 + x ) n m o d p = ( 1 + x p ) ⌊ n p ⌋ ( 1 + x ) n m o d p \displaystyle (1+x)^n=(1+x)^{\lfloor p\frac{n}{p} \rfloor} (1+x)^{n \mod p}=(1+x^p)^{\lfloor \frac{n}{p} \rfloor}(1+x)^{n \mod p} (1+x)n=(1+x)⌊ppn⌋(1+x)nmodp=(1+xp)⌊pn⌋(1+x)nmodp。因而可以得到,
( n m ) = ( ⌊ n p ⌋ ⌊ m p ⌋ ) ( n m o d p m m o d p ) m o d p \dbinom{n}{m}=\dbinom{\lfloor \frac{n}{p} \rfloor}{\lfloor \frac{m}{p} \rfloor} \dbinom{n \mod p}{m \mod p} \mod p (mn)=(⌊pm⌋⌊pn⌋)(mmodpnmodp)modp
通常对于等式右侧的第一项,继续使用 Lucas 定理递归的求解。
如果模数为小素数的幂,则采用分治的思想。注意挖出小素数的倍数的阶乘,它们没有逆元。
如果模数不为质数,则使用扩展 Lucas 定理,或者和前面的处理类似,将合数直接拆分成若干个素数的线性同余方程组,然后用中国剩余定理进行合并。
原根的定义为:对于模数 m m m,若存在一个数 g g g,满足 g φ ( m ) ≡ 1 m o d m g^{\varphi(m)} \equiv 1\mod m gφ(m)≡1modm 成立,并且 φ ( m ) \varphi(m) φ(m) 是其最小的满足该等式的解(又称阶,记作 δ m ( g ) \delta_m (g) δm(g)),则称 g g g 为 m m m 的原根。
阶的性质很多:
原根的性质也很丰富,可以辅助求解指数同余方程。若 x a ≡ b m o d m x^a \equiv b\mod m xa≡bmodm,且 m m m 为质数,则由于 m m m 存在原根,可以求出其原根为 g g g,转而求解 g s ≡ b m o d m g^s \equiv b \mod m gs≡bmodm。若有解,则可令 x = g t x=g^t x=gt,带入则有 g t a ≡ g s m o d m g^{ta} \equiv g^s \mod m gta≡gsmodm。考虑原根的性质,则有 t a ≡ s m o d φ ( m ) ta \equiv s \mod \varphi(m) ta≡smodφ(m)。因而可以加速这种方程的求解。
原根存在定理:当且仅当 m = 2 , 4 , p α , 2 p α m=2,4,p_{\alpha},2p_{\alpha} m=2,4,pα,2pα 时才存在,其中 α \alpha α 为正整数。通常求原根没有什么行之有效的方法,通常是从小到大枚举。如果 a a a 为质数,则只用判断所有的质数 p ∣ a − 1 p|a-1 p∣a−1,满足 g a − 1 p ≠ 1 m o d a g^{\frac{a-1}{p}} \neq 1 \mod a gpa−1=1moda 即可。
关于其递推,记 g g g 为 p p p 的原根,则以下的递推均是二择其一:
若 x 2 ≡ a m o d m x^2 \equiv a \mod m x2≡amodm,则 x x x 为模 m m m 下的二次剩余,否则为二次非剩余。二次剩余可以解决 a \sqrt{a} a 的取模问题——用其二次剩余的 x x x 来替代 a \sqrt{a} a 即可。
勒让德符号 ( a p ) = a m − 1 2 m o d p (\frac{a}{p})=a^{\frac{m-1}{2}} \mod p (pa)=a2m−1modp:值为 1 1 1 则为二次剩余, − 1 -1 −1 则不是。
求解二次剩余有以下的几种方法:
计算方程 a x 2 + b y 2 = c ax^2+by^2=c ax2+by2=c 在一定范围下的全部整数解,可以考虑使用椭圆曲线法——先找到一组特解,然后做一条斜率为有理数 α = m n \displaystyle \alpha = \frac{m}{n} α=nm的直线,交这一圆锥曲线,得到的解一定是有理解。
对于一个特殊方程 x 2 + d y 2 = m x^2+dy^2=m x2+dy2=m,在 gcd ( d , m ) = 1 \gcd(d,m)=1 gcd(d,m)=1 下有解,使用 Cornacchia’s algorithm 算法可以解决。先求解方程 r 0 2 ≡ − d m o d m r_0^2 \equiv -d \mod m r02≡−dmodm,然后对 r 0 r_0 r0 与 m m m 做辗转相除,得到一系列的 r 1 , r 2 r_1,r_2 r1,r2 等直到 r i < m r_i < \sqrt m ri<m,检查 s − r i 2 d \displaystyle \sqrt{\frac{s-r_i^2}{d}} ds−ri2 是否为整数,若是则一组解为 ( r i , s − r i 2 d ) (r_i,\displaystyle \sqrt{\frac{s-r_i^2}{d}}) (ri,ds−ri2),否则就尝试另一个 r 0 r_0 r0。
对于大数,常用判定素数的方法都不太好用,因而使用 Miller-Rabin,Pollard Rho 等随机性算法,但其判定仅为素数的必要条件。
首先先引入一个 Fermat 素数检测: a p − 1 ≡ 1 m o d p a^{p-1} \equiv 1 \mod p ap−1≡1modp 成立。但是这个条件经常有合数也混进来了,因而有了改进了 Fermat 素数检测——Miller-Rabin。在 Fermat 素数检测加若干次二次探测,即 a p − 1 2 m ≡ ± 1 m o d p a^{\frac{p-1}{2^m}} \equiv \pm 1 \mod p a2mp−1≡±1modp,而且模数为 1 , − 1 1,-1 1,−1 交替出现。真正的素数每一项均为 ± 1 \pm 1 ±1,而伪素数则会在某些幂次露出马脚,因而可以加强判定。通常在实际的测试过程中还会选取多个 a a a 来加强判断的可信度。
首先定义两个积性函数 f , g f,g f,g 的狄利克雷卷积为 h ( n ) = ∑ i ∣ n f ( i ) g ( n i ) = ∑ i ∣ n f ( n i ) g ( i ) \displaystyle h(n)=\sum_{i|n} f(i)g(\frac{n}{i})=\sum_{i|n} f(\frac{n}{i}) g(i) h(n)=i∣n∑f(i)g(in)=i∣n∑f(in)g(i)。
莫比乌斯反演:若 ∀ n , g ( n ) = ∑ i ∣ n f ( i ) \forall n,\displaystyle g(n)=\sum_{i|n} f(i) ∀n,g(n)=i∣n∑f(i),则有 f ( n ) = ∑ i ∣ n μ ( i ) g ( n i ) = ∑ i ∣ n μ ( n i ) g ( i ) \displaystyle f(n)=\sum_{i|n} \mu (i) g(\frac{n}{i})=\sum_{i|n} \mu(\frac{n}{i}) g(i) f(n)=i∣n∑μ(i)g(in)=i∣n∑μ(in)g(i)。
证明: ∑ i ∣ n μ ( n i ) g ( i ) = ∑ i ∣ n μ ( n i ) ( ∑ j ∣ i f ( j ) ) \displaystyle \sum_{i|n} \mu(\frac{n}{i}) g(i)=\sum_{i|n} \mu(\frac{n}{i})(\sum_{j|i} f(j)) i∣n∑μ(in)g(i)=i∣n∑μ(in)(j∣i∑f(j)),然后将内侧求和符号中拿出来,枚举最小的因子 k k k, ∑ i ∣ n f ( i ) ∑ k ∣ n i μ ( k ) = ∑ i ∣ n f ( i ) [ n i = 1 ] = f ( n ) \displaystyle \sum_{i|n} f(i) \sum_{k|\frac{n}{i}} \mu(k)=\sum_{i|n} f(i)[\frac{n}{i}=1]=f(n) i∣n∑f(i)k∣in∑μ(k)=i∣n∑f(i)[in=1]=f(n)。
此处用到莫比乌斯函数的性质:当 n ≠ 1 n \neq 1 n=1 时, ∑ d ∣ n μ ( d ) = 0 \displaystyle \sum_{d|n} \mu(d)=0 d∣n∑μ(d)=0。
考虑计算一个积性函数 f f f 的前缀和,记 S ( n ) = ∑ i = 1 n f ( i ) \displaystyle S(n)=\sum_{i=1}^n f(i) S(n)=i=1∑nf(i)。此时再找一个积性函数 g g g,对其做狄利克雷卷积,有:
( S ∗ g ) ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) = ∑ i = 1 n ∑ d ∣ i f ( d ) g ( i d ) = ∑ i = 1 n ∑ d ∣ i f ( d i ) g ( d ) = ∑ d = 1 n g ( d ) ∑ i = 1 ⌊ n d ⌋ f ( i ) = ∑ d = 1 n g ( d ) S ( ⌊ n d ⌋ ) (S*g)(n)=\sum_{i=1}^n (f*g)(i)\\ =\sum_{i=1}^n \sum_{d|i} f(d)g(\frac{i}{d})\\ =\sum_{i=1}^n \sum_{d|i}f(\frac{d}{i})g(d)\\ =\sum_{d=1}^n g(d) \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} f(i)\\ =\sum_{d=1}^n g(d) S(\lfloor \frac{n}{d} \rfloor) (S∗g)(n)=i=1∑n(f∗g)(i)=i=1∑nd∣i∑f(d)g(di)=i=1∑nd∣i∑f(id)g(d)=d=1∑ng(d)i=1∑⌊dn⌋f(i)=d=1∑ng(d)S(⌊dn⌋)
提出第一项,有 ( S ∗ g ) ( n ) = g ( 1 ) S ( n ) + ∑ d = 2 n g ( d ) S ( ⌊ n d ⌋ ) \displaystyle (S*g)(n)=g(1)S(n)+\sum_{d=2}^n g(d) S(\lfloor \frac{n}{d} \rfloor) (S∗g)(n)=g(1)S(n)+d=2∑ng(d)S(⌊dn⌋)。因而 g ( 1 ) S ( n ) = − ∑ d = 2 n g ( d ) S ( ⌊ n d ⌋ ) + ( S ∗ g ) ( n ) \displaystyle g(1)S(n)=-\sum_{d=2}^n g(d)S(\lfloor \frac{n}{d} \rfloor)+(S*g)(n) g(1)S(n)=−d=2∑ng(d)S(⌊dn⌋)+(S∗g)(n)。通常用线性筛出前 n \sqrt{n} n 个值,然后再使用数论分块递归的去解决。
例如,要求欧拉函数的前缀和,记 S n = ∑ i = 1 n φ ( i ) \displaystyle S_n=\sum_{i=1}^n \varphi(i) Sn=i=1∑nφ(i), ∑ i = 1 n S ( ⌊ n i ⌋ ) = ∑ i = 1 n ∑ i j ≤ n φ ( j ) = ∑ k ≤ n ∑ j ∣ k φ ( j ) = ∑ k ≤ n φ ( j ) ⌊ k j ⌋ = ∑ k = 1 n k \displaystyle \sum_{i=1}^n S(\lfloor \frac{n}{i} \rfloor)=\sum_{i=1}^n \sum_{ij \leq n} \varphi(j)=\sum_{k \leq n} \sum_{j|k} \varphi(j)=\sum_{k\leq n}\varphi(j) \lfloor \frac{k}{j} \rfloor =\sum_{k=1}^n k i=1∑nS(⌊in⌋)=i=1∑nij≤n∑φ(j)=k≤n∑j∣k∑φ(j)=k≤n∑φ(j)⌊jk⌋=k=1∑nk,因而 S ( n ) + S ( n 2 ) + S ( n 3 ) + ⋯ + S ( 1 ) = ∑ k = 1 n k = ( 1 + k ) k 2 \displaystyle S(n)+S(\frac{n}{2})+S(\frac{n}{3})+\cdots+S(1)=\sum_{k=1}^n k=\frac{(1+k)k}{2} S(n)+S(2n)+S(3n)+⋯+S(1)=k=1∑nk=2(1+k)k。此时 S ( n ) = ( 1 + k ) k 2 − ∑ i = 2 n S ( ⌊ n i ⌋ ) \displaystyle S(n)=\frac{(1+k)k}{2}-\sum_{i=2}^n S(\lfloor \frac{n}{i} \rfloor) S(n)=2(1+k)k−i=2∑nS(⌊in⌋),后面这些项就可以在 O ( n ) O(\sqrt{n}) O(n) 内求出,原因在于 ⌊ n i ⌋ \displaystyle \lfloor \frac{n}{i} \rfloor ⌊in⌋ 的值只有根号个。当然一个更加简单的推法是 φ ∗ I = i d \varphi * I= {\rm id} φ∗I=id,其中 i d ( x ) = x {\rm id}(x)=x id(x)=x, I ( x ) = 1 I(x)=1 I(x)=1。