Numery osiągalne

14

Definicje

  • Funkcja Euler Phi ( funkcja totalna AKA ): funkcja, która przyjmuje liczbę dodatnią i zwraca liczbę liczb dodatnich mniejszą niż podaną liczbę, które są jednocześnie liczbą pierwszą. Jest oznaczony jako φ(n).

  • Osiągalna liczba : jeśli istnieje dodatnia liczba całkowita xtaka φ(x) == n, to njest osiągalna .

Zadanie

Napisz funkcję / program, aby ustalić, czy dana dodatnia liczba całkowita jest osiągalna.

Wejście

Liczba dodatnia, w dowolnym rozsądnym formacie. Można założyć, że liczba mieści się w zakresie możliwości danego języka. Jednoargumentowe wejście jest akceptowane.

Wynik

Dwie spójne wartości, jedna dla liczb osiągalnych, a druga dla liczb nieosiągalnych. Te dwie wartości mogą być dowolne, o ile są spójne.

Przypadki testowe

Poniżej osiągalne liczby 100:

1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46, 48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96

( A002202 w OEIS)

Zasady

Obowiązują standardowe luki .

Kryterium wygranej

To jest . Zgłoszenie z najniższą liczbą bajtów wygrywa.

Bibliografia

Leaky Nun
źródło
również istotne: oeis.org/A264739
Destructible Lemon
1
Oferuję nagrodę za jednoliniową odpowiedź Retina, gdzie jedna linia jest zwykłym wyrażeniem regularnym (bez odwrotnych zwrotów).
Leaky Nun
@LeakyNun Jestem trochę zdezorientowany, do tej pory rozumiem, że phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }.. czy to prawda?
Khaled.K
@ Khaled.K tak, to prawda.
Leaky Nun

Odpowiedzi:

6

Galaretka , 7 6 bajtów

²RÆṪe@

Niezupełnie szybko. Zwraca 1 lub 0 .

Wypróbuj online!

Jak to działa

²RÆṪe@  Main link. Argument: n

²       Square; yield n².
 R      Range; yield [1, ..., n²].
  ÆṪ    Compute the totient of each integer in the range.
    e@  Exists swap; test if n occurs in the generated array.
Dennis
źródło
Jak to działa?
Leaky Nun
1
Brutalna siła. Funkcja totient ma dolną granicę, więc wystarczy wziąć wystarczająco duży zasięg, odwzorować wartość totemu i sprawdzić występowanie danych wejściowych.
Dennis
Czy możesz udowodnić, że pierwiastek kwadratowy jest minimum?
Leaky Nun
Pierwiastek kwadratowy w rzeczywistości nie jest dolną granicą, ale pierwiastek kwadratowy podzielony przez sqrt (2) to. Jestem pewien, że podwojenie nie jest wymagane, ale dowód będzie musiał poczekać, aż się przespę. Jestem teraz zbyt zmęczony.
Dennis
4
@LeakyNun W rzeczywistości lemat 3 tego dokumentu dowodzi, że pierwiastek kwadratowy jest dolną granicą, chyba że n = 2k z nieparzystym k . Ponieważ k i 2k mają tę samą sumę, podwajanie nie jest wymagane.
Dennis
6

Mathematica, 28 bajtów

EulerPhi@Range[#^2]~FreeQ~#&

Podobnie jak odpowiedź Jelly'ego na Jelly, obliczamy wartości φ wszystkich liczb aż do kwadratu wejścia i sprawdzamy, czy dane wejściowe się tam pojawiają. Zwraca, Falsejeśli wejście jest osiągalne, a Truejeśli nie. Tak, to mylące. Ale FreeQbajt jest krótszy niż MatchQi hej, specyfikacja podała dowolne dwie spójne wartości> :)

Greg Martin
źródło
2

JavaScript (ES6), 90 82 bajtów

Zwraca 0lub true.

f=(n,x=n*2)=>x?(p=i=>(c=(a,b)=>a?c(b%a,a):b<2)(i,x)+(i&&p(--i)))(x)==n||f(n,x-1):0

Jest to oparte na założeniu, że jeśli x istnieje, to x ≤ 2n . Jeśli okaże się fałszywy, należy go zaktualizować, aby użyćx=n*nzamiastx=n*2 (ten sam rozmiar, znacznie wolniej).

Przypadek krawędzi ma wartość n = 128 co wymaga obliczenia ϕ (255) .

Próbny

Arnauld
źródło
Dogodnie liczby pierwsze Fermat są rzędu wzrost dawanie do kolejnych przypadków brzegowych n=2, n=8, n=128, n=32768i n=2147483648.
Neil,
1

Aksjomat, 56 bajtów

f(x:PI):Boolean==member?(x,[eulerPhi(i)for i in 1..2*x])

nie wiem czy to jest poprawne ... kod testowy i wyniki

(35) -> [i  for i in 1..100|f(i)]
   (35)
   [1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46,
    48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96, 100]

Zakres 1 .. (2 * x) będzie w porządku, dopóki wejście x = 500 ...

RosLuP
źródło
1

05AB1E , 5 bajtów

nLÕså

Wyjaśnienie:

n       Square [implicit] input
 L      Range [1 .. a]
  Õ     Euler totient
   s    Put first input at the top of the stack
    å   Is it in the list?

Wypróbuj online!

Okx
źródło
0

05AB1E , 13 12 bajtów

EDYTOWAĆ : Zapisano bajt, ponieważ dane wejściowe są ponownie wykorzystywane, jeśli stos nie ma wystarczającej liczby elementów.

Wyjścia 1, jeśli osiągalne, 0 jeśli nie.

Opiera się na założeniu, że x ≤ 2n, jeśli istnieje.

xGNÕQi1,q}}0

Wypróbuj online!

Jak to działa

              # implicit input    
x            # push input, 2 * input
 G           # for N in 1..2*input
             # implicit push input
  N          # push N
   Õ         # push totient of N
    Q        # check if both are equal
     i.      # if equal
      1,     # print 1
        q    # quit program
         }   # end if
          }  # end for
           0 # push 0 if condition never reached
             # implicit print
Neil A.
źródło
0

C, 123 bajty

g(a,b){return!a?b:g(b%a,a);}
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

Wypróbuj online

#include <stdio.h>

// gcd function
g(a,b){return!a?b:g(b%a,a);}

// Euler phi(x) function
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}

// check if m is reachable, phi(x) for x in (m , m^2]
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

main()
{
    // print all reachable number below 50
    for(int x=1; x<50; x++)
    {
        s(x);

        if(t)
        {
            printf(" %d ~ phi(%d) \n", x, k);
        }
    }
}
Khaled.K
źródło
102 bajty
pułapkap