歐拉函數(shù)(資料+模板)
http://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%87%BD%E6%95%B0
歐拉函數(shù) :
歐拉函數(shù)是數(shù)論中很重要的一個函數(shù),歐拉函數(shù)是指:對于一個正整數(shù) n ,小于 n 且和 n 互質(zhì)的正整數(shù)(包括 1)的個數(shù),記作 φ(n) 。
完全余數(shù)集合:
定義小于 n 且和 n 互質(zhì)的數(shù)構(gòu)成的集合為 Zn ,稱呼這個集合為 n 的完全余數(shù)集合。 顯然 |Zn| =φ(n) 。
有關(guān)性質(zhì):
對于素數(shù) p ,φ(p) = p -1 。
對于兩個不同素數(shù) p, q ,它們的乘積 n = p * q 滿足 φ(n) = (p -1) * (q -1) 。
這是因為 Zn = {1, 2, 3, ... , n - 1} - {p, 2p, ... , (q - 1) * p} - {q, 2q, ... , (p - 1) * q} , 則 φ(n) = (n - 1) - (q - 1) - (p - 1) = (p -1) * (q -1) =φ(p) * φ(q) 。
歐拉定理 :
對于互質(zhì)的正整數(shù) a 和 n ,有 aφ(n) ≡ 1 mod n 。
證明:
( 1 ) 令 Zn = {x1, x2, ..., xφ(n)} , S = {a * x1 mod n, a * x2 mod n, ... , a * xφ(n) mod n} ,
則 Zn = S 。
① 因為 a 與 n 互質(zhì), xi (1 ≤ i ≤ φ(n)) 與 n 互質(zhì), 所以 a * xi 與 n 互質(zhì),所以 a * xi mod n ∈ Zn 。
② 若 i ≠ j , 那么 xi ≠ xj,且由 a, n互質(zhì)可得 a * xi mod n ≠ a * xj mod n (消去律)。
( 2 ) aφ(n) * x1 * x2 *... * xφ(n) mod n
≡ (a * x1) * (a * x2) * ... * (a * xφ(n)) mod n
≡ (a * x1 mod n) * (a * x2 mod n) * ... * (a * xφ(n) mod n) mod n
≡ x1 * x2 * ... * xφ(n) mod n
對比等式的左右兩端,因為 xi (1 ≤ i ≤ φ(n)) 與 n 互質(zhì),所以 aφ(n) ≡ 1 mod n (消去律)。
注:
消去律:如果 gcd(c,p) = 1 ,則 ac ≡ bc mod p ⇒ a ≡ b mod p 。
費馬定理 :
若正整數(shù) a 與素數(shù) p 互質(zhì),則有 ap - 1 ≡ 1 mod p 。
這個是歐拉定理的特殊情況,p是素數(shù),則p的歐拉函數(shù)就是p-1.
補充:歐拉函數(shù)公式
轉(zhuǎn)自:http://blog.csdn.net/hillgong/article/details/4214327
以下程序在http://acm.hrbeu.edu.cn/index.php?act=problem&id=1001&cid=25測試通過:
Compile Error 一次 WA兩次 AC:3Ms
總結(jié):代碼要寫得快,熟練。一定要注意注意越界溢出啊啊啊啊!!!
#include<stdio.h>
#include<string.h>
#include<math.h>
#define inf 50000
int prime[10005],b[51005],tot;
int get_prime()
{
int i,j;
memset(b,0,sizeof(b));
tot=0;
i=2;
while (i<inf)
{
while (b[i]) i++;
prime[++tot]=i;
j=i;
while (j<inf)
{
b[j]=1;
j+=i;
}
}
tot--;
}

int main()
{
int i,j,k,p,n,m;
long long ans; //這里之前溢出 wa 2次!
get_prime();
while (scanf("%d",&n)==1&&n)
{
ans=m=n;
i=1;
while (i<=tot)
{
if (n%prime[i]==0)
{
ans=ans*(prime[i]-1)/prime[i];
while (n%prime[i]==0)
n=n/prime[i];
}
i++;
}
if (n>prime[tot])
ans=ans*(n-1)/n;
printf("%lld\n",ans);
}
return 0;
}

做了好幾天數(shù)論了,好不容易AC一個題目!!啊啊啊啊
歐拉函數(shù) :
歐拉函數(shù)是數(shù)論中很重要的一個函數(shù),歐拉函數(shù)是指:對于一個正整數(shù) n ,小于 n 且和 n 互質(zhì)的正整數(shù)(包括 1)的個數(shù),記作 φ(n) 。
完全余數(shù)集合:
定義小于 n 且和 n 互質(zhì)的數(shù)構(gòu)成的集合為 Zn ,稱呼這個集合為 n 的完全余數(shù)集合。 顯然 |Zn| =φ(n) 。
有關(guān)性質(zhì):
對于素數(shù) p ,φ(p) = p -1 。
對于兩個不同素數(shù) p, q ,它們的乘積 n = p * q 滿足 φ(n) = (p -1) * (q -1) 。
這是因為 Zn = {1, 2, 3, ... , n - 1} - {p, 2p, ... , (q - 1) * p} - {q, 2q, ... , (p - 1) * q} , 則 φ(n) = (n - 1) - (q - 1) - (p - 1) = (p -1) * (q -1) =φ(p) * φ(q) 。
歐拉定理 :
對于互質(zhì)的正整數(shù) a 和 n ,有 aφ(n) ≡ 1 mod n 。
證明:
( 1 ) 令 Zn = {x1, x2, ..., xφ(n)} , S = {a * x1 mod n, a * x2 mod n, ... , a * xφ(n) mod n} ,
則 Zn = S 。
① 因為 a 與 n 互質(zhì), xi (1 ≤ i ≤ φ(n)) 與 n 互質(zhì), 所以 a * xi 與 n 互質(zhì),所以 a * xi mod n ∈ Zn 。
② 若 i ≠ j , 那么 xi ≠ xj,且由 a, n互質(zhì)可得 a * xi mod n ≠ a * xj mod n (消去律)。
( 2 ) aφ(n) * x1 * x2 *... * xφ(n) mod n
≡ (a * x1) * (a * x2) * ... * (a * xφ(n)) mod n
≡ (a * x1 mod n) * (a * x2 mod n) * ... * (a * xφ(n) mod n) mod n
≡ x1 * x2 * ... * xφ(n) mod n
對比等式的左右兩端,因為 xi (1 ≤ i ≤ φ(n)) 與 n 互質(zhì),所以 aφ(n) ≡ 1 mod n (消去律)。
注:
消去律:如果 gcd(c,p) = 1 ,則 ac ≡ bc mod p ⇒ a ≡ b mod p 。
費馬定理 :
若正整數(shù) a 與素數(shù) p 互質(zhì),則有 ap - 1 ≡ 1 mod p 。
這個是歐拉定理的特殊情況,p是素數(shù),則p的歐拉函數(shù)就是p-1.
補充:歐拉函數(shù)公式
( 1 ) pk 的歐拉函數(shù)
對于給定的一個素數(shù) p , φ(p) = p -1。則對于正整數(shù) n = pk ,
φ(n) = pk - pk -1
證明:
小于 pk 的正整數(shù)個數(shù)為 pk - 1個,其中
和 pk 不互質(zhì)的正整數(shù)有{p * 1,p * 2,...,p * (pk - 1-1)} 共計 pk - 1 - 1 個
所以 φ(n) = pk - 1 - (pk - 1 - 1) = pk - pk - 1 。
( 2 ) p * q 的歐拉函數(shù)
假設(shè) p, q是兩個互質(zhì)的正整數(shù),則 p * q 的歐拉函數(shù)為
φ(p * q) = φ(p) * φ(q) , gcd(p, q) = 1 。
證明:
令 n = p * q , gcd(p,q) = 1
根據(jù)中國余數(shù)定理,有
Zn 和 Zp × Zq 之間存在一一映射
(我的想法是: a ∈ Zp , b ∈ Zq ⇔ b * p + a * q ∈ Zn 。)
所以 n 的完全余數(shù)集合的元素個數(shù)等于集合 Zp × Zq 的元素個數(shù)。
而后者的元素個數(shù)為 φ(p) * φ(q) ,所以有
φ(p * q) = φ(p) * φ(q) 。
( 3 ) 任意正整數(shù)的歐拉函數(shù)
任意一個整數(shù) n 都可以表示為其素因子的乘積為:
I
n = ∏ piki (I 為 n 的素因子的個數(shù))
i=1
根據(jù)前面兩個結(jié)論,很容易得出它的歐拉函數(shù)為:
I I
Φ(n) = ∏ piki -1(pi -1) = n ∏ (1 - 1 / pi)
i=1 i=1
對于任意 n > 2,2 | Φ(n) ,因為必存在 pi -1 是偶數(shù)。
轉(zhuǎn)自:http://blog.csdn.net/hillgong/article/details/4214327
以下程序在http://acm.hrbeu.edu.cn/index.php?act=problem&id=1001&cid=25測試通過:
Compile Error 一次 WA兩次 AC:3Ms
總結(jié):代碼要寫得快,熟練。一定要注意注意越界溢出啊啊啊啊!!!
#include<stdio.h>
#include<string.h>
#include<math.h>
#define inf 50000
int prime[10005],b[51005],tot;
int get_prime()
{
int i,j;
memset(b,0,sizeof(b));
tot=0;
i=2;
while (i<inf)
{
while (b[i]) i++;
prime[++tot]=i;
j=i;
while (j<inf)
{
b[j]=1;
j+=i;
}
}
tot--;
}
int main()
{
int i,j,k,p,n,m;
long long ans; //這里之前溢出 wa 2次!
get_prime();
while (scanf("%d",&n)==1&&n)
{
ans=m=n;
i=1;
while (i<=tot)
{
if (n%prime[i]==0)
{
ans=ans*(prime[i]-1)/prime[i];
while (n%prime[i]==0)
n=n/prime[i];
}
i++;
}
if (n>prime[tot])
ans=ans*(n-1)/n;
printf("%lld\n",ans);
}
return 0;
}
做了好幾天數(shù)論了,好不容易AC一個題目!!啊啊啊啊
posted on 2012-04-21 17:28 wangs 閱讀(518) 評論(1) 編輯 收藏 引用 所屬分類: ACM-數(shù)學



