Math

数论

模运算和同余

定义模运算(mod) :a%b=a[a/b]b;(b>0)
定义同余 :若 abmod mm|(ab)
(注:下文省略mod m)
自反性:aa
对称性:若 abba
传递性:若 abacbc;
可加性:若 aba+cb+c;
更牛的可加性 :若 ab 并且 cda+cb+d;
可乘性:若 ab, 且 cd,则 acbd
可除性:若 ab, 且 模数m与c同余,则 a/cb/c

最大公因数gcd求法(辗转相除法)

int gcd(int a, int b){
    return !b ? a : gcd(b, a%b);
}

exgcd(用于解不定方程和求非质数意义下的逆元):

方程:ax + by = c (a,b,c均为整数,求x,y的整数解)
核心思路:在求gcd的末状态求出xy,又因为有个天才脑洞大开发现可以顺着gcd递归回去,于是可以求出一组x,y的特解,再找通解的表达。

具体做法:
当c 不是 gcd(a,b) 的倍数,时无x,y整数解
否则:ax + by = k * gcd,可先求出x/k,y/k
gcd末状态:
a = gcd, b = 0。此时x=1,y
gcd的转移方法是:ax + by = gcd = bx' + (a - a/b * b)*y';(gcd的递归转移)
整理一下:x = x' - a/b * y', y = x'
递归回去可得一组x/k,y/k的整数解, 再乘上k就是一组x,y的特解/

接下来就是求通解:
先令有解{x1,y1}{x2,y2}

ax1+by1=c
ax2+by2=c
a(x1x2)=b(y2y1)
gcd(a,b)a(x1x2)=b(y2y1)ab
(x1x2)=kb,(y2y1)=ka
x1=kb+x2y1=y2kak,x2,y2x1,y1)
代码:

void exgcd(long long a, long long b){
	if(b == 0) {
		x = 1;
		y = 0;
		gcd = a;
		return ;
	}
	exgcd(b, a % b);
	tmp = x, x = y, y = tmp - (a/b) * y;
}

用exgcd求逆元:ax = 1 (mod p) => ax = 1 + pk => ax - pk = 1,然后就可以开始解不定方程了。


中国剩余定理:

条件:(所有p为质)
题目:
x = y1(mod p1)
x = y2(mod p2)
…………
x = yn(mod pn)
令 M = Πp,mi = M / pi
x = i=1nyimimipi2 + K*M(K是任意数,x有无数个)
如果p不都是质数,只是两两互质,逆元用exgcd求。


Miller_Rabin 判断素数

if(ap1=1(modp)) p大概率为质数
x2 = 1 (mod p) => x = -1 或 1
当指数b为奇数或者a^b = -1时可以默认p为质数
否则一直循环
把前12个质数做为底数a来试验可判断264以内的质数\ (注意:第一次要特判,只有ab==1时成立)


Pollard Rho 分解最大质因数算法

Pollard Rho算法分解一个数n的过程大体上是这样子的:\

1、找到一个数p,使得p|n,将n分解为p与n/p
2、如果p或n/p不为质数,将其带入递归上述过程
3、如果其是质数,将其记录并退出\

找p的过程是这个样子:\

1、找到一个数p1
2、通过某种玄学推导手段找出一个与p1对应的p2
3、gcd(|p1-p2|,n)不是1或n时,此数为所求的p\

玄学推导手段:\

p2 = (p12 + c) mod n
其中c为随机常数。
出现循环了怎么办?换一个随机常数c再搞。\

判环用floyd判圈算法搞定。
代码、例题:P4718


积性函数

f(ab) = f(a)f(b) (如果只有a,b互质时才成立,狭义积性函数)
例如φ函数

拉格朗日插值

拉插作用
已知n+1个点值,即

f(x1)=y1f(x2)=y2...f(xn+1=yn+1

求n次多项式 f ,(或求f(x)的值)\

Li(x) 是一个 n 次多项式,且满足

{Li(xi)=yi Li(xj)=0   (ij)

可以考虑先构造 Li(x),使其满足

$ {Li(xi)=1 Li(xj)=0   (ij) L_i=y_iL_i'$

可以得出 Li(x) 可以是下面的多项式:

j=1n+1(xxj)(ij)j=1n+1(xixj)(ij)

(如果把xj(ij)带进去,分母出现0, 如果把xi带进去,分子等于分母,即Li(xi)=1)

那么 Li(x) 就应该是yiLi:

yij=1n+1(xxj)(ij)j=1n+1(xixj)(ij)

因为 L=i=1n+1Li,所以 L(x) 应该为:

i=1n+1(yij=1n+1(xxj)(ij)j=1n+1(xixj)(ij))

复杂度:O(n2)

特别的,如果 xi+1=xi+1, 求L(x)的值时

Li(x) 分母可表示为

(1)(n+1)i!(i1)!((n+1)i)

分子可以表示为 (???)

(xx1)n+1/(xxi)

再带回即可

复杂度:O(n)

安利一篇很牛的博客

posted @   花子の水晶植轮daisuki  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js
点击右上角即可分享
微信分享提示