Calcular o valor de


16

Desafio

Dado um número inteiro, , como entrada em que o valor de (Onde representa a Função Riemann Zeta ).ss1ζ(s)ζ(x)

Outras informações

ζ(s) é definido como:

ζ(s)=n=11ns

Você deve enviar sua resposta para 5 casas decimais (nem mais nem menos). Se a resposta for infinita, você deve produzir ou equivalente no seu idioma.

Os Riemann Zeta embutidos são permitidos, mas é menos divertido fazê-lo dessa maneira;)

Exemplos

As saídas devem ser exatamente como mostrado abaixo

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

Recompensa

Como consolo para permitir embutidos, vou oferecer uma recompensa de 100 repetições para a resposta mais curta que não use funções zeta embutidas. (A marca de seleção verde ainda irá para a solução mais curta geral)

Ganhando

O código mais curto em bytes vence.


7
Esse desafio tinha um potencial tão grande ... Até que você permitisse
construir

@HyperNeutrino Sim, eu postei porque vi que o desafio permitia as construções internas. FGITW
NoOneIsHere

2
É "com precisão de 5 casas decimais" estrito? (ou seja, podemos produzir com mais precisão?) Caso contrário, os casos de teste devem mostrar 6dp realmente.
Jonathan Allan

@JonathanAllen Eu esclareço as especificações de arredondamento
Decay Beta

3
@BetaDecay (suspiro sem ping) deve uma entrada 19 realmente produzir o texto 1.00000? Não seria 1ou 1.0seria válido? Parece que você transformou em um desafio de camaleão.
Jonathan Allan

Respostas:


11

Mathematica, 9 7 11 bytes

Zeta@#~N~6&

Explicação:

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

Resultado Mathematica

Sem embutido:

Mathematica, 23 bytes UTF-8

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

Agradecimentos a Kelly Lowder


3
N@*Zetasalva dois bytes.
Martin Ender

@*é o operador de composição (esquerdo): f@*gindica uma função cujo valor no argumento xé f[g[x]].
Greg Martin

@BetaDecay Para 1ele gera ComplexInfinitye arredonda para 5lugares. (eg 1.64493)
NoOneIsHere 8/17/17

@MartinEnder Como *funciona?
NoOneIsHere

1
@NoOneIsHere que sua resposta usa, N~5mas sua explicação 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

Exemplos executáveis:

ζ=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')
}


Por que chamar Z? O símbolo zeta é um nome de função válido em JS e você não precisa jogar golfe.
Fund Monica's Lawsuit

Substitua Array(1e6).fill()por [...Array(1e6)]e substitua o primeiro (s)pors
Conor O'Brien

1
@QPaysTaxes Good point! Nomes de variáveis ​​Unicode ftw!
Frxstrem

@ ConorO'Brien Huh, eu nunca percebi esse truque de Array (pensei que matrizes esparsas não iterassem, mas acho que estava errado). Obrigado!
Frxstrem

@Frxstrem Observe que ζ leva dois bytes #
CocoaBean

6

APL (Dyalog) , 22 21 bytes

Olha ma, não tem embutidos! -1 graças a ngn.

Como o Dyalog APL não tem infinitos, eu uso a notação proposta por Iverson .

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

Experimente online!

{ função anônima:

1=⍵: se o argumento for um, então:

  '¯' retornar um macron

 outro

  !9 fatorial de nove (362880)

   primeiro que muitos inteiros i ntegers

  ⍵*⍨ elevá-los ao poder do argumento

  ÷ valores recíprocos

  +/ soma

  5⍕ formato com cinco casas decimais

} [fim da função anônima]


1
1E6-> !9
NGN

@ngn Obrigado.
Adám 19/12/19

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

Compile com -fwrapv. Levará algum tempo para produzir uma saída.

Veja como funciona aqui . A peça ++n>0é substituída por ++n<999999, para que você não precise esperar. Isso mantém funcionalidade e saída idênticas.


Funciona float?
L4m2

5

TI-Basic, 16 bytes (sem embutidos)

Fix 5:Σ(X^~Ans,X,1,99

Você realmente precisa ir até 150000 para obter a resposta correta para Ans = 2, o que levaria mais de meia hora para calcular em um 84 Plus CE. Além disso, você pode multiplicar por (Ans-1) ^ 0 em algum lugar para obter um erro para Ans = 1, a representação mais próxima do infinito do TI-Basic!
Pizzapants184

@ pizzapants184 Estou ciente de que 2, 3 etc. podem levar mais de 99 iterações. Você pode obter essa funcionalidade substituindo 99por E9onde E é o E científico, ou seja, representando 10 ^ 9. (Ou, obviamente, algo menor como E5). Entender que E99 é geralmente usado para infinito positivo também permite essa funcionalidade teoricamente, se o limite superior da soma fosse E99. Os emuladores podem fornecer isso muito mais rápido que uma calculadora física. Obrigado por seus pensamentos :)
Timtech

Eu não acho que isso conta como exibindo infinito. Ele nem gera um erro se você adicionar 1 infinitamente, devido à imprecisão de ponto flutuante.
lirtosiast



2

MATL , 21 bytes

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

Experimente online!

Explicação

A entrada 1é especificada na saída inf, e é assim que o MATL exibe o infinito.

Para entradas diferentes de 1, somar os primeiros 2e5termos é suficiente para obter uma precisão de 5 casas decimais. A razão é que, a partir da computação direta, esse número de termos é suficiente para entrada 2e, para expoentes maiores, a cauda da série é menor.

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)

2

R, 54 bytes

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

Localiza a soma diretamente e formata conforme desejado, produzindo Infse a for 1. A soma de 9^6parece ser suficiente para obter precisão de cinco locais enquanto ainda é testável; 9^9obteria melhor precisão no mesmo comprimento de código. Eu poderia ficar mais curto se R tivesse um operador ternário adequado.


1
function(a)round("if"(a-1,sum((1:9^6)^-a)),5)é alguns bytes mais curto.
Giuseppe

Sim, mas gera um erro se a = 1. function(a)round("if"(a-1,sum((1:9^6)^-a),Inf),5)funcionar e ainda for mais curto que a minha solução original.
Michael Lugo

Ah sim, claro! I esqueceu de incluir o Inf, isso é o que eu ganho por código de digitação na caixa de comentário diretamente ...
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");}

usa a seguinte fórmula

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

teste e resultados

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

Por que essa equação em vez de Σ(1/(n^s))? Parece muito mais complicado ...
Decay Beta

@BetaDecay, porque me parece mais rápido encontrar o resultado; aqui existe o intervalo para a soma s em 1..999, no 'Σ (1 / (n ^ s))' há necessidades s no intervalo 1..10 ^ 6
RosLuP

1
Entendo. Para sua informação, simplesmente ooestá bem, você não precisa especificá-lo como positivo
Decay Beta


@ceilingcat você pode escrever uma outra entrada para esta pergunta ... parece que eu lembro aqui sem cabeçalho math.h não link ...
RosLuP

2

Python 3: 67 bytes (sem embutidos)

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

Nada extravagante, só usa python 3 por causa da codificação implícita utf-8.

Experimente online com casos de teste.


1

Perl 6 , 50 bytes

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


1

Gelatina , 23 bytes

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

Experimente online!

Quão?

  • Soma o primeiro milhão de termos
  • Divide por 0quando abs(input)<=1produzir inf(em vez de 14.392726722864989) para1
  • Arredonda para 5 casas decimais
  • Acrescenta quatro zeros se abs(result)<=1para formatar o 1.0quanto1.00000
  • Imprime o 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


0

Geléia , 26 bytes

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

Não tente online com este link! (Como usa 16! ~ 20 trilhões de termos, a execução no TIO produz um MemoryError)

Experimente online com este link. (Usa 1 milhão de termos. Muito mais gerenciável, mas requer mais um byte)

Retorna infpara a entrada 1.

Explicação

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

Dos 26 bytes, 7 são usados ​​para computação, 12 são para formatação e 7 são para produção infem zero. Tem que haver um golfe melhor para isso.


ȷ6é um literal numérico de um milhão, removendo a solução alternativa fatorial.
Jonathan Allan

0

MathGolf , 14 bytes (não embutido)

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

Observe que no link do TIO, substituí por , que empurrou106 ao invés de 107. Isso ocorre porque a versão enviada aqui atinge o tempo limite para todos os casos de teste. Isso resulta nas respostas de 3 e 8 desativadas por 1 casa decimal. No entanto, existem literais numéricos de 1 byte muito maiores no MathGolf, permitindo precisão decimal arbitrária.

Experimente online!

Explicação

┴                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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.