数论基础----欧几里得算法和取余

    xiaoxiao2025-06-05  28

    苍茫大地一剑尽挽破,何处繁华笙歌落。斜倚云端千壶掩寂寞,纵使他人空笑我。

    1.欧几里得算法(辗转相除法)求最小公倍数。

    递归写法:

    int gcd(int a,int b)

    {

        if(b == 0) return a;

        else

        return gcd(b,a%b);

    }

     

    更简洁的写法:

    int gcd(int a,int b)

    {

        return b?gcd(b,a%b):a;

    }

     

    扩展:

    Lcm (最大公约数)

    lcm(a,b) = (a*b)/gcd(a,b);

    为了防止a*blong long 溢出,所以建议这样写:

    lcm(a,b) = a/gcd(a,b)*b;

    2.引入求余概念

    求余:

    a%b = a mod b = a-a/b*b   (一般题目中b 都是 正整数)//ex:a=5,b=3

    注:当a为负整数时, 应保证取模结果为正,所以 (a%b+b)%b //类似钟表的概念

     

    同余:

    定义:给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。

    a≡b(mod m)  称为 a与b对mod m 同余

    可推理的结论: a % b = m,因为(a – b) mod m = 0

    例如:26≡2(mod 12) , (26-2) mod12 = 0

     

    模运算公式:

    (a +  b) % p = (a%p +  b%p) %p  

    (a  -  b) % p = (a%p  -  b%p) %p  

    (a  *  b) % p = (a%p *  b%p) %p  

    (a  /  b) % p = (a%p  /  b%p) %p  )   ----- 为什么是错的呢( •̀́ )

    证明一个公式是对的难,但是举一个反例就行!

    Ex:(100/50) = 2    ≠   (100 ) / (50 ) = 0

    那么我们要怎么解决酱紫的问题呢?

    这就要用到逆元了,我会在下一篇博客中详细介绍。

    最新回复(0)