ACM 数论

ACM 数论

因为 博客内数学公式不好写(也可能是我不会),所以写在了纸上 懒!


目录

 快速幂

 唯一分解定理

 欧几里得算法

 同余式


 快速幂

顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。 —— 《百度百科》

通过将指数转化为二进制的方式,结合位运算加速求幂的过程

思路

ACM 数论_第1张图片

代码实现

递归

int quick_pow(int a,int b)
{
    if(b == 0)
        return 1;
    int res = quick_pow(a , b / 2);
    if(b % 2 != 0)
    {
        return res * res * a;
    }
    return res * res;
}

非递归

int quick_pow(int a,int b)
{
    int res = 1;
    while(b)
    {
        if(b & 1)//若此时b的二进制位为1 ,则需要乘以a的(2的i次方)
        {
            res = res * a;
        }
        a = a * a;//将a的(2的i次方)转化为a的(2的i+1次方)
        b >>= 1;//将判断过后的b的二进制位右移删去
    }
    return res;
}

快速幂取模

有时题目需要对快速幂取模,此时只需要在快速幂的基础上,每次乘法后取一下模即可

int quick_pow(int a,int b,int mod)
{
    int res = 1;
    while(b)
    {
        if(b & 1)
        {
            res = res * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

 唯一分解定理

任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积

一个合数可以分解为一个质数乘以一个质数或一个质数乘以一个合数,分解后的合数又可继续分解,最终便可分解为有限个质数的乘积

 欧几里得算法

用于给定整数 a, b 求 a 和 b 的最大公约数,也可用于判断两数是否互质,若两数的 gcd 为 1,则两数互质

证明

 

 代码实现

非递归写法

int gcd(int a, int b){
    while(b)
    {
        int tmp = a;
        a = b;
        b = tmp % b;
    }
    return a;
}

递归写法 

int gcd(int a, int b){
    //return b == 0 ? a : gcd(b , a % b);//也可以通过这种写法压行,效果是一样的
    if(b == 0)
        return a;
    return gcd(b , a % b);
}

 同余式

≡ :表示同余号 。 有 a ≡ b (mod p) 即 a mod p = b mod p

性质及证明

ACM 数论_第2张图片

 

你可能感兴趣的:(ACM 数论)