数论

写得很简略,属于自己的推导,以免什么时候忘了结论还可以算出来;

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算一下;

然后就可以算了。

原文地址:https://www.cnblogs.com/chadinblog/p/6044497.html