模幂运算
#模幂运算
def power(a,n,p) ->int:
ans = 1
while n:
if n & 1:
ans = ans * a % p
a = a * a % p
n >>= 1
return ans
欧几里得定理
#欧几里得定理
def gcd(a,b) -> int:
if a > b:
a,b = b,a
while b:
temp = a % b
a = b
b = temp
return a
扩展欧几里得定理
#扩展欧几里得(递归)
def exgcd(a,b) ->tuple:
if b == 0:
return 1,0,a
x1,y1,q = exgcd(b,a % b)
x,y = y1, (x1 - (a//b) * y1)
return x,y,q
求乘法逆元
#计算 a mod p 的乘法逆元
def inv(a, p)->int:
x,y,_ = exgcd(p,a)
return y % p
中国剩余定理
#中国剩余定理
def CRT(b,m):
#乘积
M = 1
for i in range(len(m)):
M *= m[i]
#求M/mi
Mm = []
for i in range(len(m)):
Mm.append(M // m[i])
#求Mm[i] mod mi 的乘法逆元
Mm_ = []
for i in range(len(m)):
Mm_.append(inv(Mm[i],m[i]))
#求Mi*M'i*bi的累加
y = 0
for i in range(len(m)):
y += (Mm[i] * Mm_[i] * b[i])
y = y % M
return y
扩展中国剩余定理
看到这里的小伙伴是不是有些想法了,那exCRT就交给各位小伙伴们来实现啦