求小於n的數里,與n互為素數的個數
一.
奇數和偶數是否一定互素(排除1,不是比如6和9);1和不和任意數互素(比如6采用歐拉定理驗證下)。
若n已經進行唯一分解,直接歐拉公式。
如果n的標准素因子分解式是p1^a1*p2^a2*……*pm^am,其中眾pj(j=1,2,……,m)都是素數,而且兩兩不等。則有 φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm) 利用容斥原理可以證明它。
二.不知唯一分解
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 5 int main() 6 { 7 int n,i; 8 double sum; 9 while(scanf("%d",&n)&&n) 10 { 11 sum=n; 12 //還是運用了歐拉公式 13 if(n%2==0)//2也是素數 14 { 15 sum*=(double)(1 - 1.0/2);//為了突出關系寫成了 (1 - 1.0/2) ,里面一定是1.0 16 while(n%2==0) 17 n/=2; 18 } 19 20 /*類似篩法的思想,已經去掉了2及其倍數,下面找奇因子,必須從小到大枚舉, 21 3枚舉到的話立馬除盡3及其倍數防止再次枚舉9(這樣就不對了) 22 */ 23 for(i=3;n>1;i+=2) 24 { 25 if(n%i==0) 26 sum*=(1-(double)1/i); 27 while(n%i==0) 28 n/=i; 29 } 30 printf("%d\n",(int)sum); 31 } 32 //while(1); 33 return 0; 34 }