• 省选数学复习


    复数运算

    ((a,bi),(c,di))

    加法:((a+c,(b+d)i))

    减法:((a-c,(b-d)i))

    乘法:((ac-bd,(bc+ad)i))

    除法:

    [frac{a+bi}{c+di}=frac{(a+bi)*(c-di)}{(c+di)*(c-di)}=frac{ac+bd}{c^2+d^2}+frac{bc-ad}{c^2+d^2}i ]

    二次剩余

    模数为奇素数用(cipolla)

    inline int cipolla(int n){
    	n%=mod;//
    	if(ksm(n,mod>>1)==mod-1)return -1;
    	int x;
    	while(1){
    		x=rand()%mod;//
    		sq=((ll)x*x-n+mod)%mod;//
    		if(ksm(sq,mod>>1)==mod-1)break;//
    	} 
    	return (cpow(complx(x,1),mod+1>>1).x+mod)%mod;
    }
    

    BSGS

    inline int bsgs(int x,int c){
    	if(!x)return c?-1:1;
    	int sq=ceil(sqrt(mod));
    	mp.clear();
    	for(int i=0,pw=1;i<=sq;i++,pw=pw*x%mod)
    		mp[pw*c%mod]=i;
    	x=ksm(x,sq);
    	for(int i=1,nw=x;i<=sq;i++,nw=nw*x%mod)
    		if(mp.find(nw)!=mp.end())return i*sq-mp[nw];
    	return -1;
    }
    

    exBSGS

    inline int exBSGS(int a,int b){
    	a%=mod;b%=mod;
    	if(b==1)return 0;
    	if(!a)return b?-1:1;
    	int num=0,k=1,sq=ceil(sqrt(mod)),d;//
    	while(1){
    		d=gcd(a,mod);
    		if(d==1)break;
    		if(b%d)return -1;
    		b/=d;mod/=d;num++;
    		k=k*a/d%mod;//
    		if(k==b)return num;
    	}
    	mp.clear();
    	for(int i=0,x=b;i<=sq;i++,x=x*a%mod)//
    		mp[x%mod]=i;
    	a=ksm(a,sq);
    	for(int i=1,nw=k*a%mod;i<=sq;i++,nw=nw*a%mod)
    		if(mp.find(nw)!=mp.end())return i*sq-mp[nw]+num;
    	return -1;
    }
    

    CRT

    [ans=sum_{i=1}^ka_iM_it_i(M_i=frac M{m_i},M_it_i≡1pmod{m_i}) ]

    exCRT

    A=a[1];M=m[1];
    for(int i=2,d,x,y;i<=n;i++){
    	d=exgcd(M,m[i],x,y);
    	x=mul((x%m[i]+m[i])%m[i],(a[i]-A)/d,m[i]/d);
    	A=(x*M+A);
    	M=M/d*m[i];
    	A%=M;
    }
    cout<<A<<"
    ";
    

    Lucas

    [C_n^mmod p=C_{n/p}^{m/p}*C_{nmod p}^{mmod p}mod p,pIsPrime ]

    exLucas

    把模数拆成互质的几个部分(p^c)然后用中国剩余定理求解,注意算阶乘分别处理两部分,含有(p)和不含的(不用Lucas了)

    牛顿迭代

    给定多项式(g(x)),已知有(f(x))满足:

    [g(f(x))equiv0 pmod {x^n} ]

    求模(x^n)意义下的(f(x))

    倍增

    (n=1)时,([x^0]g(f(x))=0)的解单独算

    已知(f_0(x))(x^frac n2)的解,求模(x^n)的解(f(x))

    (g(f(x)))(f_0(x))处泰勒展开

    [sum_{i=0}^{oo}frac{g^{(i)}(f_0(x))}{i!}(f(x)-f_0(x))^iequiv0pmod {x^n} ]

    (f(x)-f_0(x))的最低非零项次数为(frac n2),有

    [(f(x)-f_0(x))^iequiv …… ]

    ……

    [f(x)=f_0(x)-frac{g(f_0(x))}{g`(f_0(x))}pmod{x^n} ]

    例:多项式(exp)

    给定函数为(h(x))

    (g(f(x))=ln f(x)-h(x)pmod {x^n})

    [f(x)equiv f_0(x)-frac{ln f_0(x)-h(x)}{frac 1{f_0(x)}}pmod{x^n} ]

    [f(x)equiv f_0(x)(1-ln f_0(x)+h(x))pmod{x^n} ]

    时间复杂度

    [T(n)=T(frac n2)+O(nlog n)=O(nlog n) ]

    poly ln exp

    关键词:麦克劳林级数

    [ln(1-f(x))=-sum_{i=1}^{oo}frac{f^i(x)}i ]

    [ln(1+f(x))=sum_{i=1}^{oo}frac{(-1)^{i-1}f^i(x)}i ]

    [exp f(x)=e^{f(x)}=sum_{i=0}^{oo}frac{f^i(x)}{i!} ]

    Miller-Rabin

    int pri[12]={2,3,5,7,11,13,17,19,23,29,31,37};
    inline bool MR(int n){
    	for(int i=0;i<12;i++)
    		if(pri[i]==n)return 1;
    	if(n<2||!(n&1))return 0;
    	for(int i=0,k,x;i<12;i++){
    		k=n-1;
    		while(k){
    			x=ksm(pri[i],k,n);
    			if(x!=1&&x!=n-1)return 0;
    			if((k&1)||x==n-1)break;
    			k>>=1;
    		} 
    	}
    	return 1;
    }
    

    Pollard-Rho

    inline int f(int x,int c,int mod){
    	return (mul(x,x,mod)+c)%mod;
    }
    inline int PR(int n){
    	int t=0,c=rand()%n,s,sum,d;
    	for(int w=1;;w<<=1){
    		s=t;sum=1;
    		for(int i=0;i<w;i++){
    			t=f(t,c,n);
    			sum=mul(sum,abs(t-s),n);
    			if(i%127==0){
    				d=gcd(n,sum);
    				if(d>1)return d;
    			}
    		}
    		d=gcd(n,sum);
    		if(d>1)return d;
    	}
    }
    

    快速乘

    inline int mul(ul x,ul y,ul mod){
    	return (x*y-(int)((long double)x/mod*y)*mod+mod)%mod;	
    }
    
  • 相关阅读:
    MarkDown测试
    在Tabbed Activity(ViewPager)中切换Fragment
    About ListView
    Android Studio的技巧
    卷积神经网络
    TensorFlow中CNN的两种padding方式“SAME”和“VALID”
    tensorflow-解决3个问题
    激活函数
    tensorflow数学运算
    tensorflow
  • 原文地址:https://www.cnblogs.com/aurora2004/p/13206498.html
Copyright © 2020-2023  润新知