Ciekawa formuła pierwszej frakcji


17

Biorąc pod uwagę dodatnią liczbę całkowitą n, liczby całkowite a i b (tworząc ułamek zredukowany a / b ) tak, że:

Wzór a / b = iloczyn od k = 1 do n: (p_k ^ 2-1) / (p_k ^ 2 + 1)

Gdzie p k jest k- tą liczbą pierwszą (przy p 1 = 2).

Przykłady:

1   -> 3, 5
2   -> 12, 25
3   -> 144, 325
4   -> 3456, 8125
5   -> 41472, 99125
15  -> 4506715396450638759507001344, 11179755611058498955501765625
420 -> very long

Probabilistyczne sprawdzanie liczb pierwszych jest dozwolone i jest w porządku, jeśli odpowiedź nie powiedzie się z powodu ograniczeń w liczbie całkowitej twojego języka.


Najkrótszy kod w bajtach wygrywa.


Czy możemy również produkować 3.0zamiast 3?
Adnan

2
@AndN Chyba ... Upewnij się, że twój program jest poprawny dla wszystkich danych wejściowych i nie ma błędów zmiennoprzecinkowych dla dużych danych wejściowych.
orlp

Możemy wyjście ai bjako racjonalnego typu?
Alex A.

2
@AlexA. Tylko jeśli dane wyjściowe wyraźnie pokazują obie liczby całkowite.
orlp

1
@SamYonnou Te już istnieją, ale nadużywanie rodzimych typów liczb w celu trywializacji problemu jest jedną z luk, które są domyślnie zabronione.
Dennis

Odpowiedzi:


6

M , 9 bajtów

RÆN²‘İḤCP

Wypróbuj online!

Drobnostki

Poznaj M!

M to widelec galaretki, mający na celu matematyczne wyzwania. Podstawowa różnica między galaretką a M polega na tym, że M używa nieskończonej precyzji do wszystkich wewnętrznych obliczeń, reprezentując symbolicznie wyniki. Gdy M stanie się bardziej dojrzałe, galaretka stopniowo stanie się bardziej uniwersalna i mniej zorientowana na matematykę.

M jest bardzo dużo pracy w toku (pełne błędów, i nie bardzo , że różni się od Jelly teraz), ale działa jak czar na to wyzwanie, a ja po prostu nie mógł się oprzeć.

Jak to działa

RÆN²‘İḤCP  Main link. Argument: n

R          Range; yield [1, ..., n].
 ÆN        Compute the kth primes for each k in that range.
   ²‘      Square and increment each prime p.
     İ     Invert; turn p² + 1 into the fraction 1 / (p² + 1).
      Ḥ    Double; yield 2 / (p² + 1).
       C   Complement; yield 1 - 2 / (p² + 1).
        P  Product; multiply all generated differences.

Czy jest ÆNto jedyny operator specyficzny dla M? Również Melly
CalculatorFeline

Żaden z tych operatorów nie jest specyficzny dla M. Różnica polega na tym, że M oblicza ułamek, podczas gdy Jelly oblicza liczbę zmiennoprzecinkową.
Dennis

9

Mathematica, 32 bajty

1##&@@(1-2/(Prime@Range@#^2+1))&

Nienazwana funkcja, która pobiera dane liczbowe całkowite i zwraca rzeczywistą część.

Wykorzystuje to fakt . Kod jest następnie golfowany dzięki temu, że Mathematica wątkuje wszystkie podstawowe operacje arytmetyczne na listach. Więc najpierw tworzymy listę , a następnie pobieramy wszystkie liczby pierwsze i podłączamy tę listę do powyższego wyrażenia. To daje nam listę wszystkich czynników. Na koniec mnożymy wszystko razem, stosując się do listy, na którą można grać w golfa .(p2-1)/(p2+1) = 1-2/(p2+1){1, 2, ..., n}Times1##&

Alternatywnie możemy użyć Arraydla tej samej liczby bajtów:

1##&@@(1-2/(Prime~Array~#^2+1))&

1-2= 1prawda?
CalculatorFeline

@CatsAreFluffy Tak ( -1właściwie), ale 1-2/x ≠ -1/x. ;)
Martin Ender

@Range@±~Array~
Kalkulator

6

Python 2, 106 bajtów

from fractions import*
n=input()
F=k=P=1
while n:b=P%k>0;n-=b;F*=1-Fraction(2*b,k*k+1);P*=k*k;k+=1
print F

Pierwsza i czwarta linia tak bardzo bolały ... po prostu okazało się, że używanie Fractionbyło lepsze niż mnożenie osobno i używanie gcd, nawet w Pythonie 3.5+, gdzie się gcdznajduje math.

Pierwsza generacja zaadaptowana z odpowiedzi @ xnora tutaj , która wykorzystuje twierdzenie Wilsona.


5

Ruby, 122 77 65 bajtów

Podziękowania dla Sherlocka za stratę 10 bajtów.

require'prime'
->n{Prime.take(n).map{|x|1-2r/(x*x+1)}.reduce(:*)}

Definiuje anonimową funkcję, która pobiera liczbę i zwraca a Rational.


4

PARI / GP , 33 bajty

n->prod(i=1,n,1-2/(prime(i)^2+1))

Alternatywna wersja (46 bajtów):

n->t=1;forprime(p=2,prime(n),t*=1-2/(p^2+1));t

Wersja niekonkurencyjna z t_REALwynikiem zmiennoprzecinkowym ( ) (38 bajtów):

n->prodeuler(p=2,prime(n),1-2/(p^2+1))

4

Galaretka , 14 13 bajtów

RÆN²µ’ż‘Pµ÷g/

Wypróbuj online! Dzięki @Dennis za -1 bajtów.

R                       Range [1..n]
 ÆN                     Nth prime
   ²                    Square
    µ                   Start new monadic chain
     ’ż‘                Turn each p^2 into [p^2-1, p^2+1]
        P               Product
         µ              Start new monadic chain
          ÷             Divide by...
           g/           Reduce GCD

4

Pyth 26 25

/RiFN=N*MCm,tdhd^R2.fP_ZQ

Wypróbuj tutaj lub uruchom pakiet testowy .

1 bajt zapisany dzięki Jakube!

Dość naiwne wdrożenie specyfikacji. Używa sztywnego „nowego” (nie mam pojęcia, kiedy to zostało dodane, ale nigdy go nie widziałem), P<neg>który zwraca, czy dodatnia wartość liczby ujemnej jest liczbą pierwszą, czy nie. Niektóre mapy itp. Można prawdopodobnie zagrać w golfa ...


3

Julia, 59 42 bajtów

n->prod(1-big(2).//-~primes(2n^2)[1:n].^2)

Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca Rationalz BigIntlicznikiem i mianownikiem.

Zaczynamy od wygenerowania listy liczb pierwszych mniejszych niż 2 n 2 i wybrania pierwszych n elementów. Działa to, ponieważ n- ta liczba pierwsza jest zawsze mniejsza niż n 2 dla wszystkich n > 1. ( Zobacz tutaj .)

Dla każdego p o n bodźce wybranego do kwadratu s przy zasilaniu elementwise ( .^2), i konstruowania racjonalnego 2 / ( p + 1), gdzie 2 jest najpierw przekształca się w BigIntcelu zapewnienia odpowiedniej precyzji. Odejmujemy to od 1, bierzemy wynikową tablicę wymiernych i zwracamy wynikową wymierną.

Przykładowe użycie:

julia> f = n->prod(1-big(2).//-~primes(2n^2)[1:n].^2)
(anonymous function)

julia> f(15)
4506715396450638759507001344//11179755611058498955501765625

Oszczędności 17 dzięki Sp3000!


2

Wypukły, 28 bajtów

Convex to nowy język, który rozwijam, oparty w dużej mierze na CJam i Golfscript. Tłumacz i IDE można znaleźć tutaj . Dane wejściowe to liczba całkowita w argumentach wiersza poleceń. Indeksy są oparte na jednym. Wykorzystuje kodowanie CP-1252.

,:)_{µ²1-}%×\{µ²1+}%×¶_:Ðf/p

Możesz uznać tę odpowiedź za konkurencyjną lub nie, ponieważ pracowałem nad kilkoma funkcjami używanymi przez ten program przed opublikowaniem wyzwania, ale zatwierdzenie zostało wykonane, gdy zobaczyłem, że wyzwanie się skończyło.


2

MATL , 18 bajtów

:Yq2^tqpwQpZd1Mhw/

Wypróbuj online!

Nie działa przy dużych wejściach, ponieważ tylko liczby całkowite do 2^52mogą być dokładnie reprezentowane wewnętrznie.

Wyjaśnienie

:     % implicitly take input n. Generate range [1,...,n]
Yq    % first n prime numbers
2^    % square
tqp   % duplicate. Subtract 1. Product
wQp   % swap. Add 1. Product
Zd    % gcd of both products
1M    % push the two products again
h     % concatenate horizontally
w/    % swap. Divide by previously computed gcd. Implicitly display

2

Mathematica, 45 bajtów

Times@@Array[(Prime@#^2-1)/(Prime@#^2+1)&,#]&

Liczby pierwsze? Ułamki? Matematyka.


1

Haskell, 53 bajty

Funkcja anonimowa, 53 znaki:

(scanl(*)1[1-2%(p*p+1)|p<-nubBy(((>1).).gcd)[2..]]!!)

Wypróbuj go tutaj (uwaga: w standardzie GHCi trzeba najpierw upewnić się, Data.Ratioi Data.Listsą importowane):

λ (scanl(*)1[1-2%(p*p+1)|p<-nubBy(((>1).).gcd)[2..]]!!) 5
41472 % 99125
:: Integral a => Ratio a

Indeksowanie list Haskell !!opiera się na 0. (___!!)to sekcja operatora , która tworzy anonimową funkcję, dzięki czemu (xs !!) n == xs !! n.

Generowanie całej sekwencji to cztery bajty mniej:

λ mapM_ print $ take 10 $     -- just for a nicer output
    scanl(*)1[1-2%(n*n+1)|n<-[2..],all((>0).rem n)[2..n-1]]
1 % 1
3 % 5
12 % 25
144 % 325
3456 % 8125
41472 % 99125
3483648 % 8425625
501645312 % 1221715625
18059231232 % 44226105625
4767637045248 % 11719917990625
:: IO ()

0

Poważnie, 25 bajtów

,r`PªD;⌐k`M┬`π`Mi│g;)@\)\

Wyjścia a\nb ( \nto nowa linia). Duże wejścia zajmą dużo czasu (i mogą się nie powieść z powodu braku pamięci), ponieważ generowanie liczb pierwszych jest dość wolne.

Wypróbuj online!

Wyjaśnienie:

,r`PªD;⌐k`M┬`π`Mi│g;)@\)\
,r                         push range(input)
  `PªD;⌐k`M                map:
   P                         k'th prime
    ª                        square
     D                       decrement
      ;                      dupe
       ⌐                     add 2 (results in P_k + 1)
        k                    push to list
           ┬               transpose
            `π`M           map product
                i│         flatten, duplicate stack
                  g;)      push two copies of gcd, move one to bottom of stack
                     @\    reduce denominator
                       )\  reduce numerator

Tytuł wygląda przezabawnie. Czytam to jako „Poważnie, 25 bajtów?!”
katana_0,

@AlexKChen Minęły prawie 2 lata, odkąd stworzyłem ten język, a teraz się opłaca :)
Mego
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.