初等数论零散总结

这两天零零散散的看了一些数论方面的知识,在这里做一个小小的总结


  • 关于取模运算的一些性质和定理

    • 基本性质
      • 若p|(a-b),则a≡b (% p)。例如 11 ≡ 4 (% 7), 18 ≡ 4(% 7)
      • (a % p)=(b % p)意味a≡b (% p)
      • 对称性:a≡b (% p)等价于b≡a (% p)
      • 传递性:若a≡b (% p)且b≡c (% p) ,则a≡c (% 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
      • a ^ b % p = ((a % p)^b) % p
      • 结合律:
        • ((a+b) % p + c) % p = (a + (b+c) % p) % p
        • ((a*b) % p * c)% p = (a * (b*c) % p) % p
      • 交换律:
        • (a + b) % p = (b+a) % p (7)
        • (a * b) % p = (b * a) % p (8)
      • 分配律:
        • (a+b) % p = ( a % p + b % p ) % p (9)
        • ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p
    • 重要定理
      • 若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p)
      • 若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p)
      • 若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p)
      • (a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p)

  • 欧拉公式
    • 欧拉函数计算的是小于等于n的数中与n互质的数的数目。
      • 通式
        φ(x)=x(11/p1)(11/p2)...(1pn)

        • 其中p1, p2……pn为x的所有质因数,x是不为0的整数。
        • φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。
        • 注意:每种质因数只一个。 比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
        • 若n是质数p的k次幂,则φ(n)=p^k-p^k-1,因为除了p的倍数外,其他数都跟n互质
        • 欧拉函数是积性函数——若m,n互质,φ(mn)=φ(n)*φ(m)
        • 特殊性质:当n为奇数时,φ(2n)=φ(n)
        • 若n为质数则φ(n)=n-1
      • 代码实现
int F[MAX_N];
void Euler_function()
{
    for (int i=2;i<MAX_N;i++)
    {
        if(F[i]==0)
        {
            F[i]=i-1;
            for(int j=2*i;j<MAX_N;j+=i)
            {
                if(F[j]==0)F[j]=j;
                F[j] =F[j]/i*(i-1);
            }
        }
    }
}

  • 欧拉定理
    • 如果a,n互素,则有
      这里写图片描述
      其中当n本身是素数时有a^(p-1) ≡ 1 (mod p)
      应用:可以用于求m^n当m和n都很大时的尾数,例题LightOJ 1282

  • 欧几里得算法
    • 作用:求a,b的最大公约数gcd(a,b)=gcd(b,a%b)
    • 代码实现:
int gcd(int a,int b)
{
    int t;
    while(b!=0)
    {
        t=b;
        b=a%b;
        a=t;
    }
    return a;
}

  • 扩展欧几里得算法
    • 作用:用于解不定方程ax+by=gcd(a,b)
    • 代码实现:
int exGcd(int a,int b,int &x,int &y)//注意这里x,yx是引用下
{
    if(b==0)
    {
        x=1;y=0;
        return a;
    }
    int r=exGcd(b,a%b,x,y);//因为要使用到回溯后的x,y值,所以不能用循环模拟实现
    int t=x;x=y;y=t-a/b*y;
    return r;
}

  • 快速幂
    • 作用:用于快速求解x^k
    • 代码实现:
int Quike_pow(const int &x,int k)
{
    if(k==0)return 1;
    else
    {
        int y=Quike_pow(x,k/2);
        if(k&1)
            return y*y*x;
        else return y*y;
    }
}

注:以上部分文字摘自百度百科

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值