数论_扩欧

算数基本定理:

每个大于一的自然数均可以写成质数的积。

素数分配定理:

对正实数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 为通解的最小间隔)

扫描二维码关注公众号,回复: 3567101 查看本文章

则 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 后的到的最小正整数解

模板题:http://www.cnblogs.com/hadilo/p/5951091.html

猜你喜欢

转载自blog.csdn.net/qq_42447015/article/details/82918414
今日推荐