首页 > 其他分享 >欧拉函数

欧拉函数

时间:2023-12-01 22:14:49浏览次数:28  
标签:phi frac 函数 int times 欧拉 euler

定义

欧拉函数 \(\phi(n)\) 代表的是 \([1,n]\) 之间与 \(n\) 互质的数量。

公式

\(\phi(n) = n \times (1- \frac{1}{p_1})\times (1- \frac{1}{p_2})\times (1- \frac{1}{p_3}) \times …… \times (1- \frac{1}{p_k})\)

其中:\(n\) 有 \(k\) 个质因数,而 \(p_i\) 就是其中的一个质因数。

推导

如何推导

推导的方式要用到容斥原理

欧拉函数 \(\phi(n)\) 代表的是 \([1,n]\) 之间与 \(n\) 互质的数量,但是我们发现比较难想,于是正难则反,直接从不互质来入手,然后减掉就得出结果了。

如果 \(i\) 是不互质,那么 \(i\) 和 \(n\) 必将有共同的质因数。所以,我们可以通过 \(n\) 的每一个质因数进行倍数处理,然后容斥算出有多少是不互质的,因此也就可得出答案了。

推导过程

我们设:\(n\) 的质因数是:{ \(p_1,p_2,……,p_k\) }。

那么 \(p_i\) 在 \([1,n]\) 这个区间中的倍数就有 \(\frac{n}{p_i}\)。

为了方便推导,我们暂且先设 \(k=3\)。

于是就可以得到公式:

  • \(n-\frac{n}{p_1}-\frac{n}{p_2}-\frac{n}{p_3}+\frac{n}{p_1 \times p_2}+\frac{n}{p_1 \times p_3} + \frac{n}{p_2 \times p_3} -\frac{n}{p_1 \times p_2 \times p_3}\)

在进行通分之后,我们发现这个式子其实已经等于 \(\phi(n)\) 了。

得证。

代码

定义法

  • 只能处理一个数的 \(\phi\)。

  • 思路是一边分解质因数一遍处理欧拉函数

    int get_euler(int n)
    {
        int euler = n;
        for (int i = 2; i <= n / i; i++)
        {
            if (n % i == 0)
            {
                euler = euler / i * (i - 1) //euler = euler * (1 - 1 / i); 
                while (n % i == 0) n /= i;
            }
        }
        
        if (n > 1) euler = euler / n * (n - 1);
        return euler;
    }
    
    

线性筛法

  • 在进行筛法的时候处理欧拉函数

  • 可以在一次线性筛中处理出 \([1,n]\) 中的欧拉函数

    int primes[N], cnt = 0;
    int euler[N];
    bool st[N];
    
    int get_euler(int n)
    {
    	euler[1] = 1; // 1的欧拉函数值是1
        
        // 线性筛模板 + 过程中求欧拉函数
        for (int i = 2; i <= n; i++)
        {
            if (!st[i])
            {
                primes[cnt ++] = i;
                euler[i] = i - 1; // (1)式
            }
            for (int j = 0; primes[j] <= n / i; j++)
            {
                st[i *primes[j]] = true;  
                if (i % primes[j] == 0)
                {
                    euler[i * primes[j]] = euler[i] * primes[j]; //(2)式
                    break;
                }
                 euler[i * primes[j]] = euler[i] * (primes[j] - 1);//(3)式
            }
        }
        // 最后,euler数组中存的就是 1 ~ n 每个数的欧拉函数值 
    }
    urn euler;
    }
    
    

一些等式

  • 当 \(n\) 是质数的时候,\(\phi(n) = n-1\)。

  • 当 \(n\) 是质数的时候,存在 \(n^k\) 使得 \(\phi(n^k) = (n-1) \times n ^{k-1}\)

  • 积性函数,如果 \(n\) 与 \(m\) 互质,则 \(\phi(n×m)=\phi(n)×\phi(m)\)

参考文献:

标签:phi,frac,函数,int,times,欧拉,euler
From: https://www.cnblogs.com/gsczl71/p/17870948.html

相关文章

  • matlab中绘制三维柱状图bar3函数的使用方法
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • C++学习笔记——函数探幽
    C++内联函数内联函数是一种用空间换时间的技术,是C++提高程序运行速度做的改进。运行程序时操作系统将指令载入计算机内存中,并逐条执行这些指令,遇到循环或分支时向前或向后跳转到特定的地址(每条指令都有特定的内存地址)。常规函数也是如此,在调用常规函数时立即存储该指令的地址......
  • 7、oracle迁移到postgres-逗号拼接函数listagg与string_agg
    oracle迁移到postgres-逗号拼接函数listagg与string_aggoracle中的listagg函数与postgres中的string_agg函数都可以实现逗号拼接字符1、listagg函数SELECTt.id,listagg(字段1,',')withinGROUP(ORDERBY字段1)ascheck_msg2FROMdual;within......
  • 软件测试/人工智能|Python函数与调用:解放编程力量的关键
    简介Python作为一门强大而灵活的编程语言,其函数机制为我们提供了一个重要的工具,使得代码更为模块化、可重用。在本文中,我们将深入探讨Python中函数的各个方面,包括什么是函数、内置函数、函数的定义和函数的调用,以及通过示例展示函数在实际编程中的应用。什么是函数?在Python中,......
  • @RequestParam 注解导致无法自动将请求参数填充到函数参数中
    @RequestParam注解导致无法自动将请求参数填充到函数参数中@RequestParam注解通常用于从HTTP请求中提取单个参数值。它将参数值映射到方法的参数上,并且默认情况下不会自动将值填充到类的字段中。以下面的代码为例:classPageParam{ privateIntegerpage;privateInte......
  • 微信小程序开发的聚合函数排序.aggregate.sort
    //普通查询用.orderBy('add_time','desc'),聚合查询用.sort({ins_time:-1})'usestrict';constdb=uniCloud.database()//对数据库的对象获取;exports.main=async(event,context)=>{ letstart=newDate().getTime(); constcollection=db......
  • PHP---开发常用助手函数
    在PHP项目开发过程中,常用的助手函数://获取用户浏览器类型functionget_user_bs($bs=null){if(!isset($_SERVER["HTTP_USER_AGENT"]))returnnull;$user_agent=strtolower($_SERVER["HTTP_USER_AGENT"]);//直接检测传递的值if($bs)returnstr......
  • 子查询、Concat 字符拼接 ,Cast截取小数位 函数使用
    selectqh.CaseId,(selectsh.CaseIdfromServiceQuot.dbo.Headershwhereqh.QutoNo=sh.HeaderNo),qh.ApplierDate,qh.BU,qh.Site,qh.HeaderNo,qh.Currency(selectsh.CustomerfromServiceQuot.dbo.Headershwhereqh.QutoNo=sh.HeaderNo),qh.PN......
  • Matlab获取鼠标坐标值的ginput()函数
    ​获取鼠标坐标值的第一种途径:利用Matlab7.0中figure的WindowButtonDownFcn属性。当你在图上按下鼠标的时候,可通过该属性定义一个回调程序。回调程序可以是一个有效的Matlab表达式或者一个M文件。那么为显示当前鼠标按下时的坐标值,我们可以将其定义为一个坐标获取和显示程序。......
  • SQL-聚合函数-550. 游戏玩法分析
    预备知识:1.date_add函数是一个用于在日期上添加指定时间间隔的函数,它的一般语法如下:DATE_ADD(date,INTERVALexpressionunit)date是指定的日期。expression是一个表示要添加的值的表达式。unit是时间单位,例如YEAR、MONTH、DAY、HOUR、MINUTE、SECOND等。例如:......