의 값을 계산


16

도전

입력으로 정수 주어질 때, s 1ζ ( s ) 의 값을 출력합니다 (여기서 ζ ( x )Riemann Zeta Function을 나타냄).ss1ζ(s)ζ(x)

추가 정보

는 다음과 같이 정의됩니다.ζ(s)

ζ(s)=n=11ns

답을 소수점 이하 5 자리 (더 이상, 더 이상)로 출력해야합니다. 대답이 무한대로 나오면 언어로 또는 그와 동등한 것을 출력 해야합니다.

Riemann Zeta 내장 기능은 허용되지만 그렇게하는 것이 재미는 없습니다.)

출력은 아래 표시된 것과 정확히 일치해야합니다.

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

하사품

빌트인을 허용하기위한 위안으로서, 제타 함수를 사용 하지 않는 최단 답변에 100 회 현상금을 제공 할 것 입니다. (녹색 확인 표시는 여전히 전체적으로 가장 짧은 솔루션으로 이동합니다)

승리

바이트 단위의 가장 짧은 코드가 이깁니다.


7
이 도전은 그런 잠재력을 가지고있었습니다 ... 당신이
건축

@HyperNeutrino Yep, 나는 도전자가 내장을 허용했기 때문에 게시했습니다. FGITW
NoOneIsHere

2
"소수점 다섯 자리까지 정밀도"가 엄격합니까? (즉, 더 정밀하게 출력 할 수 있습니까?) 그렇지 않으면 테스트 사례가 실제로 6dp로 표시되어야합니다.
Jonathan Allan

@JonathanAllen 나는 반올림 사양을 정리했습니다
Beta Decay

3
@BetaDecay (Ping no ping)는 19 실제로 텍스트를 출력 해야 1.00000합니까? 하지 않을까요 1또는 1.0유효? 당신이 그것을 카멜레온 도전으로 만든 것 같습니다.
Jonathan Allan

답변:


11

수학, 9 7 11 바이트

Zeta@#~N~6&

설명:

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

Mathematica result

내장없이 :

Mathematica, 23 UTF-8 바이트

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

Kelly Lowder에게 감사합니다


3
N@*Zeta2 바이트를 절약합니다.
Martin Ender

@*(왼쪽) 조성물 연산자는 다음 f@*g값이 인자의 함수이다 x이다 f[g[x]].
Greg Martin

@BetaDecay 1출력 ComplexInfinity을 위해 5장소로 반올림합니다 . (예 1.64493)
NoOneIsHere

@MartinEnder 어떻게 *작동합니까?
NoOneIsHere 여기

1
@NoOneIs 여기에서 답변은 사용 N~5하지만 설명에서는 사용합니다 6.
numbermaniac

8

자바 스크립트, 81 70 66 65 바이트

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

실행 가능한 예제 :

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


왜 Z라고 부르나요? 제타 기호는 JS에서 유효한 함수 이름이므로 골프를 타지 않아도됩니다.
Fund Monica의 소송

교체 Array(1e6).fill()[...Array(1e6)], 첫 번째 교체 (s)와 함께s
코너 오브라이언

1
@QPaysTaxes 좋은 지적! 유니 코드 변수 이름 ftw!
Frxstrem

@ ConorO'Brien Huh, Array 트릭을 깨달았습니다. 감사!
Frxstrem

@Frxstrem ζ는 2 바이트를 필요로한다
CocoaBean

6

APL (Dyalog) , 22 21 바이트

엄마 봐, 내장이 없어! ngn 덕분에 -1입니다.

Dyalog APL에는 무한대가 없으므로 Iverson의 제안 된 표기법을 사용 합니다.

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

온라인으로 사용해보십시오!

{ 익명의 기능 :

1=⍵: 인수가 하나 인 경우 :

  '¯' 마크로를 반환

 그밖에

  !9 9의 계승 (362880)

   먼저 많은 정수 ntegers

  ⍵*⍨ 논쟁의 힘으로 그들을 제기

  ÷ 상호 가치

  +/ 합집합

  5⍕ 소수점 다섯 자리 형식

} [익명 기능의 끝]


1
1E6-> !9
ngn

@ngn 감사합니다.
Adám

5

C, 74 70 69 바이트

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

로 컴파일하십시오 -fwrapv. 출력을 생성하는 데 시간이 걸립니다.

여기에서 작동 하는지 확인 하십시오 . 부품 ++n>0이로 교체 ++n<999999되어 기다릴 필요가 없습니다. 이것은 동일한 기능과 출력을 유지합니다.


합니까의 float작업?
l4m2

5

TI 기본, 16 바이트 (내장 없음)

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

Ans = 2에 대한 정답을 얻으려면 실제로 약 150000까지 올라 가야합니다. 84 Plus CE에서 계산하려면 30 분 이상이 걸립니다. 또한 (Ans-1) ^ 0 어딘가에 TI-Basic의 가장 가까운 무한대 인 Ans = 1에 대한 오류가 발생할 수 있습니다!
pizzapants184184 년

@ pizzapants184 2, 3 등이 99 회 이상 반복 될 수 있음을 충분히 알고 있습니다. 당신은 대체하여이 기능을 달성 할 수 99E9E, 즉 ^ 9 (10) 대표, 과학 E이다. (또는 분명히 E5와 같은 더 작은 것). E99가 일반적으로 양의 무한대에 사용된다는 것을 이해하면 합산의 상한이이면 이론적으로이 기능을 사용할 수 있습니다 E99. 에뮬레이터는 실제 계산기보다 훨씬 빠르게 제공 할 수 있습니다. 당신의 생각에 감사합니다 :)
Timtech

나는 이것이 무한대를 표시한다고 생각하지 않습니다. 부동 소수점 부정확성으로 인해 무한히 1을 추가하면 오류가 발생하지 않습니다.
lirtosiast

4

C (gcc) , 112 (101) 94 84 바이트

ceilingcat의 골프 팁에 감사드립니다.

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

온라인으로 사용해보십시오!


1
질문이 수정되었습니다. 언어 고유 무한대 기호를 출력 할 수 있습니다.
2501

@ 2501 나는 여전히 당신의 솔루션에서 몇 바이트 떨어져 있지만 이전 답변으로 되돌아 갔다.
cleblanc

@ceilingcat f(1)이 올바르지 않습니다.
cleblanc



2

MATL , 21 바이트

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

온라인으로 사용해보십시오!

설명

출력 1은 특수한 경우에 출력inf MATL이 무한대를 표시하는 방식입니다.

이외의 입력의 1경우 첫 번째 2e5항을 합하면 소수점 이하 5 자리의 정밀도를 달성 할 수 있습니다. 그 이유는 직접 계산에서이 수의 항은 입력에 충분하고 2지수가 클수록 계열의 꼬리가 더 작기 때문입니다.

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 바이트

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

합계를 직접 Inf찾고 원하는대로 형식을 지정하고 a가 1 인 경우 출력합니다. 합계 9^6는 테스트 가능하면서 5 자리 정확도를 얻을 수있는 것으로 보입니다. 9^9동일한 길이의 코드에서 더 나은 정확도를 얻을 수 있습니다. R에 적절한 삼항 연산자가 있으면 이것을 더 짧게 얻을 수 있습니다.


1
function(a)round("if"(a-1,sum((1:9^6)^-a)),5)몇 바이트 더 짧습니다.
주세페

예, 그러나 a = 1이면 function(a)round("if"(a-1,sum((1:9^6)^-a),Inf),5)작동하지만 여전히 원래 솔루션보다 짧은 경우 오류가 발생합니다 .
Michael Lugo

아 그래! Inf주석 상자에 코드를 직접 입력하면 얻을 수 있는 정보를 포함하는 것을 잊었습니다 .
Giuseppe

2

C, 129130128 바이트

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

그것은 다음 공식을 사용합니다

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

테스트 및 결과

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

왜이 방정식 대신에 Σ(1/(n^s))? 훨씬 더 복잡한 것 같습니다 ...
Beta Decay

@BetaDecay는 결과를 찾는 데 더 빠르기 때문에; 여기에 1..999의 합계 s 범위가 있으며, 'Σ (1 / (n ^ s))'에는 1..10 ^ 6
RosLuP

1
내가 참조. 참고로, 간단하게 oo괜찮습니다.이를 긍정적으로 지정할 필요는 없습니다.
Beta Decay


@ceilingcat이 질문에 대한 다른 항목을 쓸 수 있습니다 ... 그것은 math.h 헤더없이 여기에 기억되지 않는 것 같습니다 ...
RosLuP

2

파이썬 3:67 바이트 (내장되지 않음)

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.




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


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.


ȷ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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.