一些數論題的板子

最近學習數論來着,然後就萌生了一個整理一個數論題板子集合的想法

不過,會推數學式子纔是數論題的關鍵,數學纔是數論題的基礎與核心

GCD:
原理: (a,b) = (b,a%b)

Code:

int gcd(int a,int b)
{
    if(a % b == 0)
    return a;
    return gcd(b,a % b);
}

Exgcd:

目的是求: ax + by = gcd(a,b)的一組解(x,y)

同時返回的是d = gcd(a,b)

Code:

int Exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x = 1;
        y = 0;
        return a;
    }
    else
    {
        int d = Exgcd(b,a%b,x,y);
        int t = x;
        x = y;
        y = t - (a / b) * y;
    }
}

 

Miller_Rabin

這個算法是主要用來判斷某一個數是不是質數的算法

但是請注意這個算法具有隨機性,而且是單點判斷,不適用於區間的素數篩選

這個算法的證明(手寫):

 

Code:

int gg[8] = {2,3,5,7,13,29,37,89};
Miller_Rabin(int a,int n)
{
    int d = n - 1;
    int r = 0;
    while(d % 2 == 0)
    {
        d /= 2;
        r++;
    }
    int x = kuaisumi(a,d,n);
    if(x == 1)
    return true;
    for(int i=0;i<r;i++)
    {
        if(x == n - 1)
        return true;
        x = (long long)x * x % n;
    }
    return false;
}
bool is_prime(int n)
{
    if(n <= 1)
    return false;
    for(int a=0;a<8;a++)
    if(n == gg[a])
    return true;
    for(int a=0;a<8;a++)
    if(!Miller_Rabin(gg[a],n))
    return false;
    return true;
}

 

線性篩:

線性篩的算法有很多種,但是本文這裏爲了簡便起見

只介紹歐拉篩了,同時因爲歐拉篩可以預處理莫比烏斯函數和歐拉函數等數論函數

還可以得出每一個合數的最小非1因子

好處多多a

Code:

memset(not_prime,0,sizeof(not_prime));
for(int i=2;i<=n;i++)
{
    if(!not_prime[i])
    {
        prime[++prime_cnt] = i;
        phi[i] = i - 1;
        mu[i] = -1;
    }
    for(int j=1;j<=prime_cnt;j++)
    {
        int x = i * prime[j];
        if(x > n)
        break;
        not_prime[x] = true;
        phi[x] = phi[i] * phi[prime[j]];
        mu[x] = mu[i] * mu[prime[j]];
        if(i % prime[j] == 0)
        {
            phi[x] = phi[i] * prime[j];
            mu[x] = 0;
            break;
        }
    }
}

 

未完待續···

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章