尤拉函式入門

一葉之修發表於2019-03-06

數論,對正整數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;
    }
}

 

 

相關文章