「学习笔记」联赛数论再学习

原来联赛是考数论的...

好像很多甚至是全部没有给证明,因为大部分我找到的能看懂的证明都觉得证的不大对,有的是证了充分没有证必要,有的是太过冗余不适合整理。


一些定义和结论

剩余类:记模 (m)(r)(rin [0,m)))的自然数组成的集合为 (k_r),则 (k_r) 为模 (m) 的一个剩余类,任意 (amod m=r),称 (a)(k_r) 的一个代表元。

完系:在每个 (k_r) 中任取一个代表元为模 (m) 的一个完系。

缩系/简化剩余系:对于每一个与 (m) 互质的 (r),在 (k_r) 中任取一个代表元为模 (m) 的一个缩系。若 (xperp m),则将 (m) 的一个缩系中每个数都乘 (x) 后,仍然为 (m) 的一个缩系。

裴蜀定理(ax+by=c,xin mathbb{Z}^*,yin mathbb{Z}^*) 有整数解的充要条件是 (gcd (a,b)|c)

费马小定理:若 (gcd(a,m)=1),则 (a^{m-1}equiv 1pmod m)

欧拉定理:若 (gcd(a,m)=1),则 (a^{varphi(m)}equiv 1pmod m)

扩展欧拉定理(a^{b}equiv a^{b mod varphi(m)+varphi(m)}pmod m)

Lucas 定理

[inom{n}{m}=inom{left lfloor n/p ight floor }{left lfloor m/p ight floor }inom{nmod p}{mmod p}pmod p ]

欧几里得算法(辗转相除法)

[gcd(a,b)=gcd(b,amod b) (b eq 0) \ gcd(a,0)=a ]

Stein算法

(a,b) 均为偶数时:(gcd(a,b)=2gcd(a/2,b/2))

(a) 为偶数,(b) 为奇数时:(gcd(a,b)=gcd(a/2,b))

(a) 为奇数,(b) 为偶数时:(gcd(a,b)=gcd(a-b,b)).((a>b)

扩展欧几里得算法(exgcd)

求解下面这个不定方程:

[ax+by=c ]

利用裴蜀定理判断有无解,若有解必有 (gcd(a,b)|c)

先求解 (ax+by=gcd(a,b))

把后面的 (gcd(a,b)) 辗转相除一下再写成类似的形式(这里的 (x',y') 是对应 (gcd(b,amod b))(x,y),和上面的 (x,y) 没有关系):

[ax+by=gcd(a,b)=gcd(b,amod b)=bx'+(a-leftlfloorfrac{a}{b} ight floor b)y' \ ax+by=bx'+(a-leftlfloorfrac{a}{b} ight floor b)y' ]

因为要求解 (x,y),所以假设我们已经求解了 (x',y'),则要按 (a,b) 把两个方程分开。

[ax+by=ay'+b(x'-leftlfloor frac{a}{b} ight floor y') ]

递归求解得到 (x',y') 后,对比系数可得 (x=y',y=(x'-leftlfloor frac{a}{b} ight floor y'))

这样递归就能求出 (ax+by=gcd(a,b)) 一组特解了,最后当 (b=0) 的时候递归终止,此时 (ax+by=gcd(a,b)) 的解是 (x=1,y=0)

void exgcd(int a, int b, int &x, int &y) {
	if(!b) { x = 1, y = 0; return ; }
	exgcd(b, a % b, x, y);
	int nx = y, ny = x - (a / b) * y;
	x = nx, y = ny;
}

(d=gcd(a,b))

求出 (ax+by=d) 的一组特解 (ax_0+by_0=d),则有 (afrac{x_0c}{d}+bfrac{y_0c}{d}=c),记作 (ax_1+by_1=c)

其通解为 (a(x_1+kfrac{b}{gcd(a,b)})+b(y_1-kfrac{a}{gcd(a,b)}))

充分性显然,这个必要性先不证了因为我不会

扩展中国剩余定理

合并两个一元线性同余方程:

[left{egin{matrix} xequiv a_1pmod {m_1} \ xequiv a_2pmod{m_2} end{matrix} ight. ]

(a_1+k_1m_1=a_2+k_2m_2),整理得 (k_1m_1-k_2m_2=a_2-a_1),用裴蜀定理判断有无解,否则 exgcd 求出一组解 ((p,q)),则原来两个方程可以合并成 (xequiv a_1+m_1ppmod {mathrm{lcm}(m_1,m_2)}),这样子合并为什么是最优的,就先不证了因为我不会

为了防止爆精度,exgcd 求解出的使用最小非负整数解。

原文地址:https://www.cnblogs.com/do-while-true/p/15374136.html