Loading [MathJax]/jax/output/HTML-CSS/jax.js

NanoApe's Blog

既是咸鱼又是辣鸡

【数论】基础数论、质数、同余初步、数值计算

NanoApe posted @ 2016年1月04日 14:23 in 蒟蒻不撕烤智熵何来 , 1085 阅读

 

本原勾股数

每个本原勾股数组(a,b,c)(其中a为奇数b为偶数)都满足

a=stb=s2t22c=s2+t22(s>t1andgcd(s,t)=1ands,t)

 

恒等式

(a2+b2)(c2+d2)=(ac+bd)2+(adbc)2

 

线性筛

以筛质数为例

CountPri
1
2
3
4
5
6
7
8
9
10
11
12
13
void CalPri()
{
    rep(i, 2, n)
    {
        if (valid[i]=false)
            pri[++tot]=i;
        rep(j, 1, tot)
        {
            valid[i]=true;
            if (i%pri[j]==0) break;
        }
    }
}

 

Miller–Rabin素数测试

测试N是否为素数,记2sd=N1

a[1,N1]an

admodN1a2rdmodN1(r[0,s1])

则N是合数

否则,N有3/4的概率为素数

Miller_Rabin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
inline ll Mult(ll x, ll t, ll Q)
{
    ll k=0; while (t)
    {
        if (t&1)
        {
            k+=x; if (k>=Q) k-=Q;
        }
        t>>=1; x+=x; if (x>=Q) x-=Q;
    } return k;
}
inline ll Pow(ll x, ll t, ll Q)
{
    ll k=1; while (t)
    {
        if (t&1) k=Mult(k,x,Q);
        t>>=1; x=Mult(x,x,Q);
    } return k;
}
 
inline bool MR(ll n) // Miller_Rabin
{
    if (n<2) return false;
    if (n==2) return true;
    if ((n&1)==0) return false;
    ll d=n-1, s=0;
    while ((d&1)==0) d>>=1, s++;
    rep(tm, 1, 8)
    {
        ll a=rand()%(n-1)+1, ret=Pow(a,d,n), last=ret;
        rep(i, 1, s)
        {
            ret=Mult(ret,ret,n);
            if (ret==1 && last!=1 && last!=n-1) return false;
            last=ret;
        }
        if (ret!=1) return false;
    }
    return true;
}

 

Pollard_rho质因素分解

Pollard_rho
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ll gcd(ll a, ll b){return b==0?a:gcd(b,a%b);}
inline ll PR(ll n, ll c)  // Pollard_rho
{
    int i=0, k=1; ll x=rand()%n, y=x;
    while (1)
    {
        i++;
        x=(Mult(x,x,n)+c)%n;
        ll d=gcd(y>x?y-x:x-y,n);
        if (d!=1 && d!=n) return d;
        if (y==x) return n;
        if (i==k) y=x, k<<=1, i=0;
    }
}
 
ll q[109]; int tot;
void FindFac(ll n)
{
    if (MR(n)) {q[++tot]=n; return;}
    ll p=n; while (p==n) p=PR(p,rand()%(n-1)+1);
    FindFac(p); FindFac(n/p);
}

 

费马大定理

n3时方程

an+bn=cn

没有正整数解

 

费马小定理

ap11(modp)

变式:(前提gcd(a,n)=1

aφ(n)1(modn)

 

威尔逊定理

(p1)!1(modp)

 

乘法逆元

①数a(modp)意义下的逆元为ap2

②数a(modn)意义下的逆元需要通过Exgcd求解(有可能不存在逆元)

 

中国剩余定理(CRT)

解方程组xai(modmi),其中mi两两互质

解法:

Mi=jimj

MipiaiaiMipi1(modmi)

所有pi解完累加起来,Mipiai(modM)就是答案了

 

欧几里德算法

Gcd
1
int gcd(int a, int b){return b==0?a:gcd(b,a%b);}

 

扩展欧几里德算法

解线性方程Ax+By=gcd(A,B)

在求gcd的基础上加上求x和y

原理:By+(AmodB)xB(yA/BBx/B)+AxAx+B(yA/Bx)

ExGCD
1
2
3
4
5
6
7
8
9
10
11
12
13
int ex_gcd(int a, int b, int &x, int &y)
{
    if (b==0)
    {
        x=1, y=0; return a;
    }
    else
    {
        int d=ex_gcd(b,a%b,y,x);
        y-=a/b*x;
        return d;
    }
}

 

线性同余方程

AxB(modp)

解法:

d=gcd(A,p),先用Exgcd求Ax+py=d的解

由线性同余式定理可得,如果B不能整除d则无解

否则modp意义下的解有d个,可以对某个解不断增加p/d得到

多解证明:

Apd=gcd(A,p)=lcm(A,p)0(modp)

Line Mod Equation
1
2
3
4
5
6
7
8
9
10
11
12
void line_mod_equation(int a, int b, int n)
{
    int x, y, ans;
    int d=ex_gcd(a,n,x,y);
    if (b%d==0)
    {
        x%=n; x+=n; x%=n; //x mod n
        ans=x*(b/d)%(n/d); //%(n/d)是为了让ans为最小正整数解
        rep(i, 1, d-1)
            ans+=n/d;
    }
}

 

Gray码

性质:一个02n1的排列且相邻两项(包括头尾相邻)的二进制数中只有一位不同

 

高阶代数方程求根

 

数值积分

 

AKS素数测试


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter