Obliczyć wartość

16

Wyzwanie

Biorąc pod uwagę liczbę całkowitą, , jako dane wejściowe, gdzie wyprowadza wartość (gdzie reprezentuje funkcję Ziem Riemanna ).ss1ζ(s)ζ(x)

Dalsza informacja

ζ(s) jest zdefiniowany jako:

ζ(s)=n=11ns

Powinieneś podać swoją odpowiedź z dokładnością do 5 miejsc po przecinku (nie więcej, nie mniej). Jeśli odpowiedź brzmi nieskończoność, powinieneś lub odpowiednik w swoim języku.

Wbudowane Riemann Zeta są dozwolone, ale robi się to mniej zabawnie;)

Przykłady

Dane wyjściowe muszą być dokładnie takie, jak pokazano poniżej

Input -> Output
1 -> ∞ or inf etc.
2 -> 1.64493
3 -> 1.20206
4 -> 1.08232
8 -> 1.00408
19 -> 1.00000

Hojność

Na pocieszenie za umożliwienie wbudowania zaoferuję nagrodę 100 powtórzeń za najkrótszą odpowiedź, która nie korzysta z wbudowanych funkcji zeta. (Zielony znacznik wyboru nadal będzie oznaczał najkrótsze rozwiązanie)

Zwycięski

Najkrótszy kod w bajtach wygrywa.

Rozpad beta
źródło
7
To wyzwanie miało taki potencjał ... Dopóki nie zezwoliłeś na wbudowane ...
HyperNeutrino
@HyperNeutrino Tak, wysłałem, ponieważ widziałem wyzwanie dozwolone wbudowane. FGITW
NoOneIsHere
2
Czy „z dokładnością do 5 miejsc po przecinku” jest ścisłe? (tzn. czy możemy generować dane z większą precyzją?) Jeśli nie, przypadki testowe powinny naprawdę pokazywać 6dp.
Jonathan Allan
@JonathanAllen Mam wyjaśnione spec zaokrąglania
rozpadu beta
3
@BetaDecay (westchnienie bez pinga) czy wejście 19 naprawdę wypisuje tekst 1.00000? Nie 1lub 1.0być ważny? Wygląda na to, że podjąłeś wyzwanie kameleona.
Jonathan Allan

Odpowiedzi:

11

Mathematica, 9 7 11 bajtów

Zeta@#~N~6&

Wyjaśnienie:

Zeta@#       (* Zeta performed on input *)
      ~N     (* Piped into the N function *)
        ~6   (* With 6 digits (5 decimals) *)
          &  (* Make into function *)

Wynik Mathematica

Bez wbudowanego:

Mathematica, 23 bajty UTF-8

Sum[1/n^#,{n,∞}]~N~6&

Dzięki Kelly Lowder

Nikogo tu nie ma
źródło
3
N@*Zetaoszczędza dwa bajty.
Martin Ender,
@*to (lewy) operator kompozycji: f@*goznacza funkcję, której wartością w argumencie xjest f[g[x]].
Greg Martin
@BetaDecay Do 1wyjścia ComplexInfinity, i zaokrągla się do 5miejsc. (np. 1.64493)
NoOneIsHere
@MartinEnder Jak *działa?
NoOneIsHere
1
@NoOneIsTutaj używana jest twoja odpowiedź, N~5ale użyte jest twoje wyjaśnienie 6.
numbermaniac
8

JavaScript, 81 70 66 65 bajtów

s=>s-1?new Int8Array(1e6).reduce((a,b,i)=>a+i**-s).toFixed(5):1/0

Przykłady możliwe do uruchomienia:

ζ=s=>s-1?new Int8Array(1e6).reduce((a,b,i)=>a+i**-s).toFixed(5):1/0

const values = [ 1, 2, 3, 4, 8, 19 ];
document.write('<pre>');
for(let s of values) {
  document.write('ζ(' + s + ') = ' + ζ(s) + '\n')
}

Frxstrem
źródło
Po co nazywać to Z? Symbol zeta jest prawidłową nazwą funkcji w JS i nie trzeba jej grać w golfa.
Pozew Fund Moniki w
Wymień Array(1e6).fill()się [...Array(1e6)]i wymienić pierwsze (s)zs
Conor O'Brien
1
@QPaysTaxes Dobra uwaga! Nazwy zmiennych Unicode ftw!
Frxstrem,
@ ConorO'Brien Huh, nigdy nie zdawałem sobie sprawy, że podstęp Array (myślałem, że rzadkie tablice się nie powtarzają, ale chyba się myliłem). Dzięki!
Frxstrem,
@Frxstrem Pamiętaj, że ζ zajmuje dwa bajty
CocoaBean
6

APL (Dyalog) , 22 21 bajtów

Spójrz, nie ma wbudowanych! -1 dzięki ngn.

Ponieważ Dyalog APL nie ma nieskończoności, używam proponowanej notacji Iversona .

{1=⍵:'¯'5⍕+/÷⍵*⍨⍳!9}

Wypróbuj online!

{ funkcja anonimowa:

1=⍵: jeśli argument jest jeden, to:

  '¯' zwróć makron

 jeszcze

  !9 silnia dziewięć (362880)

   Pierwszy, że wiele liczb całkowitych I ntegers

  ⍵*⍨ podnieś ich do potęgi argumentu

  ÷ wartości wzajemne

  +/ suma

  5⍕ format z pięcioma miejscami po przecinku

} [koniec anonimowej funkcji]

Adám
źródło
1
1E6-> !9
ngn
@ngn Dziękuję.
Adám,
5

C, 74 70 69 bajtów

n;f(s){double z=n=0;for(;++n>0;)z+=pow(n,-s);printf("%.5f",z/=s!=1);}

Kompiluj z -fwrapv. Wytworzenie wyjścia zajmie trochę czasu.

Zobacz, jak to działa tutaj . Część ++n>0zostaje zastąpiona ++n<999999, więc nie musisz czekać. Pozwala to zachować identyczną funkcjonalność i wydajność.

2501
źródło
Czy floatdziała
l4m2
5

TI-Basic, 16 bajtów (bez wbudowanych)

Fix 5:Σ(X^~Ans,X,1,99
Timtech
źródło
Naprawdę musisz wzrosnąć do około 150000, aby uzyskać właściwą odpowiedź dla Ans = 2, co obliczyłoby ponad pół godziny na 84 Plus CE. Możesz także pomnożyć gdzieś (Ans-1) ^ 0, aby otrzymać błąd dla Ans = 1, najbliższej reprezentacji nieskończoności przez TI-Basic!
pizzapants184
@ pizzapants184 Jestem w pełni świadomy, że 2, 3 itd. mogą wymagać więcej niż 99 iteracji. Można to osiągnąć poprzez zastąpienie funkcjonalności 99z E9którym E oznacza E naukowych, tj reprezentujących 10 ^ 9. (Lub oczywiście coś mniejszego jak E5). Zrozumienie, że E99 jest ogólnie stosowane dla dodatniej nieskończoności, pozwala również na tę funkcjonalność teoretycznie, jeśli górna granica sumy była E99. Emulatory mogą zapewnić to znacznie szybciej niż fizyczny kalkulator. Dzięki za przemyślenia :)
Timtech
Nie sądzę, że liczy się to jako wyświetlanie nieskończoności. Nawet nie rzuci błędu, jeśli dodasz 1 nieskończenie, ze względu na niedokładność zmiennoprzecinkową.
lirtosiast
4

C (gcc) , 112 101 94 84 bajtów

Dzięki za wskazówki dotyczące gry w golfa od pułapu kota.

n;f(s){float r;for(n=98;n;r+=pow(n--,-s));printf("%.5f",r+pow(99,-s)*(.5+99./--s));}

Wypróbuj online!

cleblanc
źródło
1
Pytanie zostało zredagowane. Możesz wypisywać symbole rodzimej nieskończoności języka.
2501
@ 2501 Wróciłem do poprzedniej odpowiedzi, chociaż wciąż jestem o kilka bajtów daleko od twojego rozwiązania.
cleblanc
@ceilingcat f(1)nie wydaje się poprawny.
cleblanc
83 bajty
ceilingcat
3

Julia , 36 bajtów

x->x!=1?@sprintf("%.5f",zeta(x)):Inf
Uriel
źródło
2

MATL , 21 bajtów

q?'%.5f'2e5:G_^sYD}YY

Wypróbuj online!

Wyjaśnienie

Wejście 1jest specjalnie zaprojektowane do wyjścia inf, tak jak MATL wyświetla nieskończoność.

W przypadku danych wejściowych innych niż 1sumowanie pierwszych 2e5wyrazów wystarczy, aby uzyskać dokładność do 5 miejsc po przecinku. Powodem jest to, że z bezpośredniego obliczenia ta liczba terminów wystarcza na dane wejściowe 2, a dla większych wykładników ogon serii jest mniejszy.

q         % Input (implicit) minus 1
?         % If non-zero
  '%.5f'  %   Push string: format specifier
  2e5:    %   Push [1 2 ... 2e5]
  G       %   Push input again
  _       %   Negate
  ^       %   Power. element-wise
  s       %   Sum of array
  YD      %   Format string with sprintf
}         % Else
YY        %   Push infinity
          % End (implicit)
          % Display (implicit)
Luis Mendo
źródło
2

R, 54 bajty

function(a){round(ifelse(a==1,Inf,sum((1:9^6)^-a)),5)}

Znajduje sumę bezpośrednio i formatuje zgodnie z życzeniem, wypisuje, Infjeśli a wynosi 1. Podsumowanie 9^6wydaje się wystarczające, aby uzyskać dokładność pięciu miejsc, a jednocześnie być testowalnym; 9^9uzyskałby lepszą dokładność przy tej samej długości kodu. Mogłabym to skrócić, gdyby R miał właściwego operatora trójskładnikowego.

Michael Lugo
źródło
1
function(a)round("if"(a-1,sum((1:9^6)^-a)),5)jest kilka bajtów krótszy.
Giuseppe,
Tak, ale generuje błąd, jeśli a = 1. function(a)round("if"(a-1,sum((1:9^6)^-a),Inf),5)działa i wciąż jest krótsze niż moje oryginalne rozwiązanie.
Michael Lugo
Oh tak, oczywiście! Zapomniałem dołączyć Inf, właśnie to dostaję za wpisanie kodu bezpośrednio w polu komentarza ...
Giuseppe,
2

C, 129 130 128 bajtów

#include<math.h>
f(s,n){double r=0;for(n=1;n<999;++n)r+=(n&1?1:-1)*pow(n,-s);s-1?printf("%.5f\n",r/(1-pow(2,1-s))):puts("oo");}

używa następującej formuły

\ zeta (s) = \ frac {1} {1-2 ^ {1-s}} \ sum \ limit_ {n = 1} ^ {\ infty} {\ frac {(- 1) ^ {n + 1} } {n ^ s}}

test i wyniki

main(){f(2,0);f(1,0);f(3,0);f(4,0);f(8,0);f(19,0);}

1.64493
+oo
1.20206
1.08232
1.00408
1.00000
RosLuP
źródło
Dlaczego to równanie zamiast Σ(1/(n^s))? Wydaje się to o wiele bardziej skomplikowane ...
Rozpad Beta
@BetaDecay, ponieważ wydaje mi się, że znalezienie wyniku jest szybsze; tutaj jest zakres sumy s w 1..999, w „Σ (1 / (n ^ s))” potrzeba s w zakresie 1..10 ^ 6
RosLuP,
1
Widzę. Do Twojej wiadomości, po prostu oojest w porządku, nie musisz określać go jako pozytywnego
rozpad Beta
1
85 bajtów
pułapkat
@ceilingcat możesz napisać jeszcze jeden wpis na to pytanie ... wygląda na to, że pamiętam tutaj bez nagłówka
mat.h,
2

Python 3: 67 bajtów (bez wbudowanych)

f=lambda a:"∞"if a<2else"%.5f"%sum([m**-a for m in range(1,10**6)])

Nic szczególnego, używa tylko Pythona 3 z powodu niejawnego kodowania utf-8.

Wypróbuj online z przypadkami testowymi.

Chris H.
źródło
1

Perl 6 , 50 bajtów

{$_-1??(1..1e6).map(* **-$_).sum.fmt('%.5f')!!∞}
Sean
źródło
1

PARI / GP, 27 26 bajtów

\p 6
s->trap(,inf,zeta(s))
alephalpha
źródło
1

Galaretka , 23 bajty

ȷ6Rİ*⁸S÷Ị¬$ær5;ḷỊ?”0ẋ4¤

Wypróbuj online!

W jaki sposób?

  • Podsumowuje pierwszy milion terminów
  • Dzieli, 0kiedy abs(input)<=1należy ustąpić inf(zamiast 14.392726722864989)1
  • Zaokrągla do 5 miejsc po przecinku
  • Dołącza cztery zera, jeśli abs(result)<=1sformatować 1.0jako1.00000
  • Wyświetla wynik

ȷ6Rİ*⁸S÷Ị¬$ær5;ḷỊ?”0ẋ4¤ - Main link: s
ȷ6                      - literal one million
  R                     - range: [1,2,...,1000000]
   İ                    - inverse (vectorises)
     ⁸                  - link's left argument, s
    *                   - exponentiate
      S                 - sum
          $             - last two links as a monad:
        Ị               -   insignificant? (absolute value of s less than or equal to 1?)
         ¬              -   not (0 when s=1, 1 when s>1)
       ÷                - divide (yielding inf when s=1, no effect when s>1)
           ær5          - round to 10^-5
                      ¤ - nilad followed by link(s) as a nilad:
                  ”0    -   literal '0'
                    ẋ4  -   repeated four times
                Ị?      - if insignificant (absolute value less than or equal to 1?)
              ;         -       concatenate the "0000" (which displays as "1.00000")
               ḷ        - else: left argument
                        - implicit print
Jonathan Allan
źródło
1

Python 3 + SciPy, 52 bajty

lambda n:'%.5f'%zeta(n,1)
from scipy.special import*

Wypróbuj online!

całkowicie ludzki
źródło
1
Czy to wyjście dla danych wejściowych 1?
ETHprodukcje
1
Podobnie, czy to zaokrąglenie do pięciu miejsc po przecinku?
Beta Decay
1
@ETHproductions Wyprowadza, infco jest dozwolone.
całkowicie ludzki,
Super późno, ale czy nie mógłbyś użyć zetac(n)zamiast tego zeta(n,1)?
NoOneIsHere
0

Galaretka , 26 bajtów

⁵*5İH+µŒṘḣ7
⁴!Rİ*³Sǵ’ݵ’?

Nie próbuj online z tym linkiem! (Ponieważ używa to 16! ~ 20 bilionów terminów, uruchomienie w TIO powoduje błąd MemoryError)

Zamiast tego wypróbuj online z tym linkiem. (Zamiast tego używa 1 miliona haseł. Znacznie łatwiejszy do zarządzania, ale zajmuje jeszcze jeden bajt)

Zwraca infdane wejściowe 1.

Wyjaśnienie

⁵*5İH+µŒṘḣ7    - format the output number
⁵*5İH+         - add 0.000005
      µŒṘ      - get a string representation
         ḣ7    - trim after the fifth decimal.

⁴!Rİ*³Sǵ’ݵ’? - main link, input s
           µ’? - if input minus 1 is not 0...
⁴!R            -   [1,2,3,...,16!] provides enough terms.
   İ           -   take the inverse of each term
    *³         -   raise each term to the power of s
      S        -   sum all terms
       Ç       -   format with the above link
               - else:
        µ’İ    -   return the reciprocal of the input minus 1 (evaluates to inf)

Spośród 26 bajtów, 7 jest wykorzystywanych do obliczeń, 12 służy do formatowania, a 7 do tworzenia infzera. W tym celu musi być lepszy golf.

fireflame241
źródło
ȷ6to literał liczbowy miliona, co eliminuje obejście czynnikowe.
Jonathan Allan
0

MathGolf , 14 bajtów (bez wbudowanych)

┴¿Å'∞{◄╒▬∩Σ░7<

Zauważ, że w związku tio mam podstawione przez , który pchnął106 zamiast 107. Wynika to z przekroczenia limitu czasu przesłanej tutaj wersji dla wszystkich przypadków testowych. Powoduje to, że odpowiedzi dla 3 i 8 są wyłączone o 1 miejsce po przecinku. W MathGolf istnieją jednak znacznie większe jednobajtowe literały liczbowe, które pozwalają na dowolną dokładność dziesiętną.

Wypróbuj online!

Wyjaśnienie

┴                check if equal to 1
 ¿               if/else (uses one of the next two characters/blocks in the code)
  Å              start block of length 2
   '∞            push single character "∞"
     {           start block or arbitrary length
      ◄          push 10000000
       ╒         range(1,n+1)
        ▬        pop a, b : push(b**a)
         ∩       pop a : push 1/a (implicit map)
          Σ      sum(list), digit sum(int)
           ░     convert to string (implicit map)
            7    push 7
             <   pop(a, b), push(a<b), slicing for lists/strings
maxb
źródło