日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于欧拉函数

發(fā)布時(shí)間:2025/4/16 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于欧拉函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歐拉函數(shù),
對(duì)正整數(shù)n,歐拉函數(shù)是少于或等于n的數(shù)中與n互質(zhì)的數(shù)的數(shù)目。

這是我在ACM隊(duì)內(nèi)訓(xùn)練賽的時(shí)候遇到的一個(gè)函數(shù),其實(shí)最初是在離散數(shù)學(xué)課本上了解到了這個(gè)函數(shù),但是當(dāng)時(shí)并沒有留下太深的印象,現(xiàn)在總結(jié)一下。
首先要知道歐拉函數(shù)的公式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn)
其中p1,p2,p3是x的所有質(zhì)因子。

1.第一種算法:
直接求法:
暴力遍歷x的所有質(zhì)因子直接求解:

int euler(int n){ //返回euler(n) int res=n,a=n; for(int i=2;i*i<=a;i++){ if(a%i==0){ res=res/i*(i-1);//先進(jìn)行除法是為了防止中間數(shù)據(jù)的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; }

其中while(a%i==0) a/=i;?是在進(jìn)行保證可以整除的是素?cái)?shù)的過程。
另外,for(int i=2;i*i<=a;i++)也利用了素?cái)?shù)篩選法的思想。

2.第二種算法:
篩選法打表求歐拉函數(shù)

#define Max 1000001 int euler[Max]; void Init(){ euler[1]=1; for(int i=2;i<Max;i++) euler[i]=i; for(int i=2;i<Max;i++) if(euler[i]==i) for(int j=i;j<Max;j+=i) euler[j]=euler[j]/i*(i-1);//先進(jìn)行除法是為了防止中間數(shù)據(jù)的溢出 }

打表求值,不斷求得。

2017-06-26 17:43:32 星期一 更新
今天在《算法競(jìng)賽入門(第二版)》(紫書)上看到了一種利用類似與素?cái)?shù)篩選法的方法直接求由1~n的所有歐拉函數(shù)值的辦法。
給出代碼:

int pi[50001+10]; const int maxn=50001; int euler(int n) {memset(pi,0,sizeof(pi));pi[1]=1;for(int i=2;i<=n;i++)if(!pi[i]){for(int j=i;j<=n;j+=i){if(!pi[j])pi[j]=j;pi[j]=pi[j]/i*(i-1);}} }

利用這個(gè)辦法可以在nloglogn的復(fù)雜度內(nèi)求得由1到n的所有歐拉函數(shù)值。

2017-08-09 ?12:48:12

新增一些歐拉函數(shù)的性質(zhì):

1.如果一個(gè)數(shù)x是素?cái)?shù),則該數(shù)的歐拉函數(shù)值為x-1。

2.若m,n互質(zhì),

3.當(dāng)n為奇數(shù)時(shí),

轉(zhuǎn)載于:https://www.cnblogs.com/DLKKILL/p/7245254.html

總結(jié)

以上是生活随笔為你收集整理的关于欧拉函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。