zoukankan      html  css  js  c++  java
  • 数论整理

    来自扶苏的整理授权

    代码出门左转

    NOIP数论内容整理

    一、整除:

    对于(a,b~in~Z),若(exists~k~in~Z),(s.t.~b~=~k~ imes~a),则说(a)整除(b),记做(a~|~b)

    二、带余除法:

    (~forall~a,b~in~z)存在且仅存在唯一的(q,r~in~Z)(s.t.~b~=~q~ imes~a+r),其中(r~in~[0,a))。记做(r~=~b~Mod~a)

    三、公约数

    (a,b~in~Z),若(~exists~k,x,y~in~Z^*)(s.t.~a~=k~ imes~x,b~=~k~ imes~y),则说(k)(a,b)的公约数。公倍数同理。

    四、(gcd)(lcm)

    (a,b)的最大公约数为(gcd(a,b)),最小公倍数为(lcm(a,b))

    五、最大公约数与最小公倍数乘积性质定理

    性质:(a~ imes~b=gcd(a,b)~ imes~lcm(a,b))

    六:最大公约数的求取:

    (以下不妨设(b~leq~a))

    更相减损术:(gcd(a,b)~=~gcd(b,a-b))

    欧几里得算法:(gcd(a,b)~=~gcd(b,a~Mod~b))

    其中,更相减损术的复杂度是(O(n)),欧几里得算法的复杂度是(O(logn))。其中(n~=~max(a,b))

    七:更相减损术的优化

    引理:(forall~m~ eq~0,~a,b~in~Z),有(m~ imes~gcd(a,b)=gcd(ma,mb))

    (a,b)是两个偶数时,显然(gcd(a,b))有一因数(2)。于是(gcd(a,b)~=~2~ imes~gcd(frac{a}{2},frac{b}{2}))

    (a,b)一奇一偶的时候,不妨设(a)是偶数。显然(gcd(a,b))不含因子(2)。于是有(gcd(a,b)=gcd(frac{a}{2},b))

    (a,b)同为奇数时,直接应用更相减损术。(gcd(a,b)=gcd(b,a-b))

    考虑两个奇数相减答案显然是偶数。于是一次更相减损术显然对应一个数除以2的操作。即更相减损的次数与除以二的操作次数同阶。考虑一个数最多被除(log)次。于是该算法的复杂度为(O(logn))

    该算法常用在对两个高精度数求(gcd),因为两个高精度数做除法的复杂度难以承受,从而应用该算法。

    例题:

    给定一个序列,要求支持区间加法。多次查询区间内所有数字的(gcd)(n,m,a_i~leq~10^5)

    Solution:

    因为区间加法无法维护(gcd),所以显然不能暴力线段树。考虑对原序列做差分。由更相减损定理,显然成立(gcd(a,b,c)~=~gcd(a,b-a,c-b))。于是差分后区间加法改为单点修改操作。于是一次操作的复杂度为(O(log^2n))。总时间复杂度为(Oleft(mlog^2n ight)),可以通过本题。

    八、扩展欧几里得算法

    裴蜀定理:关于(x,y)的方程(ax+by=c)有解当且仅当(gcd(a,b)|c)

    求关于(x,y)的方程(ax+by=c)的一组整数解。

    不妨设(c=gcd(a,b))。否则左侧乘一常数(k),不失一般性

    根据欧几里得算法,有

    [gcd(a,b)=gcd(b,a~Mod~b) ]

    于是有$$ax+by=gcd(a,b)=gcd(b,a~Mod~b)=bx_0+(a~Mod~b)y_0$$

    于是有

    [egin{align} ax+by & = bx_0+(a-leftlfloorfrac{a}{b} ight floor~ imes~b)y_0\ & = ay_0+b(x_0-leftlfloorfrac{a}{b} ight floor~y_0) \ end{align} ]

    根据对应系数相等,显然有(x=y_0,y=x_0-leftlfloorfrac{a}{b} ight floor~y_0)。考虑他的一组特解:当(b=0)时,显然(x=1,y=0)成立。

    求上述方程的所有解

    假设求出的该方程的一组特解(x=x_0,y=y_0),则该方程的所有解为(x=x_0+frac{k~ imes~b}{gcd(a,b)},y=y_0-frac{k~ imes~a}{gcd(a,b)})

    九、埃拉托色尼筛法:

    对每个数只筛掉它的倍数。

    int pcnt;
    int prime[maxn];
    bool is_not_prime[maxn];
    
    void Get_Prime(int x) {
    	is_not_prime[1]=true;
    	for(int i=1;i<=x;++i) if(!is_not_prime[i]) {
    		prime[++pcnt]=i;
    		for(int j=i*i;j<=x;j+=i;) is_not_prime[j]=true;
    	}
    }
    

    十:欧拉筛法

    对每个数只被他的最小素因子筛掉

    int pcnt;
    int prime[maxn];
    bool is_not_prime[maxn];
    
    void Get_Prime(int x) {
    	is_not_prime[1]=true;
    	for(int i=2;i<=x;++i) {
    		if(!is_not_prime[i]) prime[++pcnt]=i;
    		for(int j=1;j<=pcnt;++j) {
    			if(i*prime[j]>x) break;
    			is_not_prime[i*prime[j]]=true;
    			if(!(i%prime[j])) break;
    		}
    	}
    }
    

    十一:在(O(nlogn))时间内筛除(n)以内所有数的素因子

    对于每个数记录自己的最小素因子。对于第每个数,迭代将每个数除以自己的最小素因子。

    int pcnt;
    int prime[maxn],pre[maxn];
    bool is_not_prime[maxn];
    
    void Get_Prime(int x) {
    	is_not_prime[1]=true;
    	for(int i=2;i<=x;++i) {
    		if(!is_not_prime[i]) prime[++pcnt],pre[i]=pcnt;
    		for(rg int j=1;j<=pcnt;++j) {
    			if(i*prime[j] > x) break;
    			is_not_prime[i*prime[j]]=true;
    			pre[i*prime[j]]=j;
    			if(!(i%prime[j])) break;
    		}
    	}
    }
    
    void ans(int x) {
    	for(int i=1;i<=x;++i) {
    		printf("%d:",i);
    		int di=i;
    		while(di != 1) printf("%d",prime[pre[di]]),di/=prime[pre[di]];
    		putchar('
    ');
    	}
    }
    

    十二、唯一分解定理:

    (forall~x~in~Z),存在且仅存在一个形如(x=p_1^{c_1}~p_2^{c_2}~...~p_k^{c_k})的等式。其中满足(p_i ~<~p_{i+1},p_i)为质数,(c_i~in~Z)

    则对于(a,b)(gcd,lcm),其唯一分解式对应位置的指数取(min,max)即为对应的(gcd,lcm)的唯一分解式

    十三、欧拉phi函数:

    定义:(phi(x))([1,n))中与(n)互质的数的个数

    (phi(x)~=~n~(1-frac{1}{p_1})(1-frac{1}{p_2})...(1-frac{1}{p_k}))

    其中(p_i)(n)的唯一分解式对应底数。

    证明:不妨设(n)只有(p,q)两个因数。否则做数学归纳

    则与(n)互质的数的个数为(n)减去(p)的倍数和(q)的倍数。根据容斥原理,应加回((pq))的倍数。即

    [egin{align} phi(x) & = ~n-frac{n}{p}-frac{n}{q}+frac{n}{pq}\ & = ~nleft(1-frac{1}{p}-frac{1}{q}-frac{1}{pq} ight)\ & = ~nleft(1-frac{1}{p} ight) left(1-frac{1}{q} ight) end{align} ]

    对于(n)有更多因数的情况,可以依据唯一分解定理做数学归纳。证毕。

    求单个数字的(phi)函数:

    暴力枚举质因数。复杂度(O(sqrt{n}))

    埃拉托色尼筛法:

    对每个质数,修改他的倍数的(phi)函数值

    int pcnt;
    int prime[maxn],phi[maxn];
    bool is_not_prime[maxn];
    
    void euler(int x) {
        for(int i=1;i<=x;++i) phi[i]=i;
        for(int i=2;i<=x;++i) if(!is_not_prime[i]) {
            prime[++pcnt]=i;phi[i]=i-1;
            for(rg int j=i*i;j<=x;j+=i) {
                is_not_prime[j]=true;
                phi[j]=phi[j]/i*(i-1);
            }
        }
    }
    
    欧拉筛:

    对每个数,只被他的最小质因子筛掉。

    考虑通过一个质因子求出他的欧拉函数值。

    引理:(forall x)为质数,显然(phi(x)=x-1)

    定理一:(forall~x~in~Z,p|x),若(frac{x}{p})(p)不互质,则(phi(x)=phi(frac{x}{p})~ imes~p)

    证明:

    不妨设 (x) 有且仅有 (p,q) 两个质因子,否则对(q)做数学归纳,不失一般性

    (q~=~frac{x}{p})

    于是由容斥原理有

    [phi(x)~=~x~-~frac{x}{p}~-~frac{x}{q}~+~frac{x}{pq} ]

    [phi(frac{x}{p})~=~frac{x}{p}~-frac{x}{p^2}~-~frac{x}{pq}+~frac{x}{p^2q} ]

    上式除以下式,得

    [frac{phi(x)}{phifrac{x}{p}}=p ]

    移项整理后,原式得证。

    证毕。

    定理二:(forall~x~in~Z,p|x),若(frac{x}{p})(p)互质,则(phi(x)=phi(frac{x}{p})~ imes~(p-1))

    证明:

    易证(phi)函数为积性函数。因为(frac{x}{p})(p)互质,于是(phi(x)=phi(frac{x}{p})~ imes~phi(p))

    又因为(p)是一个质数,于是根据引理,(phi(p)=p-1)。(upd)

    原式得证。

    证毕。

    于是对于每个数,若他是质数,则应用引理,否则在筛时,若最小质因子与他互质,则应用定理二,否则应用定理一。

    int pcnt;
    int prime[maxn],phi[maxn];
    bool is_not_prime[maxn];
    
    void euler(int x){
        phi[1]=1;
        is_not_prime[1]=true;
        for(int i=1;i<=x;++i){
            if(!is_not_prime[i]) prime[++pcnt]=i,phi[i]=i-1;
            for(int j=1;j<=pcnt;++j){
                if(i*prime[j]>x) break;
                is_not_prime[i*prime[j]]=true;
                if(!(i%prime[j])) {phi[i*prime[j]]=phi[i]*prime[j];break;}
                else phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
    }
    

    十四、模方程:

    定义:(forall a,b ~in~Z),若(a~Mod~m~=~b~Mod~m) 则称作(a,b)在模(m)域下同余。记做(a~equiv~b~(Mod~m))

    同余式两边支持同时加、减、乘同一个数字,但不支持除法。

    十五、模逆元:

    (forall~a~in~Z),若(exists~x~in~Z,s.t.~ax~equiv~1~(Mod~m))则称(x)(a)在模(m)域下的逆元。在模(m)域下,任何一个整数除以(a)完全等价于乘(x)

    一般而言,(m)为质数是(a)存在逆元的充分条件

    十六、逆元的求法

    单个数求逆元

    解方程(ax~equiv~1~(Mod~m)),发现等价于(ax+km=1)。直接使用(exgcd)求得答案即可。

    线性筛逆元:

    (x)的逆元为(x^{-1}),数组表示为(inv_x)

    则有线性递推式:(inv_i~=~(-leftlfloorfrac{m}{i} ight floor~ imes~inv_{m~Mod~i}+m)~Mod~m)

    证明:

    对于所有的(i),写出他的带余除法表达式:

    [m~=~ki~+~r,r~in~[0,i) ~~~① ]

    (Mod~m)域下有:

    [ki~+~r~equiv~0~(Mod~m) ]

    等式两侧同乘(i^{-1}~ imes~r^{-1})

    化简,整理得到:

    [i^{-1}~equiv~-kr^{-1} (Mod m)~~~② ]

    因为由(①)式得(k~=~leftlfloorfrac{m}{i} ight floor)(r=m~Mod~i),带入(②)式原式得证。

    int inv[maxn];
    
    void Get_inv(int x,int p) {
    	inv[1]=1;
    	for(int i=2;i<=x;++i) inv[i]=(p-p/i)*inv[p%i]%p;
    }
    

    十七、模

    模: 表示一个集合(Ssubseteq Z),集合对加减法封闭

    生成模: 集合(T)的生成模是,最小的模(S),使得(Tsubseteq S)

    实际意义:若(ain T,bin T,a+b otin T~~OR~~a-b otin T),将(a+b,a-b)加入(T)。不断进行。

    (S)一定是某个数所有倍数的集合
    证明:若(x)(S)中的最小正整数
    (~~~~~~~~~~)假设存在(y),不是(x)的倍数
    (~~~~~~~~~~)(r=ymod x),则(rin S)
    (~~~~~~~~~~)那么(0<r<x),矛盾。
    (~~~~~~~~~~)因此,模(S)一定是某个数所有倍数的集合。


    十八、群、环、域相关

    ((G,cdot))

    封闭性:(forall ain G, bin G, acdot b in G)

    结合律:((acdot b)cdot c=acdot (bcdot c))

    单位元(幺元):(exists ein G), s.t. (forall ain G, ecdot a=acdot e=a)

    逆元:(forall ain G, exists bin G), s.t. (acdot b=bcdot a=e)

    举例:

    (Qsetminus{0}, Rsetminus{0}, Csetminus{0}),所有行列式非0的(n)阶方阵组成一个群,{1,-1}

    单位元唯一

    设有两个单位元(e_1,e_2)

    (e_1=e_1e_2=e_2)

    逆元唯一

    假设(a)有两个逆元(b,c),那么

    (b=b(ac)=(ba)c=c)

    周期:(a)的周期是(o(a))

    (o(a))表示最小正整数,使得(a^{o(a)}=e)

    ((ab)^{-1}=b^{-1}a^{-1})

    (ab(b^{-1}a^{-1})=b^{-1}a^{-1}ab=e)

    子群

    ((G,cdot)),(Hsubseteq G), 且 ((H,cdot))是群,称在运算(cdot)下,(H)(G)的子群,用(Hleq G)表示

    生成子群: 集合(S)的生成子群用(<S>)表示

    右傍集

    如果(Hleq G),对于(ain G),定义集合(Ha={xin G~|~ exists hin H, ha=x})

    (|H|=|Ha|)

    如果(h_1 eq h_2),那么(h_1a eq h_2a)

    反证:若(h_1a=h_2a)(h_1aa^{-1}=h_2aa^{-1},~h_1=h_2)矛盾

    对于不同的(h)(ha)互不相同,因此(|Ha|=|H|)

    (Ha=Hb)当且仅当(ab^{-1}in H)

    (Ha=Hb),则(eain Ha),即(ain Hb),那么(exists hin H,~a=hb),那么(ab^{-1}=h)

    (ab^{-1}in H),那么(ha=ha(b^{-1}b)=h'bin Hb),因此(Hasubseteq Hb)

    (hb=hb(a^{-1}a)=h(ab^{-1})^{-1}ain Ha),故(Hbsubseteq Ha)

    因此(Ha=Hb)

    (Ha eq Hb),那么(Hacap Hb = emptyset)

    假设(xin Hacap Hb), 则(exists h_1,h_2in H)(h_1a=h_2b=x) , 那么(ab^{-1}=h_1^{-1}h_2in H),那么(Ha=Hb),矛盾

    由于(forall gin G)(gin Hg),所以(G)中每个元素都在某个傍集中。用([G:H])表示不同的傍集数,那么

    (|G|=|H|cdot [G:H])

    (|H|)(|G|)的约数

    (ain G),则(o(a)~~|~~|G|)

    考虑(a)的生成子群(<a>={a,a^2,a^3,...a^{o(a)}})

    考虑质数(p),考虑群(G={1,2,dots,p-1}),群的运算定义为对(p)取模的乘法

    (forall ain G, a^{p-1}=1(mod p))

    考虑(nin N^{+}),考虑群(G={1leq xleq n~|~gcd(x,n)=1}),群的运算定义为对(n)取模的乘法

    (|G|=phi(n))

    (forall ain G, a^{phi(n)}=1 (mod n))


    例题

    (a,bin G)(o(a)=m)(o(b)=n)(ab=ba)

    1.证明:若((m,n)=1),则存在(gin G),s.t. (o(g)=mn)

    2.证明:存在(gin G),s.t. (o(g)=lcm(m,n))

    证明:

    1. (g=ab),假设(o(ab)=k), 由于((ab)^{mn}=e),则(kleq mn)

    ((ab)^{k}=e),那么(a^{nk}=(ab)^{nk}=e), (m|nk)

    同理,(n|mk)

    (m|k, n|k)(mn|k)

    综上(k=mn)

    1. (m=t_1^{p_1}t_2^{p_2}dots t_s^{p_s})

    (n=t_1^{q_1}t_2^{q_2}dots t_s^{q_s})

    通过交换各个(a_i)的顺序,总能存在(0leq l leq s),s.t.

    (forall ileq l), (p_ileq q_i)

    (forall i > l), (p_igeq q_i)

    (c=a^{u},~u=t_1^{p_1}t_2^{p_2}dots t_l^{p_l})

    (d=b^{v},~v=t_{l+1}^{q_{l+1}}t_{l+2}^{q_{l+2}}dots t_s^{q_s})

    (o(cd)=lcm(m,n))

    由于(o(c)=m/u=t_{l+1}^{p_{l+1}}t_{l+2}^{p_{l+2}}dots t_s^{p_s})

    (o(d)=n/v=t_1^{q_1}t_2^{q_2}dots t_l^{q_l})

    那么(gcd(o(c),o(d))=1),又(cd=dc),由第一小问,(o(cd)=o(c)o(d)=lcm(c,d))

    循环群

    如果(G=<a>),称(G)是循环群

    举例:对7取余的乘法下,{1,2,3,4,5,6}是循环群

    (k)取余的加法下,({0,1,dots,k-1})是循环群

    (G=<a>)是有限循环群,则(o(a)=|G|)

    (k=o(a)),则(a^k=e),那么(a^{k+i}=a^i)

    考虑({a^1,a^2,dots,a^{k}}),这当中的数两两不同

    反证:设(1leq xleq yleq k)(a^x=a^y),那么(a^{y-x}=e),矛盾

    (m)是最小的正整数,使得(forall gin G, g^{m}=e)

    交换群(G)是循环群,当且仅当(m=|G|)

    (G=<a>)是循环群,则(o(a)=|G|),所以(mgeq |G|)

    又由于(forall gin G), (g^{|G|}=e),所以(m=|G|)

    (m=|G|)

    如果(exists ain G),s.t. (o(a)=|G|),那么(G=<a>)

    否则,(forall gin G), (o(g)<|G|)

    设周期最大的元素是(a)(o(a)=t)

    那么(forall gin G), 由刚才的例题,可知(o(g)|t)

    那么(t)满足(forall gin G, g^{t}=e)

    由于(m)是最小的正整数,使得(forall gin G, g^{m}=e),故(mleq t),矛盾,因此这种情况不会出现

    原根

    半群:满足封闭性和结合律

    交换群:满足交换律的群

    环:((R,+,cdot))其中((R,+))是交换群,((R,cdot))是半群

    举例子:(Z), (R[x])

    域:((F,+,cdot))其中((F,+))是交换群,((Fsetminus{0},cdot))是交换群

    (Q,R,C)

    代数基本定理:在域(F)中,(n)次非零多项式(f(x))至多有(n)个根

    任意一个域的乘法群的有限子群(G)一定是循环群

    (m)是最小的正整数,使得(forall gin G, g^{m}=e)

    首先(forall gin G, g^{|G|}=e)(mleq |G|)

    考虑多项式(x^m-e)(G)中元素都是这个多项式的根,由代数基本定理,(|G|leq m)

    因此(m=|G|)

    由循环群性质,(G)是循环群。

    考虑质数(p),在对(p)取模的意义下进行加法和乘法,那么({0,1,2,dots,p-1})是一个域

    乘法群({1,2,dots,p-1})是循环群

    定义:这个循环群的生成元叫做原根

    对于原根(a)(forall 1leq ileq p-1)(exists x>0), (a^x=i)

    一个循环群(G),设(p-1=|G|),假设其中(p)是质数

    (a)是生成元

    (G={a,a^2,a^3,dots,a^{p-1}})

    那么其中(a^{p-1}=e)

    如果(g)是原根,当且仅当(o(g)=p-1)

    (g=a^t),那么(o(g))是最小的(s)使得(p-1~|~st)

    (o(g)=p-1)当且仅当(t)(p-1)互质

    因为(st)(p-1)的倍数,也是(t)的倍数,所以是(t)(p-1)的公倍数。

    (t)(p-1)互质,(t)(p-1)的公倍数最小是(t(p-1))。由于(st)(t)(p-1)的公倍数,因此(sgeq p-1)。那么(s=p-1)

    (t)(p-1)不互质,设它们的最大公约数是(d),则(d>1)。取(s=(p-1)/d),则(st=(p-1)t/d=(p-1)(t/d))

    欧拉函数:(phi(n))定义为(1)(n)中与(n)互质的数的数量

    那么(|G|)中原根的数量就是(phi(p-1))

    由于(phi(p-1))较大,因此寻找原根时,暴力即可,枚举(2,3,dots),每当枚举到一个数,判断是不是原根。

    判断(a)是否是原根是,只需判断是否存在比(p-1)小的数(x),使得(a^x=1)

    枚举(p-1)的所有质因子(d),判断(a^{frac{p-1}{d}})是否是1

    如果都不是,那么(a)就是原根

    假设(o(a)=k),假设(k<p-1),那么(k|p-1)

    由于(a^{gcd(k,p-1)}=1),所以(k | p-1)

    (t=frac{p-1}{k}),那么(t>1)

    (d)(t)中任意一个质因子,(frac{p-1}{t}|frac{p-1}{d}),那么(a^{frac{p-1}{d}}=1)

    因此只需枚举(p-1)的所有质因子(d),判断(a^{frac{p-1}{d}})是否是1

    十九、离散对数

    (G)的原根是(a),由于(forall gin G)(exists x, a^x=g),那么(x=log_{a}{g})

    令$q=lceil sqrt{p} ceil $

    求出(S={a^0, a^1, dots, a^q})

    求出(T={a^0,a^q,a^{2q},dots, a^{q^2}})

    任意一个(a^x=g),因为(x=kq+l, 0leq k,lleq q)

    那么(g=a^{kq} a^{l})

    可以写成(g=st,sin S,tin T)

    枚举(sin S),那么需要的(t)就是(s^{-1}g)。对(T)建哈希表(或对(T)排序二分),查找(s^{-1}g)(T)中是否存在。

    这样可以(O(q))的时间复杂度求出(g=st)的形式,进而求出(x=log_{a}{g})

    欢迎指正评论O(∩_∩)O~~

  • 相关阅读:
    删除 Change Pointers
    如何提高读取BSEG的性能(sap已清项和未清项的提取) (转)
    思维导图FreeMind
    调用BAPI创建发票时报错
    BAPI for Credit Memo
    账页程序源码(PL/SQL)
    ALV Grid 行单击事件响应
    abap 读取文件的FM
    Logistics在SAP中为什么"后勤"的意思(转)
    N次笑N次据说可以让人年轻10岁的故事
  • 原文地址:https://www.cnblogs.com/kylinbalck/p/9799247.html
Copyright © 2011-2022 走看看