Wprowadzenie
Teoria liczb jest pełna cudów w postaci nieoczekiwanych połączeń. Oto jeden z nich.
Dwie liczby całkowite są współ-prime , jeśli nie mają one wspólne czynniki inne niż 1. Biorąc pod uwagę liczbę N , należy rozważyć wszystkie liczby całkowite od 1 do N . Losuj dwie takie liczby całkowite losowo (wszystkie liczby całkowite mają takie samo prawdopodobieństwo, że zostaną wybrane przy każdym losowaniu; losowania są niezależne i zastępują). Niech p oznacza prawdopodobieństwo, że dwie wybrane liczby całkowite są pierwszymi. Następnie p dąży do 6 / π 2 ≈ 0,6079 ... tak jak N dąży do nieskończoności.
Wyzwanie
Celem tego wyzwania jest obliczenie s w zależności od N .
Jako przykład rozważmy N = 4. Istnieje 16 możliwych par uzyskanych z liczb całkowitych 1,2,3,4. 11 z tych par jest równoległych, a mianowicie (1,1), (1,2), (1,3), (1,4), (2,1), (3,1), (4,1 ), (2,3), (3,2), (3,4), (4,3). Zatem p wynosi 11/16 = 0,6875 dla N = 4.
Dokładną wartość p musi być obliczana z co najmniej czterech miejsc po przecinku. Oznacza to, że obliczenia muszą być deterministyczne (w przeciwieństwie do Monte Carlo). Ale nie musi to być bezpośrednie wyliczenie wszystkich par jak wyżej; można zastosować dowolną metodę.
Można użyć argumentów funkcyjnych lub stdin / stdout. Jeśli wyświetlasz wynik, zera końcowe można pominąć. Na przykład 0.6300
może być wyświetlany jako 0.63
. Powinien być wyświetlany jako liczba dziesiętna, a nie jako ułamek (wyświetlanie łańcucha 63/100
jest niedozwolone).
Kryterium wygranej to najmniej bajtów. Nie ma żadnych ograniczeń dotyczących korzystania z wbudowanych funkcji.
Przypadki testowe
Wejście / wyjście (tylko cztery miejsca po przecinku są obowiązkowe, jak wskazano powyżej):
1 / 1.000000000000000
2 / 0.750000000000000
4 / 0.687500000000000
10 / 0.630000000000000
100 / 0.608700000000000
1000 / 0.608383000000000
źródło
63/100
jest prawidłowym dosłownym tekstem, użytecznym w obliczeniach. (Języki, o których mówię: czynnik , rakieta )Odpowiedzi:
Galaretka ,
128 bajtówWypróbuj online!
Poniższy kod binarny działa z tą wersją interpretera Jelly .
Pomysł
Oczywiście liczba par (j, k), tak że j ≤ k i j i k są równe, jest równa liczbie par (k, j), które spełniają te same warunki. Ponadto, jeśli j = k , j = 1 = k .
Tak więc, aby policzyć liczbę współpierwotnych par o współrzędnych od 1 do n , wystarczy obliczyć liczbę m par (j, k) taką, że j ≤ k , a następnie obliczyć 2m - 1 .
Wreszcie, ponieważ funkcja sumy Eulera φ (k) daje liczby całkowite od 1 do k, które są równe liczbie pierwotnej do k , możemy obliczyć m jako φ (1) +… + φ (n) .
Kod
źródło
Mathematica
4342 bajtyZauważyłem, że punkty Kraty widoczne z początku , z którego wykonano poniższe zdjęcie, są pomocne w przeformułowaniu problemu poprzez następujące pytania dotyczące danego kwadratowego obszaru siatki jednostki:
Przykłady
Zera końcowe są pomijane.
wyczucie czasu
Czas w sekundach poprzedza odpowiedź.
źródło
Pyth -
1311 bajtówPakiet testowy .
źródło
Mathematica,
4232 bajtyFunkcja anonimowa, wykorzystuje prostą brutalną siłę. Ostatnia sprawa działa na moim komputerze za około 0,37 sekundy. Wyjaśnienie:
źródło
Count[Array[GCD,{#, #}],1,2]/#^2.&
Bądź moim gościem.Dyalog APL, 15 bajtów
Całkiem proste. Jest to monadyczny ciąg funkcji. Iota to liczby od 1 do wejścia, więc bierzemy zewnętrzny produkt przez gcd, a następnie liczymy proporcję jedności.
źródło
Oktawa,
4947 bajtówTylko obliczanie
gcd
wszystkich par i liczenie.źródło
kron
! Dobry pomysł!meshgrid
, ale potem zauważyłem, że mogę zrobić to samo zkron
inline! (-> funkcja anonimowa)JavaScript (ES6), 88 bajtów
Wyjaśnienie
Test
Zajmuje trochę czasu dla dużych (
>100
) wartościn
.Pokaż fragment kodu
źródło
Poważnie, 15 bajtów
Hex Dump:
Wypróbuj online
Nie zamierzam zawracać sobie głowy wyjaśnianiem tego, ponieważ dosłownie używa dokładnie tego samego algorytmu, co rozwiązanie Jelly'ego Jelly'ego (chociaż wyprowadziłem go niezależnie).
źródło
J,
1917 bajtówStosowanie:
Wyjaśnienie:
Rozwiązanie Dennisa daje ładne wyjaśnienie, w jaki sposób możemy użyć funkcji totient.
Wypróbuj online tutaj.
źródło
Mathematica, 35 bajtów
Implementuje algorytm @ Dennisa.
Oblicz sumę totemu (funkcja ph Eulera) w zakresie od 1 do wartości wejściowej. Pomnóż przez liczbę zmiennoprzecinkową dwa (z czterema cyframi dokładności) i odejmij jedną. (Można zachować większą precyzję, używając zamiast tego „
2
” i „1`4
”.) Jest to całkowita liczba par coprime, więc podziel przez kwadrat danych wejściowych, aby uzyskać żądany ułamek. Ponieważ dwa są liczbą przybliżoną, taki jest też wynik.Testowanie (z danymi pomiaru czasu w lewej kolumnie, ponieważ przynajmniej jeden z nas uważa to za interesujące), z przypisaną funkcją, aby
f
łatwiej było odczytać linię testową:Edycja: Pokazywanie zakresu zakresu danych wejściowych (zamiana precyzji na jeden zamiast dwóch, ponieważ w przeciwnym razie wyniki stają się raczej monotonne) i zachęcanie innych do zrobienia tego samego ...
RepeatedTiming[]
wykonuje obliczenia wiele razy i zajmuje to średnio tyle czasu, próbując zignorować zimne pamięci podręczne i inne efekty powodujące wartości odstające od czasu. Limit asymptotyczny wynosiwięc dla argumentów> 10 ^ 4 możemy po prostu zwrócić „0.6079” i spełnić określone wymagania dotyczące precyzji i dokładności.
źródło
Julia, 95 bajtów
Na razie proste podejście; Wkrótce zajmę się krótszymi / bardziej eleganckimi rozwiązaniami. Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca liczbę zmiennoprzecinkową. Aby go wywołać, przypisz go do zmiennej.
Nie golfowany:
źródło
collect
leniwego przedmiotu, aby go wziąćlength
.length
nie ma zdefiniowanej metody, co ma miejsce w przypadku iteratora kombinacji filtrowanych. Podobnieendof
nie działałoby, ponieważ nie ma metody dla tego typugetindex
.range
nie zwraca tego samego rodzaju obiektu jakcombinations
. Ten ostatni zwraca iterator nad kombinacjami, który jest osobnym typem bez zdefiniowanejlength
metody. Zobacz tutaj . (Również przy konstruowaniu zakresów:
preferowana jest składniarange
;))Szałwia, 55 bajtów
Dzięki Sage obliczając wszystko symbolicznie, problemy z epsilon i zmiennoprzecinkowymi maszyn nie pojawiają się. Kompromis polega na tym, że aby zachować zgodność z regułą formatu wyjściowego, konieczne jest dodatkowe wywołanie funkcji
n()
(funkcja przybliżenia dziesiętnego).Wypróbuj online
źródło
MATL ,
2017 bajtówUżywa bieżącej wersji (5.0.0) języka.
Podejście oparte na odpowiedzi @ flawr .
Edytuj (28 kwietnia 2015 r.) : Wypróbuj online! Po opublikowaniu tej odpowiedzi
Y)
zmieniono nazwę funkcji naX:
; link zawiera tę zmianę.Przykład
Wyjaśnienie
Stara odpowiedź: 20 bajtów
Wyjaśnienie
źródło
PARI / GP , 25 bajtów
Anonimowość tej funkcji pozwoliłaby zaoszczędzić bajt, ale musiałbym użyć,
self
aby ogólnie była droższa.źródło
Czynnik,
120113 bajtówSpędziłem lekcje gry w golfa i nie mogę tego skrócić.
Tłumaczenie: Julia .
Przykład działa na pierwszych 5 testowych przypadkach (wartość 1000 powoduje zawieszenie edytora i nie mogę sobie teraz pozwolić na kompilację pliku wykonywalnego):
źródło
Samau , 12 bajtów
Oświadczenie: Nie konkuruje, ponieważ zaktualizowałem język po opublikowaniu pytania.
Zrzut szesnastkowy (Samau używa kodowania CP737):
Korzystanie z tego samego algorytmu, co odpowiedź Dennisa w Galaretce.
źródło
Python2 / Pypy, 178 bajtów
x
Pliku:Bieganie:
Kod zlicza pary równoległe
(n,m) for m<n
dwa razy (c+=2
). Ignoruje(i,i) for i=1..n
to, co jest w porządku, poza(1,1)
tym, że jest korygowane przez zainicjowanie licznika za pomocą1
(1.0
aby przygotować się do podziału zmiennoprzecinkowego później) w celu kompensacji.źródło