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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于欧拉函数

發布時間:2025/4/16 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于欧拉函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歐拉函數,
對正整數n,歐拉函數是少于或等于n的數中與n互質的數的數目。

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

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

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);//先進行除法是為了防止中間數據的溢出 while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; }

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

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

#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);//先進行除法是為了防止中間數據的溢出 }

打表求值,不斷求得。

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

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);}} }

利用這個辦法可以在nloglogn的復雜度內求得由1到n的所有歐拉函數值。

2017-08-09 ?12:48:12

新增一些歐拉函數的性質:

1.如果一個數x是素數,則該數的歐拉函數值為x-1。

2.若m,n互質,

3.當n為奇數時,

轉載于:https://www.cnblogs.com/DLKKILL/p/7245254.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。