小於n且與n互素的整數個數 尤拉函式 的計算

2021-07-14 11:49:25 字數 1027 閱讀 5035

即計算1~n中與n互素的整數個數

互素就是無法被n整除的數("與p互素"和"不是p的倍數"是等價的)

所以第一種顯而易見的方法就是暴力列舉法,但效率太低。

第二種方法用唯一分解定律再運用容斥原理:

分解定律:分為n=p1^a1*p2^a2......pk^ak;

容斥原理:在計數時,要保證無一重複,無一遺漏。為了使重疊部分不被重複計算,在不考慮重疊的情況下,把包含於某內容中的所有物件的數目先計算出來,然後再把計數時重複計算的數目排斥出去,使得計算的結果既無遺漏又無重複,這種計數的方法稱為容斥原理。

也即是a∪b∪c=a+b+c-a∩b-b∩c-c∩a+a∩b∩c

於是可以總結出規律:偶數項相加,奇數項相減

所以1~n中與n互素的整數個數= n-p1,p2,p3,p4.....pk的倍數(即-n/p1-n/p2-n/p3...)

+p1*p2,p1*p3....的倍數(即n/(p1*p2)+n/(p1*p3)....)

- p1*p2*p3,p1*p2*p4.......的倍數(即-n/(p1*p2*p3)-n/(p1*p2*p4).....)以此類推

這個數算出來就是尤拉函式,即φ(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn);

嘗試展開這個公式就會發現與上面那個推導的式子一樣,假如從括號中任選乙個值出來乘就會發現偶數項為正,奇數項為負,且項與上式一樣;

對於求φ(n)只需迴圈計算得出值就好了

對於求1~n中所有尤拉函式的值不需要依次計算

#include#include#include#include#include#includeusing namespace std;

void phi_table(int n,int *phi)

}int main()

{ int phi[100+5];

phi_table(100,phi);

for(int i=1;i<=100;i++)

cout<

204統計小於N的質數個數

統計小於n的質數個數 統計所有小於非負整數 n 的質數的數量。示例 輸入 10 輸出 4 解釋 小於 10 的質數一共有 4 個,它們是 2,3,5,7class solution def countprimes self,n int int import math def judge num l ...

小於n與n互質的所有數的和(尤拉函式 快速冪)

尤拉函式的含義 對於正整數n,n 的值表示 小於n並且與n互質 的整數 個數。尤拉函式公式 x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有質因數,x是不為0的整數。性質 1.1 1 2.對於素數p,p p 1 3.小於n並與n互質的數的和...

尤拉函式(求與n互質的數的個數)

求解與n 1 n 1 互質的質因子的個數 注釋 解析 定義 對於正整數 n,n 是小於或等於 n的正整數中,與 n互質的數的數目。例如 8 4,因為1,3 5,7 均和8互質。性質 1.若 p是質數,p p 1.2.若n是質數p的 k次冪,n p 1 p k 1 因為除了 p的倍數都與 n互質 p ...