tło
Eulera totient
funkcja φ(n)
jest definiowana jako ilość liczb całkowitych mniej niż lub równy n
, które są względnie pierwsze do n
, czyli liczba możliwych wartości x
w 0 < x <= n
odniesieniu do których
gcd(n, x) == 1
. Mieliśmy
się
kilka totient - powiązanych wyzwań
przed, ale nie taki, który jest po prostu jej obliczenia.
Mapowanie funkcji totemu na liczby całkowite to OEIS A000010 .
Wyzwanie
Biorąc pod uwagę liczbę całkowitą n > 0
, obliczyć φ(n)
. Możesz przyjmować dane wejściowe za pomocą argumentów wiersza poleceń, standardowych danych wejściowych, argumentów funkcyjnych lub cokolwiek innego uzasadnionego. Możesz podać dane wyjściowe poprzez standardowe dane wyjściowe, zwracane wartości lub cokolwiek innego rozsądnego. Funkcje anonimowe są dopuszczalne. Możesz założyć, że dane wejściowe nie przepełnią twojej naturalnej metody przechowywania liczb całkowitych, np. int
W C, ale musisz obsługiwać dane wejściowe do 255.
Jeśli twój język ma wbudowaną funkcję totient, nie możesz jej użyć.
Przykłady
φ(1) => 1
φ(2) => 1
φ(3) => 2
φ(8) => 4
φ(9) => 6
φ(26) => 12
φ(44) => 20
φ(105) => 48
Najkrótsza odpowiedź w bajtach wygrywa. Jeśli twój język używa kodowania innego niż UTF-8, podaj go w swojej odpowiedzi.
źródło
EulerPhi
Odpowiedzi:
Mathematica,
2722 bajtówNienazwana funkcja, która przyjmuje i zwraca liczbę całkowitą.
Nie ma tu wiele do wyjaśnienia, z wyjątkiem tego, że
@
jest to notacja prefiksu dla wywołań funkcji i~...~
jest notacja infiksowa (lewostronna), więc powyższe jest takie samo jak:źródło
MATL, 7 bajtów
Możesz TryItOnline . Najprostszy pomysł, wykonaj wektor od 1 do N i weź gcd każdego elementu za pomocą N (
Zd
robi gcd). Następnie znajdź elementy równe 1 i zsumuj wektor, aby uzyskać odpowiedź.źródło
_Zp
dla tych, którzy zastanawiają się.J, 9 bajtów
Jest to oparte na eseju Jsoftware na temat funkcji totient .
Biorąc pod uwagę n = p 1 e 1 ∙ p 2 e 2 ∙∙∙ p k e k gdzie p k jest liczbą pierwszą n , funkcja totalna φ ( n ) = φ ( p 1 e 1 ) ∙ φ ( p 2 e 2 ) ∙∙∙ φ ( p k e k ) = ( p 1 - 1) p 1 e 1 - 1 ∙ ( p 2 - 1) p 2e 2 - 1 ∙∙∙ ( p k - 1) p k e k - 1 .
Stosowanie
Wyjaśnienie
źródło
[:*/@({.(^-(^<:)){:)2&p:
wymaga 24 bajtów, nawet użycie wbudowanego do uzyskania liczb pierwszych i ich wykładników. A może jest krótsza droga i jej nie widzę.Galaretka, 4 bajty
Wypróbuj online!
Wyjaśnienie
Z wbudowanym
Wypróbuj online!
Wyjaśnienie
źródło
Haskell, 28 bajtów
Wykorzystuje dopasowanie stałych według wzoru Haskella . Sztuczki tutaj są dość standardowe do gry w golfa, ale wyjaśnię to ogółowi odbiorców.
Wyrażenie
gcd n<$>[1..n]
odwzorowujegcd n
na[1..n]
. Innymi słowy, wyliczagcd
zn
każdej liczby od1
don
:Stąd pożądanym wyjściem jest liczba
1
wpisów, ale Haskell nie ma żadnejcount
funkcji. Idiomatyczny sposób, abyfilter
zatrzymać tylko1
i wziąć wynikowylength
, który jest o wiele za długi na grę w golfa.Zamiast tego
filter
jest symulowane przez zrozumienie listy[1|1<-l]
z wynikową listąl
. Zwykle wyrażenia listowe wiążą wartości ze zmienną jak w[x*x|x<-l]
, ale Haskell pozwala na dopasowanie wzorca, w tym przypadku stałej1
.Tak więc,
[1|1<-l]
generowanie1
przy każdym dopasowaniu1
, skutecznie wyodrębniając tylko1
z oryginalnej listy. Przywołaniesum
go określa jego długość.źródło
Python 2, 44 bajty
Mniej golfa:
Wykorzystuje wzór, że sumy Eulera dzielników
n
mają sumęn
:Wartość
ϕ(n)
można następnie rekurencyjnie obliczyć jakon
minus sumę ponad nietrywialnymi dzielnikami. Skutecznie robi to inwersję Möbiusa w funkcji tożsamości. Zastosowałem tę samą metodę w golfie, aby obliczyć funkcję Möbiusa .Dzięki Dennisowi za zaoszczędzenie 1 bajtu z lepszą skrzynką podstawową, rozłożenie wartości początkowej
+n
na+1
dla każdej zn
pętli, wykonane jak-~
.źródło
Pyke, 5 bajtów
Wypróbuj tutaj!
źródło
J, 11 bajtów
Stosowanie
gdzie
>>
jest STDIN i<<
STDOUT.Wyjaśnienie
źródło
Python> = 3,5,
766458 bajtówDzięki LeakyNun za grę w golfa z 12 (!) Bajtów.
Dzięki Sp3000 za grę w golfa z 6 bajtów.
Uwielbiam czytelność Pythona. Ma to sens, nawet poprzez grę w golfa.
źródło
lambda n:sum(gcd(n,x)<2for x in range(n))
gcd
do modułu matematycznego! Nie wiedziałem tegoRegex (ECMAScript), 131 bajtów
Co najmniej -12 bajtów dzięki Deadcode (na czacie)
Wypróbuj online!
Dane wyjściowe to długość dopasowania.
Wyrażenia regularne ECMAScript sprawiają, że niezwykle trudno jest policzyć cokolwiek. Wszelkie odnośniki zdefiniowane poza pętlą będą stałe podczas pętli, wszelkie odnośniki zdefiniowane w pętli zostaną zresetowane podczas zapętlania. Zatem jedynym sposobem przenoszenia stanu przez iteracje pętli jest użycie bieżącej pozycji dopasowania. To jedna liczba całkowita i może się tylko zmniejszać (no cóż, pozycja rośnie, ale długość ogona maleje i do tego możemy matematyki).
Biorąc pod uwagę te ograniczenia, zwykłe liczenie numerów coprime wydaje się niemożliwe. Zamiast tego używamy formuły Eulera do obliczania sumy.
Oto jak to wygląda w pseudokodzie:
Są w tym dwie wątpliwe rzeczy.
Po pierwsze, nie zapisujemy danych wejściowych, tylko bieżący produkt, więc w jaki sposób możemy dostać się do głównych czynników wejściowych? Sztuka polega na tym, że (N - (N / P)) ma takie same czynniki pierwsze> P jak N. Może zyskać nowe czynniki pierwsze <P, ale i tak je ignorujemy. Zauważ, że działa to tylko dlatego, że iterujemy czynniki pierwsze od najmniejszej do największej.
Po drugie, musimy pamiętać o dwóch liczbach w iteracjach pętli (P i N, Z nie liczy się, ponieważ jest stała), a ja właśnie powiedziałem, że to niemożliwe! Na szczęście możemy zamienić te dwie liczby w jednym. Zauważ, że na początku pętli N będzie zawsze wielokrotnością Z, podczas gdy P będzie zawsze mniejsze niż Z. Zatem możemy po prostu zapamiętać N + P i wyodrębnić P za pomocą modulo.
Oto nieco bardziej szczegółowy pseudo-kod:
A oto skomentowany regex:
A jako bonus…
Regex (ECMAScript 2018, liczba dopasowań), 23 bajty
Wypróbuj online!
Dane wyjściowe to liczba dopasowań. ECMAScript 2018 wprowadza zmienne spojrzenie wstecz (oceniane od prawej do lewej), co pozwala po prostu policzyć wszystkie liczby coprime z danymi wejściowymi.
Okazuje się, że jest to niezależnie ta sama metoda stosowana w rozwiązaniu Retina Leaky Nun , a regex jest nawet tej samej długości ( i zamiennie ). Zostawiam go tutaj, ponieważ może być interesujące, że ta metoda działa w ECMAScript 2018 (a nie tylko .NET).
źródło
Perl 6 ,
26 2422 bajtówWyjaśnienie:
Przykład:
źródło
Julia, 25 bajtów
To proste -
sum
funkcja umożliwia nadanie jej funkcji do zastosowania przed zsumowaniem - w zasadzie odpowiednik uruchomienia,map
a następniesum
. To bezpośrednio zlicza liczbę względnie pierwszych liczb mniejszą niżn
.źródło
Python 2, 57 bajtów
Przetestuj na Ideone .
tło
Według formuły produktu Eulera ,
gdzie φ oznacza funkcję całkowitą Eulera, a p zmienia się tylko w liczbach pierwszych.
Aby zidentyfikować liczby pierwsze, używamy następstwa twierdzenia Wilsona :
Jak to działa
Przez cały czas zmienna m będzie równa kwadratowi silni k - 1 . W rzeczywistości nazwaliśmy argumenty domyślnie k = 1 i m = 0! 2 = 1 .
Dopóki k ≤ n , przyjmuje
n*(k>n)
wartość 0 i następujeor
wykonanie następującego kodu .Przypomnijmy, że
m%k
da 1, jeśli m jest liczbą pierwszą, a 0, jeśli nie. Oznacza to, żex%k<m%k
zwróci True , i tylko wtedy, gdy oba k jest liczbą pierwszą, a x jest podzielne przez k .W tym przypadku
(n%k<m%k)*n/k
daje n / k , a odjęcie go od n zastępuje jego poprzednią wartość n (1 - 1 / k) , jak we wzorze produktu Eulera. W przeciwnym razie(n%k<m%k)*n/k
zwraca 0 i n pozostaje niezmienione.Po obliczeniu powyższym, przyrost że k i namnażania m o „starej” wartość k 2 , utrzymując w ten sposób żądany stosunek pomiędzy k i m , a następnie wywołać K rekurencyjnie aktualizowane z argumentów.
Gdy k przekroczy n ,
n*(k>n)
zwraca wartość n , która jest zwracana przez funkcję.źródło
Rubinowy, 32 bajty
lambda, która przyjmuje liczbę całkowitą n i zwraca liczbę całkowitych liczb z zakresu (1..n) stanowiących coprime dla n.
źródło
Brachylog , 25 bajtów
Wyjaśnienie
Brachylog nie ma jeszcze wbudowanego GCD, więc sprawdzamy, czy te dwie liczby nie mają wspólnych pierwiastków.
Główny predykat:
Predykat 1:
źródło
Pyth, 6 bajtów
Wypróbuj online!
Wypróbuj online!
Wyjaśnienie
źródło
PowerShell v2 +, 72 bajty
PowerShell nie ma dostępnej funkcji GCD, więc musiałem uruchomić własną.
To pobiera dane wejściowe
$n
, a następnie waha się od1
do$n
i łączy je w pętlę|%{...}
. Każda iteracja możemy ustawić dwie zmienne pomocnicze$a
i$b
, a następnie wykonać GCDwhile
pętlę. Każda iteracja, którą sprawdzamy,$b
jest wciąż niezerowa, a następnie zapisujemy$a%$b
do$b
poprzedniej wartości$b
i$a
dla następnej pętli. Następnie kumulujemy, czy$a
jest równa1
naszej zmiennej wyjściowej$o
. Po zakończeniu pętli for umieszczamy$o
w potoku i wynik jest domyślny.Jako przykład działania
while
pętli zastanów się$n=20
i włączamy$_=8
. Pierwsze sprawdzenie ma$b=20
, więc wchodzimy do pętli. Najpierw obliczamy$a%$b
lub8%20 = 8
, który jest ustawiany$b
w tym samym czasie, który20
jest ustawiany na$a
. Sprawdź8=0
, a my wprowadzamy drugą iterację. Następnie obliczamy20%8 = 4
i ustawiamy to na$b
, a następnie ustawiamy$a
na8
. Sprawdź4=0
, a my wprowadzamy trzecią iterację. Obliczamy8%4 = 0
i ustawiamy na$b
, a następnie ustawiamy$a
na4
. Sprawdź0=0
i wychodzimy z pętli, więc GCD (8,20) jest$a = 4
. Tak!($a-1) = !(4-1) = !(3) = 0
więc$o += 0
i nie liczymy tego.źródło
Współczynnik, 50 bajtów
Zmienia zakres ( iota ) n i curry n do funkcji, która otrzymuje gcd xn dla wszystkich wartości 0 <= x <= n , sprawdza, czy wynikiem jest 1 . Filtruj oryginalny zakres, sprawdzając, czy wynik gcd xn wynosił 1 , i bierz jego długość .
źródło
[ dup iota swap '[ _ gcd nip 1 = ] map sum ]
oszczędza 6 bajtów (myślę - niezbyt doświadczony z Factor).t/f
(symbolami) w Factor, więc jest to jedyny sposób na implementację tego[ dup iota swap '[ _ gcd nip 1 = 1 0 ? ] map sum ]
, który ma taką samą dokładną długość jak obecne rozwiązanie.TYPED:
w rzeczywistym kodzie Factor: PJapt
-mx
,75 bajtówUruchom to online
-2 bajty dzięki Shaggy
źródło
-mx
.-m
rozwiązania, ale zapomniałem-x
. Dzięki!Retina,
3629 bajtów7 bajtów dzięki Martinowi Enderowi.
Wypróbuj online!
Wyjaśnienie
Istnieją dwa etapy (polecenia).
Pierwszy etap
Jest to proste podstawienie wyrażenia regularnego, które przekształca dane wejściowe na tak wiele.
Na przykład
5
zostanie przekonwertowany na11111
.Drugi etap
To wyrażenie regularne próbuje dopasować pozycje, które spełniają warunek (co-prime z wejściem), a następnie zwraca liczbę dopasowań.
źródło
Common Lisp, 58 bajtów
Jest to prosta pętla, która zlicza 1 do podanego n i zwiększa sumę, jeśli gcd = 1. Używam nazwy funkcji o, ponieważ t jest prawdziwą wartością logiczną. Nie prawie najkrótszy, ale dość prosty.
źródło
MATLAB / Octave, 21 bajtów
Tworzy anonimową funkcję o nazwie,
ans
którą można wywołać za pomocą liczby całkowitejn
jako jedynego wejścia:ans(n)
Demo online
źródło
Python 2 , 44 bajty
Używa tej samej metody do identyfikacji coprimes, jak moja odpowiedź na „Coprimes do N” .
Wypróbuj online!
źródło
n-1
zamiast zamiast1
, co sprawia, że działan==1
.JavaScript (ES6), 53 bajty
Wypróbuj online!
źródło
Właściwie 11 bajtów
Wypróbuj online!
Wyjaśnienie
Z wbudowanym
Wypróbuj online!
źródło
;╗R`╜g1=`MΣ
tej samej liczby bajtówJavaScript (ES6), 67 bajtów
źródło
05AB1E, 7 bajtów
Wyjaśnił
Wypróbuj online
źródło
L€¿1¢
;Lʒ¿}g
;L€¿ΘO
.APL, 7 bajtów
Jest to monadyczny ciąg funkcji, który przyjmuje liczbę całkowitą po prawej stronie. Podejście tutaj jest oczywiste: suma (
+/
) liczba razy GCD wejścia i liczby od 1 do input (⊢∨⍳
) jest równa 1 (1=
).Wypróbuj tutaj
źródło
Haskell,
3130 bajtów1 bajt zapisany dzięki @Damien.
Wybiera wartości z gcd = 1, mapuje każdą na 1, a następnie pobiera sumę.
źródło
==1
przez<2
Partia,
151145144 bajtówEdycja: Zapisano 4 bajty, usuwając niepotrzebne spacje. Zaoszczędzono 1 bajt
+=
. Zapisano 1 bajt, usuwając,t
ponieważ+=
i tak to zinterpretuje0
. Zapisano 1 bajt dzięki @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.źródło