数论------欧拉函数
Posted q1204675546
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论------欧拉函数相关的知识,希望对你有一定的参考价值。
定义:
F(n)其的值为 x在区间【1,n-1】中满足gcd(x,n)等于1的x的数量 (即x与n互质的数目)
求值:
先对n‘进行唯一分解,取出所有质因数 F(n)=n*(1-1/P1)*(1-1/P2)...... * (1-1/Pn)
唯一分解定理:
任何一个整数n都可以写成 n = P1E1 * P2E2 ... * PNEn (其中p为质数,e为指数)
/*
性质:
1.假设n为素数,则F(n)=n-1
2.假设m,n互质,则F(n*m)=F(n)*F(m) (则也是积性函数的性质,特别重要)
3.假设n为奇数,则F(2*n)=F(n) 证明很简单,2与n互质,且F(2)=1,即:F(2*n)=F(n)*F(2)=F(n)
4.只有F(2)=1,其他F(n)的值都是偶数
5.一个数的所有质因子之和::(F(n)*n/2)
6.aF(n)%n=1(%n) (a,n互质)----->欧拉定理
对于性质6,当n为质数的时候,就变成了费马小定理了 an-1%n=1(%n)
*/
1 typedef long long ll; 2 ll euler(int n){ 3 ll ans=1; 4 for (ll i=2;i*i<=n;i++){ 5 if (n%i==0){ 6 ans*=(i-1); //因为欧拉函数也是积性函数 7 n/=i; 8 while (n%i==0){ 9 n/=i; 10 ans*=i; 11 } 12 } 13 } 14 if (n>1) ans*=(n-1); 15 return ans; 16 }
贴题:
hdu1286(模板题)
1 #include<iostream> 2 using namespace std; 3 typedef long long ll; 4 int eulor(int n){ 5 int sum=1; 6 for (int i=2;i*i<=n;i++){ 7 if (n%i==0){ 8 n/=i; 9 sum*=(i-1); 10 while (n%i==0){ 11 n/=i; 12 sum*=i; 13 } 14 } 15 } 16 if (n>1) sum*=(n-1); 17 return sum; 18 } 19 int main(){ 20 int t; 21 cin>>t; 22 while(t--){ 23 int n; 24 cin>>n; 25 cout<<eulor(n)<<endl; 26 } 27 return 0; 28 }
hdu2588
1 #include<iostream> 2 typedef long long ll; 3 using namespace std; 4 ll euler(int n){ 5 ll ans=1; 6 for (ll i=2;i*i<=n;i++){ 7 if (n%i==0){ 8 ans*=(i-1); 9 n/=i; 10 while (n%i==0){ 11 n/=i; 12 ans*=i; 13 } 14 } 15 } 16 if (n>1) ans*=(n-1); 17 return ans; 18 } 19 int main(){ 20 int t; 21 cin>>t; 22 while (t--){ 23 ll n,m,ans=0,i; 24 cin>>n>>m; 25 for (i=1;i*i<=n;i++){ 26 if (n%i==0){ 27 if (i>=m) 28 ans+=euler(n/i); 29 if (n/i>=m) 30 ans+=euler(i); 31 } 32 } 33 if (i>m&&(i-1)*(i-1)==n) ans-=euler(i-1); 34 cout<<ans<<endl; 35 } 36 37 return 0; 38 }
以上是关于数论------欧拉函数的主要内容,如果未能解决你的问题,请参考以下文章
数论之旅4---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭)