所有小于或等于n的数的Euler Toticent函数

欧拉惯性函数 输入n的Φ(n)是{1,2,3,…,n}中与n相对素数的数的计数,即其GCD(最大公约数)与n为1的数。

null

例如,Φ(4)=2,Φ(3)=2和Φ(5)=4。有两个小于或等于4的数字相对素数为4,两个小于或等于3的数字相对素数为3。和4个小于或等于5的数字,它们相对素数为5。 我们已经讨论了不同的计算Φ(n)的方法 以前的职位 .

如何计算所有小于或等于n的数字的Φ?

例子:

Input: n = 5
Output: Totient of 1 is 1
        Totient of 2 is 1
        Totient of 3 is 2
        Totient of 4 is 2
        Totient of 5 is 4

我们强烈建议您尽量减少浏览器,并先自己尝试。 A. 简单解决方案 就是打电话 Φ(一) 对于i=1到n。

有效解决方案 就是使用一个类似于 埃拉托斯坦筛 预计算所有值。该方法基于以下乘积公式。

eulersproduct

该公式基本上表示,对于n的所有素数p,Φ(n)的值等于n乘以(1-1/p)的乘积。例如Φ(6)=6*(1-1/2)*(1-1/3)=2。

以下是完整的算法:

1) Create an array phi[1..n] to store Φ values of all numbers 
   from 1 to n.  

2) Initialize all values such that phi[i] stores i.  This
   initialization serves two purposes.
   a) To check if phi[i] is already evaluated or not. Note that
      the maximum possible phi value of a number i is i-1.
   b) To initialize phi[i] as i is multiple in the above product
      formula. 

3) Run a loop for p = 2 to n
    a) If phi[p] is p, means p is not evaluated yet and p is a 
       prime number (similar to Sieve), otherwise phi[p] must 
       have been updated in step 3.b
    b) Traverse through all multiples of p and update all 
       multiples of p by multiplying with (1-1/p).

4) Run a loop from i = 1 to n and print all Ph[i] values.

下面是上述算法的实现。

C++

// C++ program to compute Totient function for
// all numbers smaller than or equal to n.
#include<iostream>
using namespace std;
// Computes and prints totient of all numbers
// smaller than or equal to n.
void computeTotient( int n)
{
// Create and initialize an array to store
// phi or totient values
long long phi[n+1];
for ( int i=1; i<=n; i++)
phi[i] = i; // indicates not evaluated yet
// and initializes for product
// formula.
// Compute other Phi values
for ( int p=2; p<=n; p++)
{
// If phi[p] is not computed already,
// then number p is prime
if (phi[p] == p)
{
// Phi of a prime number p is
// always equal to p-1.
phi[p] = p-1;
// Update phi values of all
// multiples of p
for ( int i = 2*p; i<=n; i += p)
{
// Add contribution of p to its
// multiple i by multiplying with
// (1 - 1/p)
phi[i] = (phi[i]/p) * (p-1);
}
}
}
// Print precomputed phi values
for ( int i=1; i<=n; i++)
cout << "Totient of " << i << " is "
<< phi[i] << endl;
}
// Driver program to test above function
int main()
{
int n = 12;
computeTotient(n);
return 0;
}


JAVA

// Java program to compute Totient
// function for all numbers smaller
// than or equal to n.
import java.util.*;
class GFG {
// Computes and prints totient of all numbers
// smaller than or equal to n.
static void computeTotient( int n) {
// Create and initialize an array to store
// phi or totient values
long phi[] = new long [n + 1 ];
for ( int i = 1 ; i <= n; i++)
phi[i] = i; // indicates not evaluated yet
// and initializes for product
// formula.
// Compute other Phi values
for ( int p = 2 ; p <= n; p++) {
// If phi[p] is not computed already,
// then number p is prime
if (phi[p] == p) {
// Phi of a prime number p is
// always equal to p-1.
phi[p] = p - 1 ;
// Update phi values of all
// multiples of p
for ( int i = 2 * p; i <= n; i += p) {
// Add contribution of p to its
// multiple i by multiplying with
// (1 - 1/p)
phi[i] = (phi[i] / p) * (p - 1 );
}
}
}
// Print precomputed phi values
for ( int i = 1 ; i <= n; i++)
System.out.println( "Totient of " + i +
" is " + phi[i]);
}
// Driver code
public static void main(String[] args) {
int n = 12 ;
computeTotient(n);
}
}
// This code is contributed by Anant Agarwal.


Python3

# Python program to compute
# Totient function for
# all numbers smaller than
# or equal to n.
# Computes and prints
# totient of all numbers
# smaller than or equal to n.
def computeTotient(n):
# Create and initialize
# an array to store
# phi or totient values
phi = []
for i in range (n + 2 ):
phi.append( 0 )
for i in range ( 1 , n + 1 ):
phi[i] = i # indicates not evaluated yet
# and initializes for product
# formula.
# Compute other Phi values
for p in range ( 2 ,n + 1 ):
# If phi[p] is not computed already,
# then number p is prime
if (phi[p] = = p):
# Phi of a prime number p is
# always equal to p-1.
phi[p] = p - 1
# Update phi values of all
# multiples of p
for i in range ( 2 * p,n + 1 ,p):
# Add contribution of p to its
# multiple i by multiplying with
# (1 - 1/p)
phi[i] = (phi[i] / / p) * (p - 1 )
# Print precomputed phi values
for i in range ( 1 ,n + 1 ):
print ( "Totient of " , i , " is " ,
phi[i])
# Driver code
n = 12
computeTotient(n)
# This code is contributed
# by Anant Agarwal


C#

// C# program to check if given two
// strings are at distance one.
using System;
class GFG
{
// Computes and prints totient of all
// numbers smaller than or equal to n
static void computeTotient( int n)
{
// Create and initialize an array to
// store phi or totient values
long []phi = new long [n + 1];
for ( int i = 1; i <= n; i++)
// indicates not evaluated yet
// and initializes for product
// formula.
phi[i] = i;
// Compute other Phi values
for ( int p = 2; p <= n; p++)
{
// If phi[p] is not computed already,
// then number p is prime
if (phi[p] == p)
{
// Phi of a prime number p is
// always equal to p-1.
phi[p] = p - 1;
// Update phi values of all
// multiples of p
for ( int i = 2 * p; i <= n; i += p)
{
// Add contribution of p to its
// multiple i by multiplying with
// (1 - 1/p)
phi[i] = (phi[i] / p) * (p - 1);
}
}
}
// Print precomputed phi values
for ( int i = 1; i <= n; i++)
Console.WriteLine( "Totient of " + i + " is " + phi[i]);
}
// Driver code
public static void Main()
{
int n = 12;
computeTotient(n);
}
}
// This code is contributed by Sam007.


PHP

<?php
// PHP program to compute Totient
// function for all numbers smaller
// than or equal to n.
// Computes and prints totient
// of all numbers smaller than
// or equal to n.
function computeTotient( $n )
{
// Create and initialize
// an array to store
// phi or totient values
for ( $i = 1; $i <= $n ; $i ++)
// indicates not evaluated yet
// and initializes for product
// formula.
$phi [ $i ] = $i ;
// Compute other Phi values
for ( $p = 2; $p <= $n ; $p ++)
{
// If phi[p] is not computed already,
// then number p is prime
if ( $phi [ $p ] == $p )
{
// Phi of a prime number p is
// always equal to p-1.
$phi [ $p ] = $p - 1;
// Update phi values of all
// multiples of p
for ( $i = 2 * $p ; $i <= $n ; $i += $p )
{
// Add contribution of p to its
// multiple i by multiplying with
// (1 - 1/$p)
$phi [ $i ] = ( $phi [ $i ] / $p ) * ( $p - 1);
}
}
}
// Print precomputed phi values
for ( $i = 1; $i <= $n ; $i ++)
echo "Totient of " , $i , " is " ,
$phi [ $i ] , "" ;
}
// Driver Code
$n = 12;
computeTotient( $n );
// This code is contributed by ajit
?>


Javascript

<script>
// Javascript program to check if given two
// strings are at distance one.
// Computes and prints totient of all
// numbers smaller than or equal to n
function computeTotient(n)
{
// Create and initialize an array to
// store phi or totient values
let phi = new Array(n + 1);
for (let i = 1; i <= n; i++)
// indicates not evaluated yet
// and initializes for product
// formula.
phi[i] = i;
// Compute other Phi values
for (let p = 2; p <= n; p++)
{
// If phi[p] is not computed already,
// then number p is prime
if (phi[p] == p)
{
// Phi of a prime number p is
// always equal to p-1.
phi[p] = p - 1;
// Update phi values of all
// multiples of p
for (let i = 2 * p; i <= n; i += p)
{
// Add contribution of p to its
// multiple i by multiplying with
// (1 - 1/p)
phi[i] = parseInt(phi[i] / p, 10) * (p - 1);
}
}
}
// Print precomputed phi values
for (let i = 1; i <= n; i++)
document.write( "Totient of " + i + " is " + phi[i] + "</br>" );
}
let n = 12;
computeTotient(n);
</script>


输出

Totient of 1 is 1
Totient of 2 is 1
Totient of 3 is 2
Totient of 4 is 2
Totient of 5 is 4
Totient of 6 is 2
Totient of 7 is 6
Totient of 8 is 4
Totient of 9 is 6
Totient of 10 is 4
Totient of 11 is 10
Totient of 12 is 4

当我们有大量查询来计算ToClient函数时,也可以使用相同的解决方案。

另一种计算方法 欧拉惯性函数 也可以使用以下公式进行计算:

图片[2]-所有小于或等于n的数的Euler Toticent函数-yiteyi-C++库

欧拉惯性函数

让我们看一个例子来理解上述功能,基本上,它做相同的工作,但方式不同:

例如,ν(12)={(2^(2-1))x(2-1)}x{(3^(1-1))x(3-1)}=4

注意,ψ(n)=n−如果n是素数。

以下是上述公式的实施:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll Euler_totient_function(ll n)
{
ll result = 1;
for (ll i = 2; i * i <= n; i++) {
ll c = 0;
if (n % i == 0) {
while (n % i == 0) {
c++;
n /= i;
}
}
if (c > 0) {
ll power = (ll) pow (i, c - 1);
ll sm = (ll) pow (i, c - 1) * (i - 1);
result *= sm;
}
}
if (n > 1) {
result *= (n - 1);
}
return result;
}
// driver code
int main()
{
for (ll i = 1; i < 13; i++) {
cout << "Euler_totient_function(" << i << "): " ;
cout << Euler_totient_function(i) << endl;
}
}
#praveeny182


JAVA

// Java program for the above approach
import java.io.*;
class GFG{
static long Euler_totient_function( long n)
{
long result = 1 ;
for ( long i = 2 ; i * i <= n; i++)
{
long c = 0 ;
if (n % i == 0 )
{
while (n % i == 0 )
{
c++;
n /= i;
}
}
if (c > 0 )
{
long power = ( long )Math.pow(i, c - 1 );
long sm = ( long )Math.pow(i, c - 1 ) * (i - 1 );
result *= sm;
}
}
if (n > 1 )
{
result *= (n - 1 );
}
return result;
}
// Driver code
public static void main(String[] args)
{
for ( long i = 1 ; i < 13 ; i++)
{
System.out.print( "Euler_totient_function(" +
i + "): " );
System.out.println(Euler_totient_function(i));
}
}
}
// This code is contributed by rishavmahato348


Python3

# python program for the above approach
import math
def Euler_totient_function(n):
result = 1
for i in range ( 2 ,n + 1 ):
c = 0
if n % i = = 0 :
while (n % i = = 0 ):
c + = 1
n / / = i
if (c > 0 ):
power = math. pow (i,c - 1 )
m = math. pow (i,c - 1 ) * (i - 1 )
result * = m
if (n > 1 ):
result * = (n - 1 )
return int (result)
for i in range ( 1 , 13 ):
print ( "Euler_totient_function(" , i , "): " ,end = "")
print (Euler_totient_function(i))


C#

// C# program for the above approach
using System;
class GFG {
static long Euler_totient_function( long n)
{
long result = 1;
for ( long i = 2; i * i <= n; i++) {
long c = 0;
if (n % i == 0) {
while (n % i == 0) {
c++;
n /= i;
}
}
if (c > 0) {
long sm
= ( long )Math.Pow(i, c - 1) * (i - 1);
result *= sm;
}
}
if (n > 1) {
result *= (n - 1);
}
return result;
}
// Driver code
public static void Main()
{
for ( long i = 1; i < 13; i++) {
Console.Write( "Euler_totient_function(" + i
+ "): " );
Console.WriteLine(Euler_totient_function(i));
}
}
}
// This code is contributed by rishavmahato348


Javascript

<script>
// Javascript program for the above approach
function Euler_totient_function(n)
{
let result = 1;
for (let i = 2; i * i <= n; i++) {
let c = 0;
if (n % i == 0) {
while (n % i == 0) {
c++;
n = parseInt(n / i);
}
}
if (c > 0) {
let power = Math.pow(i, c - 1);
let sm = Math.pow(i, c - 1) * (i - 1);
result *= sm;
}
}
if (n > 1) {
result *= (n - 1);
}
return result;
}
// driver code
for (let i = 1; i < 13; i++) {
document.write( "Euler_totient_function(" + i + "): " );
document.write(Euler_totient_function(i) + "<br>" );
}
// This code is contributed by subham348.
</script>


输出

Euler_totient_function(1): 1
Euler_totient_function(2): 1
Euler_totient_function(3): 2
Euler_totient_function(4): 2
Euler_totient_function(5): 4
Euler_totient_function(6): 2
Euler_totient_function(7): 6
Euler_totient_function(8): 4
Euler_totient_function(9): 6
Euler_totient_function(10): 4
Euler_totient_function(11): 10
Euler_totient_function(12): 4

本文由 埃克塔·戈尔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享