比较愚钝,一点点数论花了好长时间才弄明白,小小总结下。
①最大公约数 (辗转相除法)
Function gcd(a,b:longint):longint;
begin
if b=0 then gcd:=a
else gcd:=gcd(b,a mod b);
end;
②最小公倍数
lcm(a,b)*gcd(a,b)=a*b
lcm(a,b)=a*b/gcd(a,b);
③素数表
筛法
④素数测试
Miller-Rabbin测试 :
如 果存在和n互质的正整数a 满足 a^(n-1)=1(mod n) (费马小定理推得),则称n为基于a的伪素数。不断选取不超过 n-1的 基 b (s次),计算是否每次都有 b^(n-1)=1 (mod n)。若每次都成立则几乎可以断定 n为素数。 (摘自《算法艺术与信息学竞 赛》)
⑤扩展欧几里德
如果 d=gcd(a,b) 那么一定存在 x,y 使得 ax+by=d。
Function extended_gcd(a,b:longint;var x,y:longint):longint;
var k:longint;
begin
if b=0 then begin
extended_gcd:=a;
x:=1;y:=0;
end
else begin
extended_gcd:=extended_gcd(b,a mod b,x,y);
k:=x;
x:=y;
y:=k-(a div b)*y;
end;
end;
⑥快速幂(非递归写法)
Function pow(k,q:longint):longint;
begin
pow:=1;
while q<>0 do
begin
if q mod 2=1 then pow:=pow*k;
k:=k*k;
q:=q div 2;
end;
end;
⑦线性模方程
解 ax=c (mod b)
ax+by=c
设 d=gcd(a,b);
则问题有整数解的充要条件为 c mod d=0
令 a=a‘*d , b=b‘*d
则 gcd(a‘,b‘)=1
原方程可化为 a‘x+b‘y=c/d
通过扩展欧几里德解 a‘x‘+b‘y‘=1 得出 x‘和y‘
而 x=x‘*c/d y=y‘*c/d
但这只是其中一组解 mod b条件下所有的解为
xi=x0+i*(b/d) (i=1,2,3,.....,d-1) x0为任意一个解
⑧线性模方程组
解一系列 x=ai (mod bi) (2<=i<=n)
先考虑简单的情况 n=2的时候
即 x=a1 (mod b1);
x=a2 (mod b2);
即 x=a1+b1*y1
x=a2+b2*y2
a1+b1y1=a2+b2y2 --> b1y1-b2y2=a2-a1
很容易的转化成了线性模方程
同样 令 d=gcd(b1,b2);
线性方程组无解的情况即 (a2-a1) mod d<>0
同线性模方程 通过扩展欧几里德解出 y1,y2的值
则x=a1+b1*y1=a2+b1*y2 也就解出了两个方程的解
x的最小非负整数解为 x=((x mod lcm(b1,b2))+lcm(b1,b2))mod lcm(b1,b2);
推广到多个方程组的情况
将两个方程组合并,即: 令两个方程得出的x值为q,
则合并成的新方程为 x=q (mod lcm(b1,b2));
将所有方程两两合并,最终也就得出了最终的答案。
⑨中国剩余定理
同样对于一系列 x=ai (mod bi) (且所有的bi两两互质)
x在模 b1*b2...bn 下有唯一解
b=b1*b2*......*bn
对于每一个bi 求出一个pi,pi=b/bi
且 pi=1 (mod bi)
即求解 pi*xi+bi*yi=1 ,易知 gcd(pi,bi)=1, 扩展欧几里德解之。
而最终的答案即为 X=p1*x1* a1+p2*x2*a2+......+pn*xn*an
⑩乘法逆元
ax=1 (mod b) x存在当且仅当 gcd(a,b)=1
x即为a的乘法逆元
一般在计算模上的除法时,转换为乘上除数的乘法逆元
11.关于计算模上的除法
由费马定理可知,当a,p互质时 a^p=a (mod p)--> a^(p-2)=a^-1 (mod p)
求 (1/a) mod p 即 a^-1 mod p=a^(p-2) (mod p) 所以就求出了 (1/a)mod p
12.处理的模数不是质数又要处理除法
把模数拆成pi^ci的积
分别处理
用中国剩余定理合并解答
13.欧拉函数
φ(n)为小于等于n的数中与n互质的数的数目。
n=p1^q1*p2^q2*p3^q3*...*pk^qk (p为互异的质因数)
φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*...*(1-1/pk)
φ(n)为积性函数 如果 (a,b)=1 then φ(ab)=φ(a)φ(b)
欧拉定理: (a,b)=1 a^φ(b)=1 (mod b)
14.约数和
对与A的约数和
A=p1^k1*p2^k2*...*pn^kn
S = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn)