尤拉函式入門
在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目(φ(1)=1)。此函式以其首名研究者尤拉命名(Euler's totient function),它又稱為Euler's totient function、φ函式、尤拉商數等。 例如φ(8)=4,因為1,3,5,7均和8互質。 從尤拉函式引伸出來在環論方面的事實和拉格朗日定理構成了尤拉定理的證明。
利用尤拉函式和它本身不同質因數的關係,用篩法計算出某個範圍內所有數的尤拉函式值。
尤拉函式和它本身不同質因數的關係:
尤拉函式ψ(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.若a為質數,phi[a]=a-1;
2.若a為質數,b mod a=0,phi[a*b]=phi[b]*a
3.若a,b互質,phi[a*b]=phi[a]*phi[b](當a為質數時,if b mod a!=0 ,phi[a*b]=phi[a]*phi[b])
*/
int m[n],phi[n],p[n],nump;
//m[i]標記i是否為素數,0為素數,1不為素數;p是存放素數的陣列;nump是當前素數個數;phi[i]為尤拉函式
int make()
{
phi[1]=1;
for (int i=2;i<=n;i++)
{
if (!m[i])//i為素數
{
p[++nump]=i;//將i加入素數陣列p中
phi[i]=i-1;//因為i是素數,由特性得知
}
for (int j=1;j<=nump&&p[j]*i<n;j++) //用當前已的到的素數陣列p篩,篩去p[j]*i
{
m[p[j]*i]=1;//可以確定i*p[j]不是素數
if (i%p[j]==0) //看p[j]是否是i的約數,因為素數p[j],等於判斷i和p[j]是否互質
{
phi[p[j]*i]=phi[i]*p[j]; //特性2
break;
}
else phi[p[j]*i]=phi[i]*(p[j]-1); //互質,特性3其,p[j]-1就是phi[p[j]]
}
}
}
java
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;
}
}
相關文章
- 尤拉函式φ函式
- 4939 尤拉函式函式
- 尤拉函式詳解函式
- poj 2478 尤拉函式函式
- 淺談尤拉函式函式
- 生成函式入門函式
- 前端入門——函式前端函式
- 11函式入門函式
- 尤拉函式性質和模版函式
- HDU2588GCD(尤拉函式)GC函式
- 轉載:尤拉函式知識點總結及程式碼模板及尤拉函式表函式
- PHP入門之函式PHP函式
- Python入門-函式Python函式
- 集合與函式入門函式
- [譯] 函式式 JavaScript 快速入門函式JavaScript
- Note -「因數的尤拉函式求和」函式
- bzoj2818: Gcd(尤拉函式)GC函式
- POJ 2478-Farey Sequence(尤拉函式)函式
- B.日記和尤拉函式函式
- 尤拉計劃512題(冪的尤拉總計函式和)函式
- python入門:range函式Python函式
- JavaScript入門-函式function(二)JavaScript函式Function
- 3.JavaScript函式入門JavaScript函式
- day07-函式入門函式
- POJ 2048 Longge's problem (尤拉函式 積性函式)函式
- HDU 4002Find the maximum(尤拉函式)函式
- POJ 2407-Relatives-尤拉函式函式
- 數論函式從入門到進門函式
- python入門必會的助手函式:dir()函式Python函式
- C++入門記-建構函式和解構函式C++函式
- 函式式DDD架構入門 - SCOTT WLASCHIN函式架構
- JavaScript 高階函式快速入門JavaScript函式
- python-函式入門(一)Python函式
- Python匿名函式快速入門Python函式
- SQL入門之3 函式2SQL函式
- SQL入門之2 函式1SQL函式
- PHP中的list()函式入門PHP函式
- C++入門教程(11):呼叫函式C++函式