• 模运算和同余以及欧几里得


    updata on 2020.3.19
    更新了exgcd部分,感觉以前并没有真正理解
    并将crt部分放到了一篇单独的blog感觉以前对crt的学习也不深入

    updata on 2020.3.31
    这部分时间想着重做做数论,然后加入了#2同余部分
    又修改了 exgcd 里的一个笔误

    updata on 2020.4.1-2020.4.5
    断断续续的加入同余结论的部分证明和辗转相除的证明,把欧拉定理放到了积性函数那篇文章并添加证明


    1.取模

    \[a \bmod n= \begin{cases} a-\lfloor \frac{a}{n} \rfloor n& a\geq{0}\\ -(-a \bmod n)& a<0\\ \end{cases} \]

    1.1同余

    \((a-b) \bmod n=0\),则a与b同余:

    \[a\equiv b \pmod n \]

    a,b为正整数时,等价于:

    \[a \bmod n=b \pmod n \]

    1.2性质

    • k为正整数,有:
      \(a \bmod n=(a \bmod kn) \bmod n\)
    • \(k \mid a\),有:
      \(\frac{a}{k} \bmod n=\frac{a \bmod kn}{k}\)

    1.3龟速乘

    加倍求积法

    LL mul(LL a,LL b){
    	LL ret=0;
    	for(;b;b>>=1){
    		if(b&1) ret=(ret+a)%p;
    		if(b>1) a=(a+a)%p;
    	}
    	return ret;
    }
    

    1.4快速幂

    平方求幂法

    LL pow(LL a,LL b){
    	LL ret=1;
    	for(;b;b>>=1){
    		if(b&1) ret=(ret*a)%p;
    		if(b>1) a=(a*a)%p;
    	}
    	return ret;
    }
    

    1.5long double实现64位模乘法

    long double类型在乘爆后只保留前几位,也就是较大几位。除以n后的结果主要为较大几位贡献,所以舍去低位对结果的偏差不大(一以内)
    为防止减出负数,加p再取模

    LL mul(LL a,LL b,LL p){
    	LL q=(long double)a*b/p;
    	return (a*b-q*p+p)%p;
    }
    

    2同余

    总所周知,\(a\equiv b \pmod p\)表示\(a \bmod p=b \bmod p\)

    那么下面给出一些性质,大部分都很好理解,摘自维基百科

    经常用的也就上面这些
    大部分比较显然,然而那个\(n\)次方的我也不会证,就简单证一下最后那个放大缩小模数
    \(a\equiv b\pmod m\),则可设\(a=pm+w,b=qm+w\)
    那么\(ka\bmod km =(kpm+kw)\bmod km=kpm\bmod km+kw\bmod km=w\bmod m\)
    同样,\(kb\bmod km=w\bmod m\)
    又由于上面每一步可逆,所以\(a\equiv b\pmod m\Leftrightarrow ak\equiv bk\pmod {km}\)

    这部分尤其是那个除法原理2,我也没怎么看,先放这里

    关于除法原理1:
    由于\(\gcd(k,m)=1\),那么就是说\(k,m\)的质因数全都互不相同,所以\(a\equiv ka\pmod m\)
    所以上面那个式子更完整可以表述为\(a\equiv b\equiv ka\equiv kb\pmod m\)

    3逆元

    a为整数,n为正整数,若整数b满足:
    \(ab \bmod n=1\)
    则b为a模n的逆元,记为\(a^{-1}\)\(\frac{1}{a}\)

    3.1一些结论

    • 当且仅当\(gcd(a,n)=1\),a模n的逆元存在
    • \(b_1,b_2\)为a模n的逆元,则必有\(b_1 \equiv b_2 \pmod b\)

    即a模n的逆元在模n意义下唯一

    3.2费马小定理

    设p为质数,a为与p互质的整数,则有:

    \[a^{p-1} \equiv 1 (\mod p) \]

    3.2.1证明

    \[1,2,\dots,p-1 \]

    \[a,2a,\dots,(p-1)a \bmod p \to 1,2,\dots,p-1 \]

    (p-1个数\(\bmod p\)意义下互不相同,因为\(a^{-1}\)存在,每个数都乘\(a^{-1}\)会变回原数列)

    \[\prod_{i=1}^{p-1}i \equiv \prod_{i=1}^{p-1}ai \pmod p \]

    \[(p-1)! \equiv a^{p-1}(p-1)! \pmod p \]

    \[(p-1)!((p-1)!)^{-1} \equiv a^{p-1}(p-1)!((p-1)!)^{-1} \pmod p \]

    (p为质数,\(gcd(p,(p-1)!)=1\),所以存在\(((p-1)!)^{-1}\))

    \[1 \equiv a^{p-1} \pmod p \]

    3.2.2通过费马小定理求逆元

    \[a^{p-1} \equiv 1 \pmod p \]

    \[a \cdot a^{p-2} \equiv 1 \pmod p \]

    \[a^{-1} \equiv a^{p-2} \pmod p \]

    从而快速幂算逆元

    3.3预处理逆元

    3.3.1法一

    设i为\([1,n]\)之间的整数,有:
    \(p=\lfloor \dfrac{p}{i} \rfloor i+(p \bmod i)\)
    从而有(放在mod p下后,左边的p等于0):
    \(\dfrac{1}{i} \equiv - \dfrac{\lfloor \frac{p}{i} \rfloor}{p \bmod i} \pmod p\)
    因为\(p \bmod i<i\),可以\(O(n)\)递推算

    3.3.2法二

    由于\(\dfrac{1}{i!}=\dfrac{i+1}{(i+1)!}\),则\(O(\log p)\)算出\(\dfrac{1}{n!}\),再\(O(n)\)算所有的\(\dfrac{1}{i!}\),从而算出\(\dfrac{1}{i}\)

    void niyuan(){//f阶乘数组,h逆元数组,g阶乘的逆元数组 
    	f[0]=1;
    	for(int i=1;i<=n;i++) f[i]=(LL)f[i-1]*i%p;
    	g[n]=pow(f[n],p-2);//根据费马小定理
    	for(int i=n-1;i;i--) g[i]=(LL)g[i+1]*(i+1)%p;
    	for(int i=1;i<=n;i++) h[i]=(LL)g[i]*f[i-1]%p;
    }
    

    3.4欧拉定理

    欧拉定理也可以求逆元
    \(n \geq 2\)为整数,\(gcd(a,n)=1\),则有:
    \(a^{\varphi(n)} \equiv 1 \pmod n\)
    由此可用:
    \(a^{-1} \equiv a^{\varphi(n)-1} \pmod n\)
    求出逆元,但计算\(\varphi(n)\)的复杂度较高,一般不这么用
    更详细的欧拉定理看这里

    4欧几里得算法

    4.1欧几里得

    这个东西说的是\(\gcd(a,b)=\gcd(b,a\bmod b)\),然后就可以递归的求解\(\gcd(a,b)\)

    \(d=\gcd(a,b)\)
    则可以令\(a=nd,b=md\),那么\(a-b=(n-m)d\)
    又由于\(\gcd(n,m)=1\Rightarrow \gcd(n-m,m)=1\)(为什么这样下面说),所以\(\gcd(a,a-b)=\gcd(nd,(n-m)d)=1\)
    那么,当\(a\ge b\),就可以让\(a\)不断减\(b\)直到\(a<b\),就等价于\(a\bmod b\)

    \(\gcd(n-m,m)=k\),同样可以这样表示:\(n-m=pk,m=qk\)
    那么,\(a=nd=(pk+qk)d,b=md=qkd\)
    此时,又因为\(\gcd(a,b)=\gcd((pk+qk)d,qkd)=d\)
    所以\(\gcd((p+q)k,qk)=1\),那么显然\(k=1\)

    4.2扩展欧几里得算法

    此方法可以求解\(ax+by=\gcd(a,b)\)中的\(x,y\)
    考虑这个问题,如果\(b=0\),那么显然,\(\gcd(a,b)=a,x=1,y\)为任意数
    如果\(b\neq 0\),我们设:
    \(\gcd(a,b)=ax_1+by_1\)
    \(\gcd(b,a\bmod b)=bx_2+(a\bmod b)y_2=bx_2+(a-\lfloor\dfrac{a}{b}\rfloor b)y_2\)
    \(ax_1+by_1=ay_2+b(x_2-\lfloor \dfrac{a}{b}\rfloor y_2)\)
    所以:\(x_1=y_2,y_1=x_2-\lfloor \dfrac{a}{b}\rfloor y_2\)
    可以据此写出代码

    这样可以求模数不为质数的逆元

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

    5中国剩余定理

    此部分新开了一篇blog讲,原来讲的并不清楚

  • 相关阅读:
    C#中using的使用-以FileStream写入文件为例
    C#中FileStream的对比以及使用方法
    DevExpress的TextEdit、RadioGroup、ColorPickEdit设置默认值
    DevExpress的TextEdit限制输入内容的格式,比如只能输入数字
    CS中委托与事件的使用-以Winform中跨窗体传值为例
    Winforn中怎样在窗体中打开另一个窗体
    Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)
    Winform中实现ZedGraph的多条Y轴(附源码下载)
    《深入理解Java虚拟机》内存分配策略
    三十而立
  • 原文地址:https://www.cnblogs.com/suxxsfe/p/12527185.html
Copyright © 2020-2023  润新知