Teoria dos números - explicação da função de Euler e modelo

Função de Euler: para qualquer inteiro positivo N, o número de inteiros positivos (incluindo 1) que são menores ou iguais a N ([1, N]) e relativamente primos a N é chamado de função de Euler a N, denotado como φ (n ) Nota: Coprime significa que os dois não têm fator comum diferente de 1.

É estipulado que φ (1) = 1.

As propriedades da função de Euler:

1. Se p é um número primo, entãoφ (p-n) = p n-1 (p-1)φ (p-n) = p n-1 (p-1)\ varphi (p ^ {n}) = p ^ {n-1} (p-1)

2. Se a é um número primo e a | x, então\ varphi (ax) = a \ varphi (x)

2. Se a e b são relativamente primos, então\ varphi (ab) = \ varphi (a) \ varphi (b)

Encontre o valor da função de Euler de um número:

Decompor um número em fatores primos:X = p {_ {1}} ^ {k_ {1}} * p {_ {2}} ^ {k_ {2}} ... p {_ {n}} ^ {k_ {n}}

Pode ser visto na propriedade 1

\ varphi (X) = p {_ {1}} ^ {k_ {1} -1} * (p {_ {1}} - 1) * p {_ {2}} ^ {k_ {2} -1 } * (p {_ {2}} - 1) ... * p {_ {n}} ^ {k_ {n} -1} * (p {_ {n}} - 1)

          = X * (p {_ {1}} - 1) / p {_ {1}} * (p {_ {2}} - 1) / p {_ {2}} ... * (p {_ {n}} - 1) / p {_ {n}}

Portanto, o código é o seguinte:

int phi(int n) {
	int res=n;
	for(int i=2;i*i<=n;++i) {
		if(n%i==0) res=res/i*(i-1);
		while(n%i==0) n/=i;
	}
	if(n>1) res=res/n*(n-1);
	return res;
} 

Combinado com o método de peneira

int phi[maxn];
void init(int n) {
	for(int i=1;i<=n;++i) phi[i]=i;
	for(int i=2;i<=n;i++) {
		if(phi[i]==i){
			for(int j=i;j<=n;j+=i) phi[j]=phi[j]/i*(i-1);
		} 
	}
}

Combine com peneira Euler

int phi[maxn];
int prime[maxn],cnt;
int isnp[maxn];
void init(int n) {
	phi[1]=1; cnt=0;
	for(int i=2;i<=n;i++) 
		if(!isnp[i])
			prime[++cnt]=i,phi[i]=i-1;
		for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
			isnp[i*prime[j]]=1;
			if(i%prime[j]==0) {
				phi[prime[j]*i]=phi[i]*prime[j]; 
				break;
			} 
			else phi[prime[j]*i]=phi[i]*phi[prime[j]];
		}
			
} 

 

Acho que você gosta

Origin blog.csdn.net/qq_44132777/article/details/109673133
Recomendado
Clasificación