算数基本定理:
每个大于一的自然数均可以写成质数的积。
素数分配定理:
对正实数x,定义π(x)为素数计数函数,即不大于x的素数个数,则有
π(x)≈x/lnx (这样算大概10000内有100个素数)
第n个素数p(n)的渐进估计 p(n)~nlnn
(这样估计第一万个质数在9万左右)
Euclid第一定理 素数p,p|ab,那么p|a或者p|b。
bezout(贝祖)定理:
对于任何整数a、b和他们的最大公约数d,关于未知数x和y的线性丢番图方程:
ax+by=m
有整数解时当且仅当m是d的倍数。且bezout等式有解时必然有无穷多个整数解,可以使用扩欧求出其中一组解。
扩欧模板:
(返回(a,b)并将一组满足ax+by=(a,b)的(x,y)保存在xx和yy中)
int exgcd(int a,int b,int &x,int &y)
{
int t ;
if (!b) {x=1;y=0;return a;}
t=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return t;
}
exgcd 解线性同余方程
关于 x 的模方程 ax%b=c 的解
方程转换为 ax+by=c 其中 y 一般为非正整数
则问题变为用 exgcd 解不定方程
解得 x1=x0*c/r
通解为 x=x1+b/r*t
设 s=b/r (已证明 b/r 为通解的最小间隔)
则 x 的最小正整数解为 (x1%s+s)%s
证明:
若 x1>0,则 (x1%s+s)%s=x1%s%s+s%s=x1%s=x1-ts (t∈N)
若 x1<0,因在 C++ 里 a%b=-(-a%b)<0 (a<0 , b>0) 如 -10%4=-2
则 (x1%s+s)%s=(-(-x1%s)+s)%s=(-(ts-x1)+s)%s=ts-x1 (t∈N)
即为 x1 通过加或减上若干个 s 后得到的最小正整数解
得证
亦可伪证 x1<0 的情况:设 x1=-5 , s=2
则 (x1%s+s)%s=(-5%2+2)%2=(-1+2)%2=3%2=1
即为 x1 加上 3 个 s 后的到的最小正整数解