Calcule el valor de

16

Desafío

Dado un número entero, , como entrada donde s 1 genera el valor de ζ ( s ) (donde ζ ( x ) representa la función Riemann Zeta ).ss1ζ(s)ζ(x)

Más información

se define como:ζ(s)

ζ(s)=n=11ns

Debería enviar su respuesta a 5 decimales (ni más ni menos). Si la respuesta resulta ser infinita, debe generar o equivalente en su idioma.

Las incorporaciones de Riemann Zeta están permitidas, pero es menos divertido hacerlo de esa manera;)

Ejemplos

Las salidas deben ser exactamente como se muestran a continuación

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

Generosidad

Como consuelo para permitir incorporaciones, ofreceré una recompensa de 100 repeticiones a la respuesta más breve que no use las funciones integradas de zeta. (La marca de verificación verde seguirá yendo a la solución más corta en general)

Victorioso

El código más corto en bytes gana.

Decaimiento Beta
fuente
77
Este desafío tenía tal potencial ... Hasta que permitiste las incorporaciones ...
HyperNeutrino
@HyperNeutrino Sí, publiqué porque vi que el desafío permitía construir. FGITW
NoOneIsHere
2
¿Es estricto "con una precisión de 5 decimales"? (es decir, ¿podemos emitir con mayor precisión?) Si no, los casos de prueba deberían mostrar 6dp realmente.
Jonathan Allan
@ JonathanAllen He aclarado las especificaciones de redondeo
Decaimiento Beta
3
@BetaDecay (suspiro sin ping) ¿debería una entrada de salida 19 realmente el texto 1.00000? ¿No sería 1o 1.0sería válido? Parece que lo has convertido en un desafío de camaleón.
Jonathan Allan

Respuestas:

11

Mathematica, 9 7 11 bytes

Zeta@#~N~6&

Explicación:

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

Resultado de Mathematica

Sin incorporado:

Mathematica, 23 bytes UTF-8

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

Gracias a Kelly Lowder

No hay nadie aquí
fuente
3
N@*ZetaGuarda dos bytes.
Martin Ender
@*es el operador de composición (izquierda): f@*gdenota una función cuyo valor en el argumento xes f[g[x]].
Greg Martin
@BetaDecay Para 1que salga ComplexInfinity, y se redondea a 5lugares. (por ejemplo 1.64493)
NoOneIsHere
@MartinEnder ¿Cómo funciona el *trabajo?
NoOneIsHere
1
@NoOneIs Aquí su respuesta usa N~5pero su explicación usa 6.
numbermaniac
8

Javascript, 81 70 66 65 bytes

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

Ejemplos ejecutables:

ζ=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
fuente
¿Por qué llamarlo Z? El símbolo zeta es un nombre de función válido en JS, y no necesita que sea golfizado.
Financia la demanda de Mónica
Reemplazar Array(1e6).fill()con [...Array(1e6)], y reemplazar el primero (s)cons
Conor O'Brien
1
@QPaysTaxes ¡Buen punto! Nombres de variables Unicode ftw!
Frxstrem
@ ConorO'Brien Huh, nunca me di cuenta del truco de la matriz (pensé que las matrices dispersas no se repetían pero supongo que estaba equivocado). ¡Gracias!
Frxstrem
@Frxstrem Tenga en cuenta que ζ toma dos bytes
CocoaBean
6

APL (Dyalog) , 22 21 bytes

Mira ma, no hay complementos! -1 gracias a ngn.

Dado que Dyalog APL no tiene infinitos, uso la notación propuesta por Iverson .

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

Pruébalo en línea!

{ función anónima:

1=⍵: si el argumento es uno, entonces:

  '¯' devolver un macron

 más

  !9 factorial de nueve (362880)

   en primer lugar que muchos enteros i ntegers

  ⍵*⍨ elevarlos al poder del argumento

  ÷ valores recíprocos

  +/ suma

  5⍕ formato con cinco decimales

} [fin de la función anónima]

Adán
fuente
1
1E6-> !9
ngn
@ngn Gracias.
Adám
5

C, 74 70 69 bytes

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

Compilar con -fwrapv. Tomará algún tiempo producir una salida.

Véalo funcionar aquí . La parte ++n>0se reemplaza con ++n<999999, por lo que no tiene que esperar. Esto mantiene idéntica funcionalidad y salida.

2501
fuente
Funciona float?
l4m2
5

TI-Basic, 16 bytes (sin incluir)

Fix 5:Σ(X^~Ans,X,1,99
Timtech
fuente
Realmente necesita subir a aproximadamente 150000 para obtener la respuesta correcta para Ans = 2, lo que tomaría más de media hora para calcular en un CE 84 Plus. Además, puede multiplicar por (Ans-1) ^ 0 en algún lugar para obtener un error para Ans = 1, ¡la representación más cercana de infinito de TI-Basic!
pizzapants184
@ pizzapants184 Soy plenamente consciente de que 2, 3, etc. pueden tomar más de 99 iteraciones. Puede lograr esta funcionalidad reemplazando 99por E9donde E es la E científica, es decir, que representa 10 ^ 9. (O, obviamente, algo más pequeño como E5). Comprender que E99 se usa generalmente para infinito positivo también permite esta funcionalidad teóricamente, si el límite superior de la suma fue E99. Los emuladores pueden proporcionar esto mucho más rápido que una calculadora física. Gracias por sus pensamientos :)
Timtech
No creo que esto cuente como mostrar infinito. Ni siquiera arrojará un error si agrega 1 infinitamente, debido a la imprecisión de punto flotante.
lirtosiast
4

C (gcc) , 112 101 94 84 bytes

Gracias por los consejos de golf de ceilingcat.

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

Pruébalo en línea!

cleblanc
fuente
1
La pregunta ha sido editada. Puede generar símbolos de infinito nativos de idioma.
2501
@ 2501 Volví a la respuesta anterior, aunque todavía estoy bastante lejos de su solución.
cleblanc
@ceilingcat f(1)no parece correcto.
cleblanc
83 bytes
ceilingcat
3

Julia , 36 bytes

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

MATL , 21 bytes

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

Pruébalo en línea!

Explicación

Input 1 is special-cased to output inf, which is how MATL displays infinity.

For inputs other than 1, summing the first 2e5 terms suffices to achieve a precision of 5 decimal places. The reason is that, from direct computation, this number of terms suffices for input 2, and for greater exponents the tail of the series is smaller.

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
fuente
2

R, 54 bytes

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

Encuentra la suma directamente y formatea según lo deseado, emite Infsi a es 1. Sumar 9^6parece ser suficiente para obtener una precisión de cinco lugares sin dejar de ser comprobable; 9^9obtendría una mayor precisión en la misma longitud de código. Podría acortar esto si R tuviera un operador ternario adecuado.

Michael Lugo
fuente
1
function(a)round("if"(a-1,sum((1:9^6)^-a)),5) is a few bytes shorter.
Giuseppe
Yes, but it throws an error if a = 1. function(a)round("if"(a-1,sum((1:9^6)^-a),Inf),5) works and is still shorter than my original solution.
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
fuente
¿Por qué esta ecuación en lugar de Σ(1/(n^s))? Parece mucho más complicado ...
Beta Decay
@BetaDecay porque me parece más rápido encontrar el resultado; aquí está el rango para la suma s en 1..999, en el 'Σ (1 / (n ^ s))' hay necesidad s en el rango 1..10 ^ 6
RosLuP
1
Veo. Para su información, simplemente ooestá bien, no necesita especificarlo como positivo
Beta Decay
1
85 bytes
ceilingcat
@ceilingcat puede escribir otra entrada para esta pregunta ... parece que recuerdo aquí sin el encabezado math.h, no enlaza ...
RosLuP
2

Python 3: 67 bytes (sin elementos integrados)

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

Nada lujoso, solo usa python 3 debido a la codificación implícita utf-8.

Pruébelo en línea con casos de prueba.

Chris H
fuente
1

Perl 6 , 50 bytes

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

PARI / GP, 27 26 bytes

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

Jalea , 23 bytes

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

Pruébalo en línea!

¿Cómo?

  • Suma el primer millón de términos
  • Divide entre 0cuándo abs(input)<=1ceder inf(en lugar de 14.392726722864989) para1
  • Redondea a 5 decimales
  • Agrega cuatro ceros si abs(result)<=1formatea el 1.0as1.00000
  • Imprime el resultado

ȷ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
fuente
1

Python 3 + SciPy, 52 bytes

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

Pruébalo en línea!

totalmente humano
fuente
1
¿Esta salida para entrada 1?
ETHproductions
1
Del mismo modo, ¿se está redondeando a cinco decimales?
Beta Decay
1
@ETHproductions Produce lo infque está permitido.
Totalmente humano
Súper tarde, pero ¿no podrías usarlo en zetac(n)lugar de zeta(n,1)?
NoOneIsHere
0

Jalea , 26 bytes

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

¡No lo intentes en línea con este enlace! (Dado que esto usa 16! ~ 20 trillones de términos, la ejecución en TIO produce un error de memoria)

Pruébalo en línea con este enlace en su lugar. (Utiliza 1 millón de términos en su lugar. Mucho más manejable pero toma un byte más)

Devoluciones inf para la entrada 1.

Explicación

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

De los 26 bytes, 7 se usan para el cálculo, 12 son para formatear y 7 son para producir infen cero. Tiene que haber un mejor golf para esto.

fireflame241
fuente
ȷ6es un literal numérico de un millón, eliminando la solución factorial.
Jonathan Allan
0

MathGolf , 14 bytes (sin incluir)

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

Tenga en cuenta que en el enlace TIO, he sustituido por , que empujó106 6 en lugar de 107 7. Esto se debe a que la versión presentada aquí expira para todos los casos de prueba. Esto da como resultado que las respuestas para 3 y 8 estén apagadas en 1 decimal. Sin embargo, hay muchos literales numéricos de 1 byte más grandes en MathGolf, lo que permite una precisión decimal arbitraria.

Pruébalo en línea!

Explicación

┴                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
fuente