简单数论的学习笔记

标签: ACM训练  算法


前言

本文介绍数论的相关知识,仅用于学习参考


一、数论究竟是什么?

数论是用来研究整数的性质的。
整数集 Z:{…−2,−1,0,1,2…}
自然数集N:{0,1,2,3,4…}

二、一些概念与定理

0. 质数

试除法:

bool is_prime(int x)
{
    if (x < 2) return false;
    for (int i = 2; i <= x / i; i ++ )              // 注意循环条件
        if (x % i == 0)
            return false;
    return true;
}

1.最大公约数

存在一个整数d,使得d | x,d | y,则d为x,y的公约数。

最大的一个称之为最大公约数,记作gcd(x,y)。

辗转相除法

//递归写法
int gcd(int a,int b)
{
    if(a%b==0)
        return b;
    return gcd(b,a%b);
}

//循环写法
int gcd(int a,int b)
{
    int temp;
    while(b)
    {    
        temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

性质:

满足交换律:gcd(a,b) = gcd(b,a)

满足分配律:gcd(ma,mb) = m * gcd(a,b)

在乘法函数中:gcd(ab,m) = gcd(a,m) * gcd(b,m)

和最小公倍数(lcm)的关系:gcd(a, b) * lcm(a, b) = ab

两个整数的最大公因子和最小公倍数中存在分配律:
gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))

2.算术基本定理

任意一个整数都能被分解为如下形式:

n=pk11pk22…pktt。其中p为质数。

t,∑ti=1ki都是logn量级的。

3.欧拉函数

欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。特殊的,φ(1)=1。

几个性质

在这里插入图片描述

4.扩展欧几里得

裴蜀定理:有任意正整数a与b,存在x和y,使得ax+by=gcd(a,b)

题型:根据欧几里得算法来求x与y(拓展欧几里得算法)

示例代码如下

#include<iostream>
using namespace std;
int exgcd(int a,int b,int & x,int & y)
{
    if(!b)
    {
        x=1,y=0;
        return a;
    }
    else{
        int tmp_y;
        exgcd(b,a%b,x,y);
        tmp_y=y;
        y=x-a/b*y;
        x=tmp_y;

    }

}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a,b,x,y;
        scanf("%d%d",&a,&b);
        exgcd(a,b,x,y);
        printf("%d %d\n",x,y);
    }
}

总结

以上就是这周大概所学的内容,本文仅仅简单记录了学习数论的笔记,而数论内容多而杂乱,这仅是冰山一角,且从理解到应用还有很长的距离,自我反思这周只学习了理论知识而没有练习大量的题目,下周改进要多练题多写博客输出,期待十一月更好的表现。
版权声明:本文为weixin_44623067原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44623067/article/details/109428829