Di nuovo irriducibili#339

Di nuovo irriducibili (Editoriale)

Il numero di frazioni proprie irriducibili (con denominatore ) è uguale al numero di numeri naturali tali che p < n e è coprimo con . Tale numero di valori è uguale alla funzione di Eulero .

Consideriamo l'insieme di tutte le frazioni proprie con denominatore :

\frac{0}{12}, \frac{1}{12}, \frac{2}{12}, \frac{3}{12}, \frac{4}{12}, \frac{5}{12}, \frac{6}{12}, \frac{7}{12}, \frac{8}{12}, \frac{9}{12}, \frac{10}{12}, \frac{11}{12}

Dopo aver ridotto le frazioni alla forma irriducibile otteniamo:

\frac{0}{1}, \frac{1}{12}, \frac{1}{6}, \frac{1}{4}, \frac{1}{3}, \frac{5}{12}, \frac{1}{2}, \frac{7}{12}, \frac{2}{3}, \frac{3}{4}, \frac{5}{6}, \frac{11}{12}

Ora raggruppiamo queste frazioni in base ai loro denominatori:

\frac{0}{1},~~~~~~~\frac{1}{2},~~~~~~~\frac{1}{3}, \frac{2}{3},~~~~~~~\frac{1}{4}, \frac{3}{4},~~~~~~~\frac{1}{6}, \frac{5}{6},~~~~~~~\frac{1}{12}, \frac{5}{12}, \frac{7}{12}, \frac{11}{12}

Tra questi denominatori compare ogni divisore del numero insieme a tutti i numeratori coprimi con . In altre parole, per ogni divisore del numero esistono esattamente frazioni irriducibili con denominatore .

Poiché dopo la riduzione ogni frazione dell'insieme iniziale compare esattamente una volta, otteniamo:

\phi(1) + \phi(2) + \phi(3) + \phi(4) + \phi(6) + \phi(12) = 12

In generale, se partiamo dalla sequenza di frazioni proprie

\frac{0}{n}, \frac{1}{n}, \frac{2}{n}, ..., \frac{n-1}{n}

e riduciamo ogni frazione alla forma irriducibile, otteniamo la seguente identità:

n = \sum_{d \mid n} \varphi(d)

Esempio

Per n = 12 ci sono \varphi(12) = 4 frazioni proprie irriducibili:

{1 \over 12}, {5 \over 12}, {7 \over 12}, {11 \over 12}

Implementazione dell'algoritmo

La funzione euler calcola il valore di .

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

La parte principale del programma. Leggiamo il valore di input e stampiamo .

while(scanf("%d",&n),n)
  printf("%d\n",euler(n));

Implementazione in Java

import java.util.Scanner;

public class Main
{
  static int euler(int n)
  {
    int result = n;
    for(int i = 2; i * i <= n;i++)
    {
      if (n % i == 0) result -= result / i;
      while (n % i == 0) n /= i;
    }
    if (n > 1) result -= result / n;
    return result;
  }
    
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    while(con.hasNext())
    {
      int n = con.nextInt();
      if (n == 0) break;
      System.out.println(euler(n));
    }
    con.close();
  }
}

Implementazione in Python

import math

La funzione euler calcola il valore di .

def euler(n):
  result = n
  i = 2
  while i <= math.isqrt(n):
    if n % i == 0:
      result -= result // i
      while n % i == 0: n //= i
    i += 1
  if n > 1: result -= result // n
  return result

La parte principale del programma. Leggiamo il valore di input e stampiamo .

while True:
  n = int(input())
  if n == 0: break
  print(euler(n))