【欧拉函数】

在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler’s totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。

【证明】: 
设A, B, C是跟m, n, mn互质的数的集,据中国剩余定理,A*B和C可建立一一对应的关系。因此φ(n)的值使用算术基本定理便知, 
若 
n= ∏p^(α(下标p))p|n 
则φ(n)=∏(p-1)p^(α(下标p)-1)=n∏(1-1/p) 
p|n p|n 
例如φ(72)=φ(2^3×3^2)=(2-1)2^(3-1)×(3-1)3^(2-1)=24,与欧拉定理、费马小定理的关系,对任何两个互质的正整数a, m, m>=2有a^φ(m)≡1(mod m)即欧拉定理:当m是质数p时,此式则为:a^(p-1)≡1(mod m)即费马小定理。(慢慢理解~~) 
代码实现:(写一遍欧拉函数,加深印象!) 
在线版:

 #include <bits/stdc++.h>
using namespace std;
int eular(int n)
{
int res=;
for(int i=;i*i<=n;i++){
if(n%i==){
n/=i,res*=i-;//保证i一定是素数
while(n%i==)
n/=i,res*=i;
}
}
if(n>)
res*=n-;
return res;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
printf("%d\n",eular(n));
}
return ;
}

预处理:

 #include <bits/stdc++.h>
using namespace std;
const int N=le5+;
int phi[N];
void pre_eular()
{
phi[]=;
for(int i=; i<N; i++)
{
if(!phi[i])
{
for(int j=i; j<N; j+=i)
{
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-);
}
}
}
}

欧拉函数的和:phi_sum(n) = the sum of phi(i) where gcd(i,n) = 1 and 1 <= i <= n 
1)phi_sum(n) = n * phi(n) / 2 (n >= 2) 
2)phi_sum(n) = 1 (n == 1)

线性筛:该算法在可在线性时间内筛素数的同时求出所有数的欧拉函数。

需要用到如下性质(p为质数):

. phi(p)=p-   因为质数p除了1以外的因数只有p,故1至p的整数只有p与p不互质

. 如果i mod p = , 那么phi(i * p)=p * phi(i)  证明如下

(上述证明存在bug。。感谢@PrimaryOIer指教)

上面的过程证明了从区间[,i]->[i+,i+i],若整数n不与i互质,n+i依然与i不互质。下面给出另一个证明:若整数n与i互质,n+i与i依然互质

.若i mod p ≠,  那么phi(i * p)=phi(i) * (p-)

    i mod p 不为0且p为质数, 所以i与p互质, 那么根据欧拉函数的积性phi(i * p)=phi(i) * phi(p) 其中phi(p)=p-1即第一条性质
 #include<iostream>
#include<cstdio>
#define N 40000
using namespace std;
int n;
int phi[N+],prime[N+],tot,ans; //phi - 欧拉函数的值 , prime - 素因子的值
bool mark[N+];
void getphi()
{
int i,j;
phi[]=;
for(i=;i<=N;i++)//相当于分解质因式的逆过程
{
if(!mark[i])
{
prime[++tot]=i;//筛素数的时候首先会判断i是否是素数。
phi[i]=i-;//当 i 是素数时 phi[i]=i-1
}
for(j=;j<=tot;j++)
{
if(i*prime[j]>N) break;
mark[i*prime[j]]=;//确定i*prime[j]不是素数
if(i%prime[j]==)//接着我们会看prime[j]是否是i的约数
{
phi[i*prime[j]]=phi[i]*prime[j];break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-);//其实这里prime[j]-1就是phi[prime[j]],利用了欧拉函数的积性
}
}
}
int main()
{
getphi();
}

欧拉函数(小于或等于n的数中与n互质的数的数目)&& 欧拉函数线性筛法的更多相关文章

  1. C. Book Reading 求在[1,n]中的数中,能整除m的数 的个位的和

    C. Book Reading time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. 证明RSA算法在明文和公私钥中N不互质情况下仍然成立

    关于RSA的基础过程介绍 下文中的 k 代表自然数常数,不同句子,公式中不一定代表同一个数 之前接触RSA,没有过多的思考证明过程,今天有感而发,推到了一遍 假设公钥 (e, N) , 私钥 (d, ...

  3. hdu-4135 Co-prime---容斥定理经典&&求1-m中与n互质的数目

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4135 题目大意: 求区间[a, b]中与N互质的数目. 解题思路: 首先对n求出所有素因子. 对于区 ...

  4. 一个简单的公式——求小于N且与N互质的数的和

    首先看一个简单的东西. 若$gcd(i,n)=1$,则有$gcd(n-i,n)=1$ 于是在小于$n$且与$n$互质的数中,$i$与$n-i$总是成对存在,且相加等于$n$. 考虑$i=n-i$的特殊 ...

  5. 求N以内与N互质的数的和

    题目连接 /* 求所有小于N且与N不互质的数的和. 若:gcd(n,m)=1,那么gcd(n,n-m)=1; sum(n)=phi(n)*n/2; //sum(n)为小于n的所有与n互质的数的和 // ...

  6. poj2773求第K个与m互质的数

    //半年前做的,如今回顾一下,还是有所收货的,数的唯一分解,.简单题. #include<iostream> #include<cstring> using namespace ...

  7. 求小于n且与n互质的数的个数

    int eu(int n){ int ans=n; for(int i=2;i*i<=n;i++) { if(n%i==0) { ans=ans/i*(i-1); while(n%i==0)n/ ...

  8. BOJ 2773 第K个与m互质的数

    算法是关键,得出1-m内的互质数,然后类推计算即可.下面有详细说明. #include<iostream> #include<cstring> using namespace ...

  9. 求1-n 中与 m 互质的素因子 (容斥原理)

    ll prime[100]; ll cnt; void getprime(){ cnt = 0; ll num = m; for(ll i = 2; i*i <= m; i++){ // sqr ...

随机推荐

  1. mysql快速生成truncate脚本清空数据库表记录

    语句格式: select CONCAT('truncate TABLE ',table_schema,'.',TABLE_NAME, ';') from INFORMATION_SCHEMA.TABL ...

  2. 洗礼灵魂,修炼python(31)--面向对象编程(1)—面向对象,对象,类的了解

    面向对象 1.什么是面向对象 (图片来自网络) 哈哈,当然不是图中的意思. 1).面向对象(Object Oriented,OO)是软件开发方法.利用各大搜索引擎得到的解释都太官方,完全看不懂啥意思对 ...

  3. VS 函数,方法上方 引用等显示

    VS有一个这个功能贼好用,喜欢的可以打开看看哦,特别是团队开发,有惊喜哦!

  4. Django电商项目---完成用户中心(订单中心+收货地址)day7

    完成用户中心(收货地址) df_user/views.py df_user/urls.py templates/df_user/user_center_site.html 界面显示 完成用户中心(全部 ...

  5. Django电商项目---完成购物车页面day4

    创建购物车项目App python manage.py startapp df_cart 初始化项目: manas/urls.py manas/settings.py 创建新文件:df_cart/ur ...

  6. 关于解决JetBrains 激活问题

    今天升级了下JetBrains 的一系列产品,安装后打开发现以前的激活失效了. 在网上看到网友们各类屏蔽和寻找服务器,尝试了下都不太方便. 最后去rover的个人博客看了下,很给力,总能跟上JetBr ...

  7. 【PAT】B1064 朋友数(20 分)

    以前写的,逻辑不好,过后再改 #include<stdio.h> #include<algorithm> #include<math.h> using namesp ...

  8. Django框架的使用教程--站点的管理[七]

    Django的站点管理 创建超级管理员命令(密码要8位) python manage.py createsuperuser 进入站点管理 注册模型类 from django.contrib impor ...

  9. Linux 小知识翻译 - 「端口和端口号」

    这次说说「端口」和「端口号」. 平时经常会听人说「打开了80号端口」,为了安全「不要打开多余的端口」等等.那么,这里的端口或者端口号是什么呢? 首先,「端口」是TCP或者UDP上使用的概念,经常被比喻 ...

  10. [原创]Javascript模拟“类”的综合实现方式以及部分细节【截至ES6】

    [原创]Javascript模拟“类”的综合实现方式以及部分细节[截至ES6] 前言   最近几个旧项目里使用的图片编辑插件出现Bug, 经Review 后确定需要在其内外均做些改动,但是头疼的发现部 ...