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

欧拉函数

时间:2023-06-28 22:34:14浏览次数:90  
标签:frac 函数 int res varphi 互质 欧拉

欧拉函数

  • 定义
    对于正整数n小于等于n的数中与n互质的数的个数记为$\varphi(n)$,即为欧拉函数
  • 欧拉公式
    由算数基本定理任意一个正整数都可以写作n=$p_1{a_1}p_2{a_2}\cdots p_k{ak}$
    那么$\varphi(n)=n\prod\limits_{i=1}^{k}({1-\frac{1}{p_i}})$
  • 数学证明
    首先$\varphi(n)$是一个积性函数
    即 $\varphi(a_1a_2)=\varphi(a_1)\varphi(a_2)$这个的证明这里不作叙述可看这个链接积性证明
    然后从1到一个数$p_n{a_n}$一共有$p_n{a_n}$个数其中与其不互质的有$p_n,2p_n,3p_n\dots p_n{a_n}(p_n{a_{n-1}}p_n)$一共有$p_n{a_{n-1}}$个数,所以与其互质的一共有$p_n{a_n}(1-\frac{1}{p_n})个$
    所以有:
    $$
    \varphi(n)=\varphi(p_1{a_1})*\varphi(p_2{a_2})\dots\varphi(p_k^{a_k})\
    =p_1{a_1}(1-\frac{1}{p_1})*p_2{a_2}(1-\frac{1}{p_2})\dots
    p_k{a_k}\=n*\prod\limits_{i=1}{k}(1-\frac{1}{p_i})
    $$
  • 代码实现
#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int a;
        scanf("%d",&a);
        int res=a;
        for(int i=2;i<=a/i;i++)
        {
            if(a%i==0)
            {
                res=res/i*(i-1);//注意先除再乘防止爆int
            }
            while(a%i==0)
            {
                a/=i;
            }
        }
        if(a>1)
        {
            res=res/a*(a-1);
        }
        printf("%d\n",res);
    }
    
    
    return 0;
}
  • 代码细节
    注意res=res/i*(i-1)这里要先除再乘防止爆int 可能会有疑问我们推导的公式中$1-\frac{1}{p_i}$是一个小数但是c++里/是向下取整的,那么这里会不会有问题呢?其实是完全没问题的 我们可以看到只有当a%i==0时我们才会进行res的操作并且每次循环中a至少都和res除i除的一样多也就是说只要a中有约数 i 那么res中也一定有 i 一定不会出现小数。

Written with StackEdit中文版.

标签:frac,函数,int,res,varphi,互质,欧拉
From: https://www.cnblogs.com/Taco-gu/p/17512716.html

相关文章

  • 函数
       ......
  • bc-liunx欧拉编译安装nginx
    1、下载nginx包上次至目标服务器2、解压包3、安装依赖包yuminstall-ypcrepcre-develpcrepcre-developensslopenssl-develzlibzlib-develgdgd-devel4、编译安装nginx,这里记住nginx不要放在和编译路径一个文件夹,不然会报错,一下是编译命令与建议参数./configure--prefix......
  • JavaScript学习 -- 内置函数(Math和Date)
    一、Date函数letdate=newDate()console.log("当前日期和时间:"+date)console.log("当前日期和时间:"+date.toLocaleString())console.log("年份:"+date.getFullYear())console.log("月份:"+(parseInt(date.getMonth())+1))console.log("日:"......
  • Vue.js 渲染函数和 JSX
    学习目录:Vue.js简介Vue.js实例与数据绑定Vue.js计算属性和侦听器Vue.js条件渲染和列表渲染Vue.js事件处理Vue.js表单输入绑定Vue.js组件基础Vue.js组件通信Vue.js插槽Vue.js动态组件和异步组件Vue.js自定义指令Vue.js过渡和动画Vue.js混入Vue.js自定义事件和v-model......
  • [重要] 用python写一个可变长参数的累加函数
    [重要]用python写一个可变长参数的累加函数━━━━━━━━━━━━━━━━━━━━━━你可以使用Python的可变长度参数*args来编写一个可以接受任意数量参数的累加函数。这样的函数定义如下:defsum(*args):#passreturnsum(args)━━━━━━━━━━━━━......
  • 举例说明exec()函数的用法
    举例说明exec()函数的用法━━━━━━━━━━━━━━━━━━━━━━━━━exec()函数可以用于执行一段字符串作为代码,这在某些场景下非常有用。以下是一些exec()函数的用法示例:动态执行Python代码:code_str='print("Hello,World!")'exec(code_str)在这个例子中......
  • [重要] python 之 print() 函数高级用法
    python之print()函数高级用法━━━━━━━━━━━━━━━━━━━━━━语法:print(value,...,sep='',end='\n',file=sys.stdout,flush=False)这是Python的内置函数print()的语法格式,其作用是将一个或多个对象打印到控制台或文件中。参数说明:value:要打印的对象,可以是一......
  • pyqt5:槽函数里加线程
    参考:(17条消息)PyQt5在textBrowser添加文本并自动滑动到底_pyqt5textbrowser_SQZHAO的博客-CSDN博客   ......
  • 开窗函数
    开窗函数开窗函数对一组值进行操作,它不像普通聚合函数那样需要使用GROUPBY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列开窗函数的语法形式为:函数+over(partitionby<分组用列>orderby<排序用列>),表示对数据集按照分组用列进行分区,并且并且对每个分区按照......
  • 去往js函数式编程(8)完
    冻结  如果我们希望避免程序员意外或故意修改对象的可能性,冻结对象是一个有效的解决方案。在对象被冻结之后,任何修改它的尝试都会静默失败。javascript不会报告错误或抛出异常,但也不会修改对象。这种解决方案只有一个问题:冻结对象是一个浅层操作,它仅冻结属性本身,类似于const......