Math

数论

模运算

a%b = a - [a/b] * b;
(b > 0)
“=”表示同余
a = b, a = c => b = c;
a = b => a+c = b+c;
a = b && c = d => a + c = b + d;


最大公因数gcd

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

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

方程:ax + by = c (a,b,c均为整数,求x,y的整数解)
核心思路:在求gcd的末状态求出\(x_末,y_末\),又因为有个天才脑洞大开发现可以顺着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 - \({\lfloor a / b \rfloor}\) * b)*y';(gcd的递归转移)
整理一下:x = x' + \({\lfloor a / b \rfloor}\) * y', y = x'/
递归回去可得一组x/k,y/k的整数解, 再乘上k就是一组x,y的特解/

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

\(ax_1 + by_1 = c\)
\(ax_2 + by_2 = c\)
\(∴a(x_1 - x_2) = b(y_2 - y_1)\)
\(两边同除gcd(a,b),得a'(x_1 - x_2) = b'(y_2 - y_1),此时a'与b'互质\)
\(∴(x_1 - x_2) = k * b', (y_2 - y_1) = k * a'\)
\(整理一下:x_1 = k * b' + x_2,y_1 = y_2 - k * a'(k为任意, x_2,y_2为特解,x_1,y_1为通解)\)
代码:

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,\(m_i\) = M / \(p_i\)
x = $\sum_{i=1}^n y_i m_i * m_i^{-1} $ + KM(K是任意数,x有无数个)
逆元用exgcd求


Miller_Rabin 判断素数

if(\(a^{p-1} = 1(mod p)\)) p大概率为质数
\(x^2\) = 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 = (\(p1^2\) + c) mod n
其中c为随机常数。
出现循环了怎么办?换一个随机常数c再搞。\

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


积性函数

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

拉格朗日插值

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

\[f(x_1) = y_1\\ f(x_2) = y_2 \\ ...\\ f(x_{n+1})= y_{n+1} \]

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

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

$ \begin{cases}
L_i(x_i)=y_i\
L_i(x_j)=0\ \ \ (i\not=j)
\end{cases}$

可以考虑先构造 \(L_i'(x)\),使其满足

$ \begin{cases}
L_i(x_i)=1\
L_i(x_j)=0\ \ \ (i\not=j)
\end{cases} \( 那么 \)L_i=y_iL_i'$

可以得出 \(L_i'(x)\) 可以是下面的多项式:

\(\frac{\prod\limits^{n+1}_{j=1}{(x-x_j)(i\neq j)}}{\prod\limits^{n+1}_{j=1}{(x_i-x_j)(i\neq j)}}\)

(如果把\(x_j(i \neq j)\)带进去,分母出现0, 如果把\(x_i\)带进去,分子等于分母,即\(L_i'(x_i) = 1\))

那么 \(L_i(x)\) 就应该是\(y_iL_i'\):

\(yi\frac{\prod\limits^{n+1}_{j=1}{(x-x_j)(i\neq j)}}{\prod\limits^{n+1}_{j=1}{(x_i-x_j)(i\neq j)}}\)

因为 \(L=\sum\limits^{n+1}_{i=1}{L_i}\),所以 \(L(x)\) 应该为:

\(\sum\limits^{n+1}_{i=1}{(y_i{\frac{\prod\limits^{n+1}_{j=1}{(x-x_j)(i\neq j)}}{\prod\limits^{n+1}_{j=1}{(x_i-x_j)(i\neq j)}}})}\)

复杂度:\(O(n^2)\)

特别的,如果 \(x_i + 1 = x_{i+1}\), 求\(L(x)\)的值时

\(L_i'(x)\) 分母可表示为

\[(-1)^{(n+1)-i}!(i - 1) !((n+1) - i) \]

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

\[(x-x_1)^{\underline {n+1}} / (x - x_i) \]

再带回即可

复杂度:O(n)

posted @ 2024-11-25 19:27  花子の水晶植轮daisuki  阅读(2)  评论(0编辑  收藏  举报
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js