Calculez la valeur de

16

Défi

Étant donné un entier, , comme entrée où s 1 sort la valeur de ζ ( s ) (où ζ ( x ) représente la fonction Riemann Zeta ).ss1ζ(s)ζ(x)

Plus d'informations

est défini comme:ζ(s)

ζ(s)=n=11ns

Vous devez afficher votre réponse à 5 décimales (ni plus, ni moins). Si la réponse s'avère être l'infini, vous devez sortir ou équivalent dans votre langue.

Les modules intégrés Riemann Zeta sont autorisés, mais c'est moins amusant de le faire de cette façon;)

Exemples

Les sorties doivent être exactement comme indiqué ci-dessous

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

Prime

En guise de consolation pour autoriser les intégrés, j'offrirai une prime de 100 rep à la réponse la plus courte qui n'utilise pas les fonctions zêta intégrées. (La coche verte ira toujours à la solution la plus courte dans l'ensemble)

Gagnant

Le code le plus court en octets gagne.

Beta Decay
la source
7
Ce défi avait un tel potentiel ... Jusqu'à ce que vous autorisiez les buildins ...
HyperNeutrino
@HyperNeutrino Yep, j'ai posté parce que je voyais que le défi permettait les buildins. FGITW
NoOneIsHere
2
"Avec une précision de 5 décimales" est-il strict? (c.-à-d. pouvons-nous sortir avec plus de précision?) Sinon, les cas de test devraient montrer 6dp vraiment.
Jonathan Allan
@JonathanAllen J'ai clarifié les spécifications d'arrondi
Beta Decay
3
@BetaDecay (soupir sans ping) une entrée devrait-elle 19 vraiment sortir le texte 1.00000? Ne serait-ce pas 1ou 1.0serait-il valide? Il semble que vous en ayez fait un défi de caméléon.
Jonathan Allan

Réponses:

11

Mathematica, 9 7 11 octets

Zeta@#~N~6&

Explication:

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

Mathematica result

Sans intégré:

Mathematica, 23 octets UTF-8

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

Merci à Kelly Lowder

Il n'y a personne
la source
3
N@*Zetaenregistre deux octets.
Martin Ender
@*est l'opérateur de composition (gauche): f@*gdésigne une fonction dont la valeur à l'argument xest f[g[x]].
Greg Martin
@BetaDecay Car 1il sort ComplexInfinity, et il arrondit aux 5endroits. (ex. 1.64493)
NoOneIsHere
@MartinEnder Comment ça *marche?
NoOneIsHere
1
@NoOneIsHere votre réponse utilise N~5mais votre explication utilise 6.
numbermaniac
8

Javascript, 81 70 66 65 octets

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

Exemples exécutables:

ζ=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
la source
Pourquoi l'appeler Z? Le symbole zêta est un nom de fonction valide dans JS, et vous n'en avez pas besoin pour jouer au golf.
Fund Monica's Lawsuit
Remplacer Array(1e6).fill()par [...Array(1e6)]et remplacer le premier (s)pars
Conor O'Brien
1
@QPaysTaxes Bon point! Nom de variable Unicode ftw!
Frxstrem
@ ConorO'Brien Huh, je ne me suis jamais rendu compte que le truc Array (je pensais que les tableaux clairsemés ne répétaient pas mais je suppose que j'avais tort). Merci!
Frxstrem
@Frxstrem Notez que ζ prend deux octets
CocoaBean
6

APL (Dyalog) , 22 21 octets

Regardez ma, pas intégré! -1 grâce à ngn.

Étant donné que Dyalog APL n'a pas d'infinis, j'utilise la notation proposée par Iverson .

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

Essayez-le en ligne!

{ fonction anonyme:

1=⍵: si l'argument est un, alors:

  '¯' retourner un macron

 autre

  !9 factorielle de neuf (362880)

   d'abord que de nombreux entiers i ntegers

  ⍵*⍨ les élever à la puissance de l'argument

  ÷ valeurs réciproques

  +/ somme

  5⍕ format avec cinq décimales

} [fin de la fonction anonyme]

Adam
la source
1
1E6-> !9
ngn
@ngn Merci.
Adám
5

C, 74 70 69 octets

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

Compilez avec -fwrapv. Il faudra un certain temps pour produire une sortie.

Voyez-le fonctionner ici . La pièce ++n>0est remplacée par ++n<999999, vous n'avez donc pas à attendre. Cela conserve une fonctionnalité et une sortie identiques.

2501
la source
Ça floatmarche?
l4m2
5

TI-Basic, 16 octets (pas de fonction intégrée)

Fix 5:Σ(X^~Ans,X,1,99
Timtech
la source
Vous devez vraiment aller jusqu'à environ 150000 pour obtenir la bonne réponse pour Ans = 2, ce qui prendrait plus d'une demi-heure pour calculer sur un 84 Plus CE. En outre, vous pouvez multiplier par (Ans-1) ^ 0 quelque part pour obtenir une erreur pour Ans = 1, la représentation de l'infini la plus proche de TI-Basic!
pizzapants184
@ pizzapants184 Je suis parfaitement conscient que 2, 3, etc. peuvent prendre plus de 99 itérations. Vous pouvez obtenir cette fonctionnalité en remplaçant 99par E9où E est le scientifique E, c'est-à-dire représentant 10 ^ 9. (Ou évidemment quelque chose de plus petit comme E5). Comprendre que E99 est généralement utilisé pour l'infini positif permet également cette fonctionnalité théoriquement, si la limite supérieure de la somme était E99. Les émulateurs peuvent fournir cela beaucoup plus rapidement qu'une calculatrice physique. Merci pour vos pensées :)
Timtech
Je ne pense pas que cela compte pour afficher l'infini. Il ne générera même pas d'erreur si vous en avez ajouté 1 à l'infini, en raison d'une imprécision en virgule flottante.
lirtosiast
4

C (gcc) , 112 101 94 84 octets

Merci pour les conseils de golf de plafondcat.

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

Essayez-le en ligne!

cleblanc
la source
1
La question a été modifiée. Vous pouvez générer des symboles infini natifs dans la langue.
2501
@ 2501 Je suis revenu à la réponse précédente, même si je suis encore à quelques octets de votre solution.
cleblanc
@ceilingcat f(1)ne semble pas correct.
cleblanc
83 octets
plafondcat
3

Julia , 36 octets

x->x!=1?@sprintf("%.5f",zeta(x)):Inf
Uriel
la source
2

MATL , 21 octets

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

Essayez-le en ligne!

Explication

L'entrée 1est dotée d'un boîtier spécial pour la sortieinf , c'est ainsi que MATL affiche l'infini.

Pour les entrées autres que 1, la somme des premiers 2e5termes suffit pour obtenir une précision de 5 décimales. La raison en est que, à partir du calcul direct, ce nombre de termes suffit pour l'entrée 2, et pour les exposants supérieurs, la queue de la série est plus petite.

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
la source
2

R, 54 octets

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

Trouve la somme directement et formate comme souhaité, sort Infsi a est 1. La somme de 9^6semble être suffisante pour obtenir une précision à cinq positions tout en étant testable; 9^9obtiendrait une meilleure précision dans la même longueur de code. Je pourrais raccourcir cela si R avait un opérateur ternaire approprié.

Michael Lugo
la source
1
function(a)round("if"(a-1,sum((1:9^6)^-a)),5)est de quelques octets plus court.
Giuseppe
Oui, mais cela génère une erreur si a = 1. function(a)round("if"(a-1,sum((1:9^6)^-a),Inf),5)fonctionne et est toujours plus court que ma solution d'origine.
Michael Lugo
Oh yes of course! I forgot to include the Inf, that's what I get for typing code into the comment box directly...
Giuseppe
2

C,129 130 128 bytes

#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");}

it uses the following formula

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

test and results

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
la source
Why this equation instead of Σ(1/(n^s))? It seems much more complicated...
Beta Decay
@BetaDecay because it seems to me more fast in find the result; here there is the range for sum s in 1..999, in the 'Σ(1/(n^s)) ' there is need s in the range 1..10^6
RosLuP
1
I see. FYI, simply oo is fine, you don't need to specify it as positive
Beta Decay
1
85 bytes
ceilingcat
@ceilingcat you can write one other entry for this question... it seems I remember here without math.h header it not link...
RosLuP
2

Python 3: 67 bytes (no built-ins)

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

Nothing fancy, only uses python 3 because of the implicit utf-8 encoding.

Try it online with test cases.

Chris H
la source
1

Perl 6, 50 bytes

{$_-1??(1..1e6).map(* **-$_).sum.fmt('%.5f')!!∞}
Sean
la source
1

PARI/GP, 27 26 bytes

\p 6
s->trap(,inf,zeta(s))
alephalpha
la source
1

Jelly, 23 bytes

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

Try it online!

How?

  • Sums the first million terms
  • Divides by 0 when abs(input)<=1 to yield inf (rather than 14.392726722864989) for 1
  • Rounds to 5 decimal places
  • Appends four zeros if abs(result)<=1 to format the 1.0 as 1.00000
  • Prints the result

ȷ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
la source
1

Python 3 + SciPy, 52 bytes

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

Try it online!

totallyhuman
la source
1
Does this output for input 1?
ETHproductions
1
Similarly, is this rounding to five decimal places?
Beta Decay
1
@ETHproductions It outputs inf which is allowed.
totallyhuman
Super late, but couldn't you just use zetac(n) instead of zeta(n,1)?
NoOneIsHere
0

Jelly, 26 bytes

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

Don't try it online with this link! (Since this uses 16!~20 trillion terms, running on TIO produces a MemoryError)

Try it online with this link instead. (Uses 1 million terms instead. Much more manageable but takes one more byte)

Returns inf for input 1.

Explanation

⁵*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)

Out of the 26, bytes, 7 are used for computation, 12 are for formatting, and 7 are for producing inf on zero. There has to be a better golf for this.

fireflame241
la source
ȷ6 is a numeric literal of a million, removing the factorial workaround.
Jonathan Allan
0

MathGolf, 14 bytes (no builtins)

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

Note that in the TIO link, I have substituted for , which pushed 106 instead of 107. This is because the version submitted here timeouts for all test cases. This results in the answers for 3 and 8 to be off by 1 decimal place. However, there are way bigger 1-byte numerical literals in MathGolf, allowing for arbitrary decimal precision.

Try it online!

Explanation

┴                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
la source