尤拉函式入門
在數論,對正整數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;
}
}
相關文章
- 尤拉函式φ函式
- 淺談尤拉函式函式
- 尤拉函式的應用函式
- 尤拉函式性質和模版函式
- 轉載:尤拉函式知識點總結及程式碼模板及尤拉函式表函式
- B.日記和尤拉函式函式
- Note -「因數的尤拉函式求和」函式
- [藍橋杯][演算法提高VIP]尤拉函式演算法函式
- §3. 復變數的指數函式·尤拉公式變數函式公式
- 紫書 例題 10-27 UVa 10214(尤拉函式)函式
- 尤拉計劃700:尤拉幣
- 尤拉函式、整除分塊和擴充套件歐幾里得函式套件
- 11函式入門函式
- 生成函式入門函式
- 前端入門——函式前端函式
- Python入門-函式Python函式
- 尤拉方程
- 尤拉定理
- 尤拉篩
- P2303 [SDOI2012] Longge 的問題(尤拉函式,推式子)函式
- python入門:range函式Python函式
- PHP入門之函式PHP函式
- 集合與函式入門函式
- 素數個數 <埃式篩 && 尤拉篩>
- 尤拉公式——真正的宇宙第一公式公式
- 尤拉路徑
- 尤拉降冪
- [譯] 函式式 JavaScript 快速入門函式JavaScript
- day07-函式入門函式
- 3.JavaScript函式入門JavaScript函式
- JavaScript入門-函式function(二)JavaScript函式Function
- python-函式入門(一)Python函式
- python入門必會的助手函式:dir()函式Python函式
- 尤拉公式 - 筆記公式筆記
- 【圖論】尤拉圖圖論
- 數論函式從入門到進門函式
- C++入門記-建構函式和解構函式C++函式
- 函式式DDD架構入門 - SCOTT WLASCHIN函式架構