扩展中国剩余定理
一般的中国剩余定理只能解决模数互质的情况。扩展中国剩余定理可以解决模数不互质的情况。
考虑依次将
n
n
n个方程合并起来。设前面合并起来的方程是
x
=
m
u
k
u
+
a
u
x=m_uk_u+a_u
x=muku+au,当前枚举到的方程是
x
=
m
v
k
v
+
a
v
x=m_vk_v+a_v
x=mvkv+av,则联立得到(
x
x
x的符号可忽略)
m
u
k
u
+
m
v
k
v
=
a
u
−
a
v
m_uk_u+m_vk_v=a_u-a_v
muku+mvkv=au−av
使用扩展欧几里得,求出最小正整数解
k
u
′
k_u'
ku′和
k
v
′
k_v'
kv′。那么我们合并得到的方程就是
x
=
l
c
m
(
m
u
,
m
v
)
k
+
m
u
k
u
′
+
a
u
x=\rm lcm(m_u,m_v)k+m_uk_u'+a_u
x=lcm(mu,mv)k+muku′+au
这样合并到最后就能得到答案。
long long cm = m[0], ca =a[0];
for(int i = 1; i < n; i++) {
long long d, x, y, dela = (a[i]-ca%m[i]+m[i])%m[i];
exgcd(cm, m[i], d, x, y);
if(dela % d) {
printf("You've got no electricity, I come to your house!\n");
return 0;
}
long long sol = qmul(x, dela/d, m[i]/d);
ca += sol * cm;
cm *= m[i] / d;
ca = (ca%cm+cm)%cm;
}
return ca;
//2019.3.14 // mod = 苯酚醛
20180929UPD:由
m
1
k
1
=
a
2
−
a
1
+
m
2
k
2
m_1k_1=a_2-a_1+m_2k_2
m1k1=a2−a1+m2k2
两边同时除以
gcd
(
m
1
,
m
2
)
\gcd(m_1,m_2)
gcd(m1,m2),令其为
G
G
G(注意判断是否
a
2
−
a
1
∣
G
a_2-a_1|G
a2−a1∣G,不成立则方程无解)。令
A
=
a
2
−
a
1
G
A=\frac{a_2-a_1}{G}
A=Ga2−a1。
m
1
G
k
1
=
A
+
m
2
G
k
2
\frac{m_1}{G}k_1=A+\frac{m_2}{G}k_2
Gm1k1=A+Gm2k2
m
1
G
k
1
=
A
(
m
o
d
m
2
G
)
\frac{m_1}{G}k_1=A \pmod{\frac{m_2}{G}}
Gm1k1=A(modGm2)
k
1
=
A
⋅
i
n
v
(
m
1
G
,
m
2
G
)
(
m
o
d
m
2
G
)
k_1=A \cdot inv(\frac{m_1}{G},\frac{m_2}{G})\pmod{\frac{m_2}{G}}
k1=A⋅inv(Gm1,Gm2)(modGm2)
k
1
=
A
⋅
i
n
v
(
m
1
G
,
m
2
G
)
+
m
2
G
⋅
k
′
k_1=A \cdot inv(\frac{m_1}{G},\frac{m_2}{G})+\frac{m_2}{G}\cdot k'
k1=A⋅inv(Gm1,Gm2)+Gm2⋅k′
最后将
k
1
k_1
k1代为
x
−
a
1
m
1
\frac{x-a_1}{m_1}
m1x−a1
x
=
A
⋅
i
n
v
(
m
1
G
,
m
2
G
)
⋅
m
1
+
a
1
(
m
o
d
m
1
m
2
G
)
x=A\cdot inv(\frac{m_1}{G},\frac{m_2}{G})\cdot m_1+a_1 \pmod{\frac{m_1m_2}{G}}
x=A⋅inv(Gm1,Gm2)⋅m1+a1(modGm1m2)
这就是合并后的方程。
扩展Lucas定理
Lucas定理只能解决模数是质数的情况。事实上很多扩展定理都是将质数推广到非质数而来的。扩展Lucas定理可以解决模数为任意正整数的问题,复杂度为 O ( p t ) O(p^t) O(pt),其中 p t p^t pt是模数分解为的质因数的幂。
首先学习求
n
!
m
o
d
  
p
t
n!\mod p^t
n!modpt。将乘数中将
p
p
p的倍数提出来,除以倍数后依然是阶乘形式,因此这一部分可以递归计算。而其它部分按值域每
(
p
−
1
)
p
t
−
1
(p-1)p^{t-1}
(p−1)pt−1分为一组,它们对
m
o
d
  
p
t
\mod p^t
modpt是同余的,因此计算一组即可,复杂度
O
(
p
t
)
O(p^t)
O(pt)。
举例说明,模数为
3
2
时
,
3^2时,
32时,
25
!
≡
3
8
×
8
!
×
(
1
×
2
×
4
×
5
×
7
×
8
)
3
×
25
25!\equiv3^8\times 8!\times (1\times2\times4\times5\times7\times8)^3\times 25
25!≡38×8!×(1×2×4×5×7×8)3×25。
然后就可以计算
C
n
m
m
o
d
  
p
t
C_n^m\mod p^t
Cnmmodpt了。
回到原问题,我们将模数质因数分解为
∏
p
i
t
i
\prod p_i^{t_i}
∏piti,设答案为
a
n
s
ans
ans,则我们得到若干个同余方程
a
n
s
≡
C
n
m
(
m
o
d
  
p
i
t
i
)
ans\equiv C_n^m(\mod p_i^{t_i})
ans≡Cnm(modpiti)。使用上述方法算出系数,然后中国剩余定理合并即可。
扩展BSGS
求
a
x
≡
b
(
m
o
d
  
m
)
a^x\equiv b(\mod m)
ax≡b(modm),
m
m
m为任意正整数。
因为要求
a
−
1
m
o
d
  
m
a^{-1}\mod m
a−1modm,所以在
gcd
(
a
,
m
)
=
1
\gcd(a,m)=1
gcd(a,m)=1时才能用BSGS解。考虑转化成这个形式。
原方程化为
a
x
−
1
a
gcd
(
a
,
m
)
≡
b
gcd
(
a
,
m
)
(
m
o
d
  
m
gcd
(
a
,
m
)
)
a^{x-1}\frac{a}{\gcd(a,m)}\equiv \frac{b}{\gcd(a,m)}(\mod \frac{m}{\gcd(a,m)})
ax−1gcd(a,m)a≡gcd(a,m)b(modgcd(a,m)m)。将
a
gcd
(
a
,
m
)
\frac{a}{\gcd(a,m)}
gcd(a,m)a等看作系数,递归计算直到
gcd
(
a
,
m
)
=
1
\gcd(a,m)=1
gcd(a,m)=1。然后反带回去即可。答案
=
x
+
递
归
次
数
=x+递归次数
=x+递归次数。
upd on 2019.1.13
设
d
=
gcd
(
a
,
p
)
d=\gcd(a,p)
d=gcd(a,p),则当
d
∣
p
d|p
d∣p时有解。每次
p
p
p会除以一个数,因此最多递归
O
(
log
p
)
O(\log p)
O(logp)次。每次
a
a
a的次数会减少
1
1
1,因此最后求出的是
x
−
递
归
次
数
x-递归次数
x−递归次数。注意答案有可能小于递归次数,因此还要枚举小于等于递归次数的答案判断是否合法。
原根 指标
在模
p
p
p意义下的原根
g
g
g有以下性质:
原根个数
=
φ
(
φ
(
p
)
)
=\varphi(\varphi(p))
=φ(φ(p));
g
i
≡
g
j
(
m
o
d
  
p
)
⇔
i
≡
j
(
m
o
d
  
φ
(
p
)
)
g^i\equiv g^j(\mod p)\Leftrightarrow i\equiv j(\mod\varphi(p))
gi≡gj(modp)⇔i≡j(modφ(p));
指标的定义:
g
i
n
d
(
x
)
≡
x
g^{ind(x)}\equiv x
gind(x)≡x;
由此,
x
k
(
m
o
d
  
p
)
x^k(\mod p)
xk(modp)可转化为
i
n
d
(
x
)
⋅
k
(
m
o
d
  
φ
(
p
)
)
ind(x)\cdot k(\mod\varphi(p))
ind(x)⋅k(modφ(p))。
求指标用BSGS,将指标还原用快速幂。
原根的求法
设模数为
p
p
p,将
φ
(
p
)
\varphi(p)
φ(p)分解为
∏
P
i
t
i
\prod P_i^{t_i}
∏Piti。从
2
2
2开始枚举
g
g
g,如果有
g
φ
(
p
)
P
i
≡
1
(
m
o
d
  
p
)
g^{\frac{\varphi(p)}{P_i}}\equiv1(\mod p)
gPiφ(p)≡1(modp)满足则不是原根,否则找到一个原根。
如果广义黎曼猜想成立,
g
g
g取到
log
log
log
log
log
log
n
\log\log\log\log\log\log n
loglogloglogloglogn规模时即可找到一个原根。由一个数的质因数个数是
log
n
log
log
n
\frac{\log n}{\log \log n}
loglognlogn,总复杂度为
log
n
×
log
log
log
log
log
log
n
log
log
n
\frac{\log n\times\log\log\log\log\log\log n}{\log \log n}
loglognlogn×loglogloglogloglogn,该算法的瓶颈在于分解质因数。
二次剩余
本季度内
from **999
已隐藏