学习笔记——数论基础

前置知识:a|b代表b是a的倍数

1.最大公约数:当a|b时,a|c,且没有一个比a大的数满足这个条件,则称a为b,c的最大公约数,记作a=gcd(b,c)

最小公倍数:当b|a时,c|a,且没有一个比a小的数满足这个条件,则称a为b,c的最小公倍数,记作a=lcm(b,c)

可以将其看成一个表达式,满足表达式的一切性质

2.求解最大公约数:

若有两个数a,b,欲求两者的最大公约数

设a>b

我们发现如果b是a的约数,那么b就是a,b的最大公约数

可是如果a|b不成立呢?

下面对这种情况进行讨论:

…………

算了免了吧

反正证明过程不会考的,下面是结论:

gcd(a,b)=gcd(b,a mod b)

则得出递归公式

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

这种算法叫做欧几里得算法,又叫辗转相除法,

复杂度为O(log n)

3.求解最小公倍数:

一组整数的公倍数,是指这组数中每一个数的倍数,0是任意一组数的公倍数

一组整数的公倍数,是指所有正的公倍数里面,最小的一个数

……

老规矩,略去推导过程,直接上结论:

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

所以lcm(a,b)=a*b/gcd*(a,b)

因此,若求lcm,求出gcd即可

4.算数基本引理:设p是素数,若p|a1*a2,则p至少能被a1,a2整除

5.模运算

又称mod ,取余,符号是%,代表取这个数的余数

性质:(a+b)%p=((a%p)+(b%p))%p

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

6.快速幂

用于求a^k之类的题目

实现过程难以描述,直接写代码

int ksm(int n,int k,int p)
{
    int ans=1;
    while(k)
    {
        if(k&1)
        {
                ans=(ans*n)%p;
        }
        n=(n*n)%p;
        k>>=1;
    }
    return ans;
}

7.唯一分解定理:

每一个正整数都可以拆分成形如p1^e1*p2^e2……pk^ek的形式

其中pi都是质数,ei都是指数

 8.扩展欧几里得算法:

想要求ax+by=gcd(a,b)的一组解x,y

那么我们可以先求出(b)x'+(a%b)y'=gcd(b,a%b)

再由x'和y'推导出x,y

那么x',y'还可以用类似的手法求出

也就是说运用递归的方法

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    int h=exgcd(b,a%b,x,y)
    int xx=x,yy=y;
    x=yy,y=xx-a/b*yy;
    return h;
}

9.逆元:

给定一个整数a和模数p,求一个整数x,满足a*x=1 mod p

则x就是在mod p概念下的逆元

别问,问就是不会

 

posted @ 2022-07-19 11:37  美索maysoul  阅读(303)  评论(0)    收藏  举报