Hitung nilai

16

Tantangan

Diberikan bilangan bulat, , sebagai input di mana s 1 menghasilkan nilai ζ ( s ) (Di mana ζ ( x ) mewakili Fungsi Riemann Zeta ).ss1ζ(s)ζ(x)

Informasi lebih lanjut

didefinisikan sebagai:ζ(s)

ζ(s)=n=11ns

Anda harus menampilkan jawaban Anda ke 5 tempat desimal (tidak lebih, tidak kurang). Jika jawabannya tidak terbatas, Anda harus mengeluarkan atau setara dalam bahasa Anda.

Riemann Zeta built-in diizinkan, tetapi kurang menyenangkan melakukannya dengan cara seperti itu;)

Contohnya

Keluaran harus persis seperti yang ditunjukkan di bawah ini

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

Karunia

Sebagai penghiburan untuk memungkinkan built-in, saya akan menawarkan hadiah 100-rep untuk jawaban terpendek yang tidak menggunakan fungsi zeta built-in. (Tanda centang hijau masih akan menuju ke solusi terpendek secara keseluruhan)

Kemenangan

Kode terpendek dalam byte menang.

Peluruhan Beta
sumber
7
Tantangan ini memiliki potensi besar ... Sampai Anda mengizinkan builtin ...
HyperNeutrino
@HyperNeutrino Yap, saya memposting karena saya melihat tantangannya memungkinkan builtin. FGITW
NoOneIsHere
2
Apakah "dengan ketelitian 5 desimal" ketat? (Yaitu bisakah kita output ke lebih presisi?) Jika tidak kasus uji harus menunjukkan 6dp benar-benar.
Jonathan Allan
@ JonathanAllen Saya sudah membersihkan spec pembulatan
Beta Decay
3
@ BetaDecay (sigh no ping) haruskah input 19 benar - benar menampilkan teks 1.00000? Tidak akan 1atau 1.0valid? Tampaknya Anda telah membuatnya menjadi tantangan bunglon.
Jonathan Allan

Jawaban:

11

Mathematica, 9 7 11 byte

Zeta@#~N~6&

Penjelasan:

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

Hasil Mathematica

Tanpa builtin:

Mathematica, 23 UTF-8 byte

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

Terima kasih kepada Kelly Lowder

Tidak Ada Di Sini
sumber
3
N@*Zetamenghemat dua byte.
Martin Ender
@*adalah (kiri) operator komposisi: f@*gmenunjukkan fungsi yang nilainya di argumen xadalah f[g[x]].
Greg Martin
@ BetaDecay Untuk 1itu keluaran ComplexInfinity, dan itu bulat ke 5tempat. (mis. 1.64493)
NoOneIsHere
@ MartinEnder Bagaimana cara *kerjanya?
NoOneIsHere
1
@NoOneIsHere jawaban Anda menggunakan N~5tetapi penjelasan Anda menggunakan 6.
numbermaniac
8

Javascript, 81 70 66 65 byte

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

Contoh yang bisa dijalankan:

ζ=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
sumber
Mengapa menyebutnya Z? Simbol zeta adalah nama fungsi yang valid di JS, dan Anda tidak perlu di-golf.
Dana Gugatan Monica
Ganti Array(1e6).fill()dengan [...Array(1e6)], dan ganti yang pertama (s)dengans
Conor O'Brien
1
@QPaysTaxes Poin bagus! Nama variabel Unicode ftw!
Frxstrem
@ Conor'Brien Huh, saya tidak pernah menyadari bahwa trik Array (saya pikir array jarang tidak beralih tapi saya kira saya salah). Terima kasih!
Frxstrem
@Frxstrem Perhatikan bahwa ζ membutuhkan dua byte
CocoaBean
6

APL (Dyalog) , 22 21 byte

Lihat bu, tidak ada built-in! -1 terima kasih kepada ngn.

Karena Dyalog APL tidak memiliki infinitas, saya menggunakan notasi yang diusulkan Iverson .

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

Cobalah online!

{ fungsi anonim:

1=⍵: jika argumennya satu, maka:

  '¯' kembalikan macron

 lain

  !9 faktorial dari sembilan (362880)

   pertama yang banyak integer saya ntegers

  ⍵*⍨ angkat mereka ke kekuatan argumen

  ÷ nilai timbal balik

  +/ jumlah

  5⍕ format dengan lima desimal

} [akhir dari fungsi anonim]

Adám
sumber
1
1E6-> !9
ngn
@ ngn Terima kasih.
Adám
5

C, 74 70 69 byte

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

Kompilasi dengan -fwrapv . Butuh waktu untuk menghasilkan output.

Lihat berhasil di sini . Bagian ++n>0diganti dengan ++n<999999, jadi Anda tidak perlu menunggu. Ini menjaga fungsionalitas dan output yang identik.

2501
sumber
Apakah floatbekerja?
14m2
5

TI-Basic, 16 byte (tanpa builtin)

Fix 5:Σ(X^~Ans,X,1,99
Timtech
sumber
Anda benar-benar harus naik ke sekitar 150000 untuk mendapatkan jawaban yang tepat untuk Ans = 2, yang akan membutuhkan waktu setengah jam untuk menghitung pada 84 Plus CE. Selain itu, Anda dapat mengalikan dengan (Ans-1) ^ 0 di suatu tempat untuk mendapatkan kesalahan untuk Ans = 1, representasi tak terhingga terdekat TI-Basic!
pizzapants184
@ pizzapants184 Saya sepenuhnya sadar bahwa 2, 3, dll. mungkin membutuhkan lebih dari 99 iterasi. Anda dapat mencapai fungsi ini dengan mengganti 99dengan di E9mana E adalah E ilmiah, yaitu mewakili 10 ^ 9. (Atau jelas sesuatu yang lebih kecil seperti E5). Memahami bahwa E99 umumnya digunakan untuk infinity positif juga memungkinkan fungsi ini secara teoritis, jika batas atas penjumlahan itu E99. Emulator dapat memberikan ini lebih cepat daripada kalkulator fisik. Terima kasih atas pemikiran Anda :)
Timtech
Saya tidak berpikir ini dianggap sebagai menampilkan infinity. Bahkan tidak akan menimbulkan kesalahan jika Anda menambahkan 1 tanpa batas, karena ketidaktepatan floating-point.
lirtosiast
4

C (gcc) , 112 101 94 84 byte

Terima kasih atas tip golf dari ceilingcat.

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

Cobalah online!

Cleblanc
sumber
1
Pertanyaannya telah diedit. Anda dapat menampilkan simbol infinity asli bahasa.
2501
@ 2501 Saya kembali ke jawaban sebelumnya, walaupun saya masih beberapa byte dari solusi Anda.
Cleblanc
@ceilingcat f(1)sepertinya tidak benar.
cleblanc
83 byte
ceilingcat
3

Julia , 36 byte

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

MATL , 21 byte

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

Cobalah online!

Penjelasan

Input 1khusus untuk outputinf dikhususkan , yang merupakan cara MATL menampilkan infinity.

Untuk input selain 1, menjumlahkan 2e5syarat pertama sudah cukup untuk mencapai ketelitian 5 tempat desimal. Alasannya adalah bahwa, dari perhitungan langsung, jumlah istilah ini cukup untuk input 2, dan untuk eksponen yang lebih besar, buntut seri lebih kecil.

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

R, 54 byte

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

Menemukan jumlah secara langsung dan memformat seperti yang diinginkan, menghasilkan Infjika a adalah 1. Menjumlahkan 9^6tampaknya cukup untuk mendapatkan akurasi lima tempat sambil masih dapat diuji; 9^9akan mendapatkan akurasi yang lebih baik dalam panjang kode yang sama. Saya bisa mendapatkan ini lebih pendek jika R memiliki operator ternary yang tepat.

Michael Lugo
sumber
1
function(a)round("if"(a-1,sum((1:9^6)^-a)),5)lebih pendek beberapa byte.
Giuseppe
Ya, tetapi ada kesalahan jika a = 1. function(a)round("if"(a-1,sum((1:9^6)^-a),Inf),5)berfungsi dan masih lebih pendek dari solusi asli saya.
Michael Lugo
Oh ya tentu saja! Saya lupa menyertakan Inf, itulah yang saya dapatkan untuk mengetik kode ke dalam kotak komentar secara langsung ...
Giuseppe
2

C, 129 130 128 byte

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

menggunakan rumus berikut

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

tes dan hasil

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
sumber
Kenapa persamaan ini bukan Σ(1/(n^s))? Tampaknya jauh lebih rumit ...
Beta Decay
@BetaDecay karena menurut saya lebih cepat dalam menemukan hasilnya; di sini ada kisaran untuk jumlah s di 1..999, di 'Σ (1 / (n ^ s))' ada kebutuhan di kisaran 1..10 ^ 6
RosLuP
1
Saya melihat. FYI, cukup oobaik-baik saja, Anda tidak perlu menentukannya sebagai positif
Beta Decay
1
85 byte
ceilingcat
@ceilingcat Anda dapat menulis satu entri lain untuk pertanyaan ini ... sepertinya saya ingat di sini tanpa math.h tajuk itu tidak terhubung ...
RosLuP
2

Python 3: 67 byte (tanpa built-in)

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
sumber
1

Perl 6, 50 bytes

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

PARI/GP, 27 26 bytes

\p 6
s->trap(,inf,zeta(s))
alephalpha
sumber
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
sumber
1

Python 3 + SciPy, 52 bytes

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

Try it online!

totallyhuman
sumber
1
Does this output for input 1?
ETHproductions
1
Demikian pula, apakah pembulatan ini ke lima tempat desimal?
Beta Decay
1
@ ETHproductions Ini adalah output infyang diizinkan.
Sepenuhnya manusiawi
Sangat terlambat, tetapi tidak bisakah Anda menggunakan zetac(n)saja zeta(n,1)?
NoOneIsHere
0

Jelly , 26 byte

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

Jangan coba online dengan tautan ini! (Karena ini menggunakan 16! ~ 20 triliun istilah, menjalankan TIO menghasilkan MemoryError)

Cobalah secara online dengan tautan ini. (Sebagai gantinya, gunakan 1 juta istilah. Jauh lebih mudah dikelola tetapi membutuhkan satu byte lagi)

Pengembalian infuntuk input 1.

Penjelasan

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

Dari 26, byte, 7 digunakan untuk perhitungan, 12 untuk format, dan 7 untuk produksi infpada nol. Harus ada golf yang lebih baik untuk ini.

fireflame241
sumber
ȷ6adalah angka numerik dari satu juta, menghilangkan solusi faktorial.
Jonathan Allan
0

MathGolf , 14 byte (tidak ada builtin)

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

Perhatikan bahwa di link TIO, saya telah diganti untuk , yang mendorong106 dari pada 107. Ini karena versi yang dikirimkan di sini batas waktu untuk semua kasus uji. Ini menghasilkan jawaban selama 3 dan 8 dimatikan dengan 1 desimal. Namun, ada literal numerik 1-byte yang jauh lebih besar di MathGolf, memungkinkan presisi desimal sewenang-wenang.

Cobalah online!

Penjelasan

┴                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
maks
sumber