Обчисліть значення


16

Виклик

Дано ціле число, , як вхідне значення, де s 1 виводить значення ζ ( s ) (Де ζ ( x ) являє функцію Зета Рімана ).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 повторень до найкоротшої відповіді, яка не використовує вбудовані zeta функції. (Зелена галочка все одно перейде до найкоротшого загального рішення)

Перемога

Виграє найкоротший код у байтах.


7
Цей виклик мав такий потенціал ... Поки ви не дозволили вбудувати ...
HyperNeutrino

@HyperNeutrino Так, я опублікував, тому що бачив, що завдання дозволяють вбудовані. FGITW
NoOneIsHere

2
Чи "строго до 5 знаків після коми" суворо? (тобто чи можемо ми досягти більшої точності?) Якщо не тестові випадки, дійсно повинні показувати 6dp.
Джонатан Аллан

@JonathanAllen Я очистив специфікацію округлення
бета-розпад

3
@BetaDecay (зітхаючи не пінг) повинен введення 19 дійсно виводити текст 1.00000? Не буде 1чи 1.0дійсним? Здається, ви зробили це проблемою для хамелеона.
Джонатан Аллан

Відповіді:


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&

Завдяки Келлі Лоудер


3
N@*Zetaекономить два байти.
Мартін Ендер

@*є (лівим) оператором композиції: f@*gпозначає функцію, значення якої в аргументі xє f[g[x]].
Грег Мартін

@BetaDecay Для 1цього виводиться ComplexInfinityі обходить 5місцями. (наприклад 1.64493)
NoOneIsHere

@MartinEnder Як *працює?
NoOneIsHere

1
@NoOneIsОсь ваша відповідь використовує, N~5але ваше пояснення використовує 6.
numbermaniac

8

Javascript, 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? Символ zeta - це дійсне ім'я функції в JS, і вам не потрібно, щоб це було в гольфі.
Фонд позову Моніки

Замінити Array(1e6).fill()з [...Array(1e6)], і замінити перший (s)зs
Конор О'Брайен

1
@QPaysTaxes Добрий момент! Unicode назви змінних ftw!
Frxstrem

@ ConorO'Brien Гм, я ніколи не зрозумів, що цей трюк Array (я думав, що рідкісні масиви не повторюються, але, мабуть, я помилявся). Спасибі!
Frxstrem

@Frxstrem Зауважимо, що ζ займає два байти
CocoaBean

6

APL (Діалог) , 22 21 байт

Дивись ма, ніяких вбудованих! -1 завдяки ngn.

Оскільки Dyalog APL не має нескінченності, я використовую запропоновані Iverson позначення .

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

Спробуйте в Інтернеті!

{ анонімна функція:

1=⍵: якщо аргумент один, то:

  '¯' повернути макрон

 ще

  !9 факторіал з дев'яти (362880)

   перше , що багато цілі I ntegers

  ⍵*⍨ піднести їх до сили аргументу

  ÷ зворотні значення

  +/ сума

  5⍕ формат з п'ятьма десятковими знаками

} [кінець анонімної функції]


1
1E6-> !9
ngn

@ngn Дякую
Адам

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працює?
l4м2

5

TI-Basic, 16 байт (без вбудованих)

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

Вам дійсно потрібно збільшити приблизно до 150000, щоб отримати відповідь правильною для Ans = 2, що для розрахунку на 84 Plus CE затратить більше півгодини. Також ви можете десь помножити на (Ans-1) ^ 0, щоб отримати помилку для Ans = 1, найближчого представлення нескінченності TI-Basic!
pizzapants184

@ pizzapants184 Я цілком усвідомлюю, що 2, 3 тощо можуть зайняти більше 99 ітерацій. Ви можете досягти цієї функціональності, замінивши 99з E9де Е є науковим Е, тобто становить 10 ^ 9. (Або, очевидно, щось менше, як E5). Розуміння того, що E99, як правило, використовується для позитивної нескінченності, також дозволяє теоретично використовувати цю функціональність, якщо верхня межа підсумовування була E99. Емулятори можуть забезпечити це набагато швидше, ніж фізичний калькулятор. Дякую за думки :)
Timtech

Я не думаю, що це вважається відображенням нескінченності. Він навіть не призведе до помилки, якщо ви додали 1 нескінченно через неточність з плаваючою комою.
lirtosiast

4

C (gcc) , 112 101 94 84 байт

Дякуємо за поради щодо гольфу від стельової кішки.

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)не здається правильним.
клебланк



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якщо а 1. 1. Підведення підсумків 9^6здається, що достатньо для отримання точності в п'яти місцях, поки ще перевіряється; 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)працює і все ще коротше мого оригінального рішення.
Майкл Луго

О так, звичайно! Я забув включити Infте саме, що я отримую за введення коду безпосередньо у поле для коментарів ...
Джузеппе

2

C, 129 130 128 байт

#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))? Це здається набагато складнішим ...
бета-розпад

@BetaDecay, тому що мені здається швидше знайти результат; тут є діапазон для суми s в 1..999, у 'Σ (1 / (n ^ s))' є потреба s в діапазоні 1..10 ^ 6
RosLuP

1
Я бачу. FYI, просто ooдобре, вам не потрібно вказувати це як позитивне
бета-розпад


@ceilingcat Ви можете написати ще один запис для цього питання ... Здається, я пам’ятаю тут, без заголовка math.h, це не посилання ...
RosLuP

2

Python 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.