欧拉函数
来源:互联网 发布:mysql dba是什么意思 编辑:程序博客网 时间:2024/06/01 09:40
欧拉函数
在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler’so totient function),它又称为Euler’s totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。
目录
- ▪简介
- 1证明
- 2编程实现
- ▪C++版
- ▪pascal版
- ▪C语言
- ▪Java语言
- 3函数表
欧拉函数简介
通式:
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。
注意:每种质因数只一个。 比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
若n是质数p的k次幂,,因为除了p的倍数外,其他数都跟n互质。
设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值
φ:N→N,n→φ(n)称为欧拉函数。
欧拉函数是积性函数——若m,n互质,
特殊性质:当n为奇数时,, 证明与上述类似。
若n为质数则
欧拉函数证明
编辑设A, B, C是跟m, n, mn互质的数的集,据中国剩余定理,A*B和C可建立一一对应的关系。因此φ(n)的值使用算术基本定理便知,
若
则
例如
与欧拉定理、费马小定理的关系
对任何两个互质的正整数a, m(m>=2)有
即欧拉定理
当m是质数p时,此式则为:
即费马小定理。
欧拉函数编程实现
编辑利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。
欧拉函数和它本身不同质因数的关系:
欧拉函数ψ(N)=N{∏p|N}(1-1/p)
亦即: (P是数N的质因数)
如:
ψ(10)=10×(1-1/2)×(1-1/5)=4;
ψ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
ψ(49)=49×(1-1/7)= =42。
欧拉函数C++版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/
int
m[maxn],phi[maxn],p[maxn],pt;
//m[i]是i的最小素因数,p是素数,pt是素数个数
int
make()
{
phi[1]=1;
int
N=maxn;
int
k;
for
(
int
i=2;i<N;i++)
{
if
(!m[i])
//i是素数
p[pt++]=m[i]=i,phi[i]=i-1;
for
(
int
j=0;j<pt&&(k=p[j]*i)<N;j++)
{
m[k]=p[j];
if
(m[i]==p[j])
//为了保证以后的数不被再筛,要break
{
phi[k]=phi[i]*p[j];
/*这里的phi[k]与phi[i]后面的∏(p[i]-1)/p[i]都一样(m[i]==p[j])只差一个p[j],就可以保证∏(p[i]-1)/p[i]前面也一样了*/
break
;
}
else
phi[k]=phi[i]*(p[j]-1);
//积性函数性质,f(i*k)=f(i)*f(k)
}
}
}
欧拉函数pascal版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const
maxn
=
10000
;
sqrtn
=
trunc(sqrt(maxn));
var
i,j,n,si:longint;
fi:array[
1.
.maxn] of longint;
hash
:array[
1.
.sqrtn] of boolean;
ssb:array[
1.
.sqrtn] of longint;
procedure yuchuli;
var
i,j,daili:longint;
pd:boolean;
begin
fillchar(
hash
,sizeof(
hash
),false);
i:
=
2
;
si:
=
0
;
while
i<
=
sqrt(n) do
begin
if
not
hash
[i] then
begin
for
j:
=
i
+
1
to sqrt(ndivi) do
hash
[i
*
j]:
=
true;
inc(si);
ssb[si]:
=
i;
end;
inc(i);
end;
for
i:
=
1
to maxn do fi[i]:
=
1
;
for
i:
=
2
to maxn do
begin
daili:
=
i;
for
j:
=
1
to si do
begin
pd:
=
false;
while
daili mod ssb[j]
=
0
do
begin
daili:
=
daili div ssb[j];
if
not
pd then fi[i]:
=
fi[i]
*
(ssb[j]
-
1
)
else
fi[i]:
=
fi[i]
*
ssb[j];
pd:
=
true;
end;
end;
if
daili<>
1
then fi[i]:
=
fi[i]
*
(daili
-
1
);
end;
end;
begin
yuchuli;
readln(n);
writeln(fi[n]);
end.
欧拉函数C语言
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<stdlib.h>
int
eular(
int
n)
{
int
ret=1,i;
for
(i=2;i*i<=n;i++)
{
if
(n%i==0)
{
n/=i,ret*=i-1;
while
(n%i==0) n/=i,ret*=i;
}
}
if
(n>1) ret*=n-1;
return
ret;
}
int
main ()
{
int
n,s;
scanf
(
"%d"
,&n);
s=eular(n);
printf
(
"%d"
,s);
return
0;
}
欧拉函数Java语言
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Scanner;
public
class
Oula {
public
static
void
main(String[] args){
Scanner scanner=
new
Scanner(System.in);
int
num=scanner.nextInt();
int
a=num;
double
oulaAnwser=
0
;
ArrayList<Integer> oulaList =
new
ArrayList<Integer>();
if
(isPrime(num)){
oulaAnwser=num-
1
;
}
else
{
List<Integer> allPrime = getAllPrime(num);
for
(
int
i : allPrime){
int
tem=num;
num=repeatdivide(num,i);
if
(tem!=num){
oulaList.add(i);
}
}
oulaAnwser=a;
for
(
int
j :oulaList){
oulaAnwser=oulaAnwser*(
1
-(
double
)
1
/j);
}
}
System.out.println(
"欧拉函数的值为"
+Math.round(oulaAnwser));
}
public
static
List<Integer> getAllPrime(
int
num){
ArrayList<Integer> result =
new
ArrayList<Integer>();
for
(
int
i =
2
;i<num;i++){
if
(isPrime(i)) {
result.add(i);
}
}
return
result;
}
public
static
boolean
isPrime(
int
num){
if
(num <
2
) {
return
false
;
}
for
(
int
i =
2
; i <= Math.sqrt(num); i++ ) {
if
(num%i ==
0
) {
return
false
;
}
}
return
true
;
}
public
static
boolean
canbedivide(
int
num,
int
i ){
return
num==
1
?
false
:num%i==
0
?
true
:
false
;
}
public
static
int
repeatdivide(
int
num,
int
i ){
int
result=
0
;
if
(canbedivide(num,i)){
result=repeatdivide(num/i,i);
}
else
{
return
num;
}
return
result;
}
}
欧拉函数函数表
编辑φ(100)=40
词条标签:
阅读全文
1 0
- 欧拉函数
- 欧拉函数
- Relatives 【欧拉函数】
- 欧拉函数
- POJ_2407_欧拉函数
- 欧拉函数
- hdu_3501_欧拉函数
- 欧拉函数
- 欧拉函数
- 欧拉函数
- 欧拉函数
- 欧拉函数
- 欧拉函数
- 欧拉函数应用
- 欧拉函数
- 欧拉函数
- 欧拉函数
- ACM-欧拉函数
- CUDA Samples: 获取设备属性信息
- poj 3264 Balanced Lineup
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- Android系统剪裁后卸载APK失败重启系统
- 如何用一句话证明你学过编程
- 欧拉函数
- 官方微信红包课:对中小平台获取新用户的6个启示
- 阿里云云虚拟主机上个人网站的Https访问配置
- 脏读,不可重复读,幻读,丢失更新(乐观锁,悲观锁)
- mybatis invalid comparison: java.sql.Timestamp and java.lang.String
- 使用ToolRunner运行Hadoop作业的原理及用法
- OkHttp使用(一)——GET请求
- WampServer可以访问IP,但无法访问localhost
- SpringMVC拦截器:登录拦截器