数论
写得很简略,属于自己的推导,以免什么时候忘了结论还可以算出来;
1.欧拉函数:
f(x)表示小于等于x的数中与x互质的数的个数;
一个质数与它以下的都互质,f(x)=x-1
一个质数的幂x^k,f(x^k)=x^k-x^(k-1)=x^(k-1)*(x-1)=x^k*(1-1/x)
欧拉函数是积性函数,唯一分解定理得,
x=p1^q1*p2^q2......*pn^qn
所以f(x)=f(p1^q1)*f(p2^q2)*......f(pn^qn)
f(x)=x*(1-1/p1)*(1-1/p2)*......*(1-1/pn)
很好推导,学会了这个过程也容易理解线筛求欧拉函数;
2.公式
a^f(n)=1 (mod n) a,n互质
a^(p-1)%p=1 p质数
a^b (mod n)=a^(b mod f(n)) (mod n) a,n互质
(p-1)!=-1 (mod p) 素数
3.逆元
用上面的公式,不信求不出来;
有一个有趣的线性求法:
m为质数
m=ka+b
ka+b=0 (mod m)
kb-1+a-1=0(mod m)
a-1=-kb-1(mod m)
a-1=-(m/a)(1/(m%a)) (mod m)
递推即可;
4.中国剩余定理:
x%m1=a1
x%m2=a2
......
x%mn=an
如果mi互质,x=sum(ai*Mi*M-1)
Mi=M/mi
M-1为Mi对mi的乘法逆元;
不互质怎么样?将方程合并;
x%m1=a1 x=m1k1+a1
x%m2=a2 x=m2k2+a2
d=gcd(m1,m2)
m1k1/d=m2k2/d+(a2-a1)/d d|(a2-a1),否则无解
m1k1/d=(a2-a1)/d (mod m2/d)
gcd解一下方程
通解k1=k+r*m2/d
带回去x=m1k1+a1=m1(k+r*m2/d)+a1
x=m1k+m1m2/d*r+a1
x=m1k+a1 (mod lcm(m1,m2))
将所有的方程一一合并即可;
5.bsgs大步小步算法
a^x=b (mod n) n为素数
设m=n^(1/2)
先验证一下a^0-a^m mod n
顺便记录一下a^0-a^m这些值
然后算m+1-2m,如果有解,
必然有a^i*a^m=b mod n
两边乘a^(-m),
则a^i=b*a^(-m) mod n
检查一下a^i这些值中是否有b*a^(-m)这个数,用hash或map都可以;
n不是素数怎么办?
a^x=b mod n
a^x+cn=b
然后将n和一些a消一下,使gcd(a,n)=1;
在用ex_gcd算一下;
然后就可以算了。