Yenə ixtisar olunmayanlar#339

Yenə ixtisar olunmayanlar (Həll təhlili)

Məxrəci olan düzgün ixtisar olunmayan kəsrlərinin sayı p < n olan və -nin ilə qarşılıqlı sadə olduğu natural ədədlərinin sayına bərabərdir. Belə ədədlərinin sayı Eyler funksiyasına bərabərdir.

Məxrəci olan bütün düzgün kəsrlərin çoxluğuna baxaq:

\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}

Kəsrləri ixtisar olunmayan formaya gətirdikdən sonra alırıq:

\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}

İndi bu kəsrləri məxrəclərinə görə qruplaşdıraq:

\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}

Bu məxrəclərin arasında ədədinin hər bir böləni ilə birlikdə ilə qarşılıqlı sadə olan sayda bütün sürətlər rast gəlinir. Başqa sözlə desək, ədədinin hər bir böləni üçün məxrəci olan düz sayda ixtisar olunmayan kəsr var.

İxtisardan sonra ilkin çoxluğun hər bir kəsri düz bir dəfə rast gəldiyi üçün alırıq:

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

Daha ümumi halda, əgər biz

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

düzgün kəsrlər ardıcıllığından başlayıb hər bir kəsri ixtisar olunmayan formaya gətirsək, aşağıdakı eyniliyi alarıq:

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

Nümunə

n = 12 olduqda \varphi(12) = 4 sayda düzgün ixtisar olunmayan kəsr mövcuddur:

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

Alqoritmin realizasiyası

euler funksiyası qiymətini hesablayır.

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;
}

Proqramın əsas hissəsi. giriş qiymətini oxuyuruq və nəticəsini çap edirik.

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

Java realizasiyası

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();
  }
}

Python realizasiyası

import math

euler funksiyası qiymətini hesablayır.

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

Proqramın əsas hissəsi. giriş qiymətini oxuyuruq və nəticəsini çap edirik.

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