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.

orlp
źródło
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.
Dennis
źródło
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))&
Martin Ender
źródło
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.

Sp3000
źródło
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.

spaghetto
źródło
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))
Charles
źródło
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
Sp3000
źródło
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 ...

FryAmTheEggman
źródło
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!

Alex A.
źródło
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.

GamrCorps
źródł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
Luis Mendo
źródło
2

Mathematica, 45 bajtów

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

Liczby pierwsze? Ułamki? Matematyka.

CalculatorFeline
źródło
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 ()
Will Ness
źródło
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
Mego
źródło
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