Consultas para contar el número de pares coprimos desordenados de 1 a N

Dado un número N. La tarea es encontrar el número de pares de enteros coprimos no ordenados del 1 al N. Puede haber múltiples consultas.
Ejemplos: 
 

Input: 3
Output: 4
(1, 1), (1, 2), (1, 3), (2, 3)

Input: 4
Output: 6
(1, 1), (1, 2), (1, 3), (1, 4), (2, 3), (3, 4)

Enfoque: aquí la función Totient de Euler será útil. La función totient de Euler denotada como phi(N), es una función aritmética que cuenta los números enteros positivos menores o iguales a N que son primos relativos a N. 
La idea es usar las siguientes propiedades de la función Euler Totient, es decir
 

  1. La fórmula básicamente dice que el valor de Φ(n) es igual a n multiplicado por el producto de (1 – 1/p) para todos los factores primos p de n. Por ejemplo , valor de Φ(6) = 6 * (1-1/2) * (1 – 1/3) = 2.
  2. Para un número primo p, Φ(p) es p-1. Por ejemplo , Φ(5) es 4, Φ(7) es 6 y Φ(13) es 12. Esto es obvio, el mcd de todos los números del 1 al p-1 será 1 porque p es un número primo.

Ahora, encuentre la suma de todos los phi (x) para todos los i entre 1 y N usando el método de suma de prefijos. Usando esto, uno puede responder en o (1) tiempo.
A continuación se muestra la implementación del enfoque anterior. 
 

C++

// C++ program to find number of unordered
// coprime pairs of integers from 1 to N
#include <bits/stdc++.h>
using namespace std;
#define N 100005
 
// to store euler's totient function
int phi[N];
 
// to store required answer
int S[N];
 
// Computes and prints totient of all numbers
// smaller than or equal to N.
void computeTotient()
{
    // Initialise the phi[] with 1
    for (int i = 1; i < N; i++)
        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);
            }
        }
    }
}
 
// function to compute number coprime pairs
void CoPrimes()
{
    // function call to compute
    // euler totient function
    computeTotient();
 
    // prefix sum of all euler totient function values
    for (int i = 1; i < N; i++)
        S[i] = S[i - 1] + phi[i];
}
 
// Driver code
int main()
{
    // function call
    CoPrimes();
 
    int q[] = { 3, 4 };
    int n = sizeof(q) / sizeof(q[0]);
 
    for (int i = 0; i < n; i++)
        cout << "Number of unordered coprime\n"
             << "pairs of integers from 1 to "
             << q[i] << " are " << S[q[i]] << endl;
 
    return 0;
}

C

// C program to find number of unordered
// coprime pairs of integers from 1 to N
#include <stdio.h>
#define N 100005
 
// to store euler's totient function
int phi[N];
 
// to store required answer
int S[N];
 
// Computes and prints totient of all numbers
// smaller than or equal to N.
void computeTotient()
{
    // Initialise the phi[] with 1
    for (int i = 1; i < N; i++)
        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);
            }
        }
    }
}
 
// function to compute number coprime pairs
void CoPrimes()
{
    // function call to compute
    // euler totient function
    computeTotient();
 
    // prefix sum of all euler totient function values
    for (int i = 1; i < N; i++)
        S[i] = S[i - 1] + phi[i];
}
 
// Driver code
int main()
{
   
    // function call
    CoPrimes();
 
    int q[] = { 3, 4 };
    int n = sizeof(q) / sizeof(q[0]);
 
    for (int i = 0; i < n; i++)
        printf("Number of unordered coprime\npairs of integers from 1 to %d are %d\n",q[i],S[q[i]]);
 
    return 0;
}
 
// This code is contributed by kothavvsaakash.

Java

// Java program to find number of unordered
// coprime pairs of integers from 1 to N
import java.util.*;
import java.lang.*;
import java.io.*;
 
class GFG
{
static final int N = 100005;
 
// to store euler's
// totient function
static int[] phi;
 
// to store required answer
static int[] S ;
 
// Computes and prints totient
// of all numbers smaller than
// or equal to N.
static void computeTotient()
{
    // Initialise the phi[] with 1
    for (int i = 1; i < N; i++)
        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);
            }
        }
    }
}
 
// function to compute
// number coprime pairs
static void CoPrimes()
{
    // function call to compute
    // euler totient function
    computeTotient();
 
    // prefix sum of all euler
    // totient function values
    for (int i = 1; i < N; i++)
        S[i] = S[i - 1] + phi[i];
}
 
// Driver code
public static void main(String args[])
{
    phi = new int[N];
    S = new int[N];
     
    // function call
    CoPrimes();
 
    int q[] = { 3, 4 };
    int n = q.length;
     
    for (int i = 0; i < n; i++)
        System.out.println("Number of unordered coprime\n" +
                           "pairs of integers from 1 to " +
                                q[i] + " are " + S[q[i]] );
}
}
 
// This code is contributed
// by Subhadeep

Python 3

# Python3 program to find number
# of unordered coprime pairs of
# integers from 1 to N
N = 100005
 
# to store euler's totient function
phi = [0] * N
 
# to store required answer
S = [0] * N
 
# Computes and prints totient of all
# numbers smaller than or equal to N.
def computeTotient():
 
    # Initialise the phi[] with 1
    for i in range(1, N):
        phi[i] = i
 
    # Compute other Phi values
    for p in range(2, N) :
 
        # 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, p) :
 
                # Add contribution of p to its
                # multiple i by multiplying with
                # (1 - 1/p)
                phi[i] = (phi[i] // p) * (p - 1)
 
# function to compute number
# coprime pairs
def CoPrimes():
     
    # function call to compute
    # euler totient function
    computeTotient()
 
    # prefix sum of all euler
    # totient function values
    for i in range(1, N):
        S[i] = S[i - 1] + phi[i]
 
# Driver code
if __name__ == "__main__":
     
    # function call
    CoPrimes()
 
    q = [ 3, 4 ]
    n = len(q)
 
    for i in range(n):
        print("Number of unordered coprime\n" +
              "pairs of integers from 1 to ",
               q[i], " are " , S[q[i]])
 
# This code is contributed
# by ChitraNayal

C#

// C# program to find number
// of unordered coprime pairs
// of integers from 1 to N
using System;
 
class GFG
{
static int N = 100005;
 
// to store euler's
// totient function
static int[] phi;
 
// to store required answer
static int[] S ;
 
// Computes and prints totient
// of all numbers smaller than
// or equal to N.
static void computeTotient()
{
    // Initialise the phi[] with 1
    for (int i = 1; i < N; i++)
        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);
            }
        }
    }
}
 
// function to compute
// number coprime pairs
static void CoPrimes()
{
    // function call to compute
    // euler totient function
    computeTotient();
 
    // prefix sum of all euler
    // totient function values
    for (int i = 1; i < N; i++)
        S[i] = S[i - 1] + phi[i];
}
 
// Driver code
public static void Main()
{
    phi = new int[N];
    S = new int[N];
     
    // function call
    CoPrimes();
 
    int[] q = { 3, 4 };
    int n = q.Length;
     
    for (int i = 0; i < n; i++)
        Console.WriteLine("Number of unordered coprime\n" +
                           "pairs of integers from 1 to " +
                                q[i] + " are " + S[q[i]] );
}
}
 
// This code is contributed
// by mits

PHP

<?php
// PHP program to find number
// of unordered coprime pairs
// of integers from 1 to N
$N = 100005;
 
// to store euler's totient function
$phi = array_fill(0, $N, 0);
 
// to store required answer
$S = array_fill(0, $N, 0);
 
// Computes and prints totient
// of all numbers smaller than
// or equal to N.
function computeTotient()
{
    global $N, $phi, $S;
     
    // Initialise the phi[] with 1
    for ($i = 1; $i < $N; $i++)
        $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] = (int)(($phi[$i] /
                            $p) * ($p - 1));
            }
        }
    }
}
 
// function to compute
// number coprime pairs
function CoPrimes()
{
    global $N, $phi, $S;
     
    // function call to compute
    // euler totient function
    computeTotient();
 
    // prefix sum of all euler
    // totient function values
    for ($i = 1; $i < $N; $i++)
        $S[$i] = $S[$i - 1] + $phi[$i];
}
 
// Driver code
 
// function call
CoPrimes();
 
$q = array( 3, 4 );
$n = sizeof($q);
 
for ($i = 0; $i < $n; $i++)
    echo "Number of unordered coprime\n" .
         "pairs of integers from 1 to " .
         $q[$i] . " are ".$S[$q[$i]]."\n";
 
// This code is contributed
// by mits
?>

Javascript

<script>
// Javascript program to find number of unordered
// coprime pairs of integers from 1 to N
     
    let N = 100005;
     
    // to store euler's
    // totient function
    let phi = new Array(N);
     
    // to store required answer
    let S = new Array(N);
    for(let i = 0; i < N; i++)
    {
        phi[i] = 0;
        S[i] = 0;
    }
     
    // Computes and prints totient
    // of all numbers smaller than
    // or equal to N.
    function computeTotient()
    {
        // Initialise the phi[] with 1
        for (let i = 1; i < N; i++)
        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] = (phi[i] / p) * (p - 1);
            }
        }
    }
    }
     
    // function to compute
    // number coprime pairs
    function CoPrimes()
    {
        // function call to compute
    // euler totient function
    computeTotient();
   
    // prefix sum of all euler
    // totient function values
    for (let i = 1; i < N; i++)
        S[i] = S[i - 1] + phi[i];
    }
     
    // Driver code
     
    // function call
    CoPrimes();
   
    let q = [ 3, 4 ];
    let n = q.length;
       
    for (let i = 0; i < n; i++)
        document.write("Number of unordered coprime<br>" +
                           "pairs of integers from 1 to " +
                                q[i] + " are " + S[q[i]] +"<br>" );
     
    // This code is contributed by avanitrachhadiya2155
</script>
Producción: 

Number of unordered coprime
pairs of integers from 1 to 3 are 4
Number of unordered coprime
pairs of integers from 1 to 4 are 6

 

Publicación traducida automáticamente

Artículo escrito por pawan_asipu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *