zoukankan      html  css  js  c++  java
  • 欧拉函数及欧拉定理 学习笔记

    欧拉函数,即$varphi(n)$,表示$leq n$且与$n$互质的个数。

    例如,$varphi(1)=1$。当$n$为质数时,显然有$varphi(n)=n-1$。

    求某一个数的欧拉函数,我们可以用唯一分解定理求出。

    设$n=p_1^{k_1}+p_2^{k_2}+cdots +p_s^{k_s}$,则$varphi(n)=n*prodlimits_{i=1}^s frac{p_i-1}{p_i}$。证明详见OI Wiki。(反正OI不需要证明,只需要会用

    根据上述式子,我们可以$sqrt n$求出一个数的欧拉函数。

    一定要把除号写在乘号的前面!!!(血与泪的教训QAQ)

    inline int phi(int x)
    {
        int res=x,m=x);
        for (int i=2;i*i<=m;i++)
        {
            if (x%i==0){
                res=res/i*(i-1);
                while(x%i==0) x/=i;
            }
        }
        if (x>1) res=res/x*(x-1);
        return res;
    }

    如果求多个数的欧拉函数,可以使用线性筛。欧拉函数是积性函数,当$b$为质数时,满足下面性质:

    $varphi(ab)=varphi(a)*b (a mod b=0)$($b$为最小质因子)

    $varphi(ab)=varphi(a)*varphi(b) (a mod b≠0)$

    所以我们可以线性筛质数的同时求出欧拉函数。

    inline int work()
    {
        vis[0]=vis[1]=1;
        for (int i=2;i<=maxn;i++)
        {
            if(!vis[i]) prime[++tot]=i;
            for (int j=1;j<=tot&&prime[j]*i<=maxn;j++)
            {
                vis[i*prime[j]]=1;
                if (i%prime[j]==0){
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }
                else phi[i*prime[j]]=phi[i]*phi[prime[j]];
            }
        }
    }

     欧拉定理:如果$gcd(a,p)=1$,那么$a^{varphi(p)}equiv 1 (mod p)$。

    扩展欧拉定理(学长的PPT):

    欧拉定理可以解决一些幂比较大的毒瘤题目(比如$10^{2000000}$之类的)。证明什么的看OI Wiki吧。反正我也不会证明qwq

  • 相关阅读:
    JavaScript的学习----2.操作BOM对象
    Maven的配置和Eclipse中导入SpringBoot项目一些注意点
    JavaScript学习----1.基础篇
    线程池的学习
    CSS的初步学习
    类的加载细节探索
    反射与注解
    数据结构第二章
    数据结构第一章
    用结构和STL常用算法实现对学生成绩的排序和查找(vector)
  • 原文地址:https://www.cnblogs.com/Invictus-Ocean/p/13374162.html
Copyright © 2011-2022 走看看