Рассчитать значение


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 повторений за самый короткий ответ, который не использует встроенные дзета-функции. (Зеленая галочка покажет самое короткое решение в целом)

выигрыш

Самый короткий код в байтах побеждает.


7
Этот вызов имел такой потенциал ... До тех пор, пока вы не позволили встроенные функции ...
HyperNeutrino

@HyperNeutrino Да, я написал, потому что я видел, что вызов позволил встроенным. FGITW
NoOneIsHere

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

@JonathanAllen Я прояснил спецификацию округления
Beta Decay

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

Ответы:


11

Mathematica, 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

Без встроенного:

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.
номер

8

Javascript, 81 70 66 65 байт

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

Runnable примеры:

ζ=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, и вам не нужно, чтобы его играли в гольф.
Фонд Моники иск

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

1
@QPaysTaxes Хороший вопрос! Имена переменных Юникода ftw!
Frxstrem

@ ConorO'Брайен Да, я никогда не осознавал этого трюка с массивом (я думал, что редкие массивы не повторяются, но, думаю, я ошибался). Благодарность!
Frxstrem

@Frxstrem Обратите внимание, что ζ занимает два байта
CocoaBean

6

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

Смотри, мама, никаких встроенных модулей! -1 благодаря нгн.

Поскольку в Dyalog APL нет бесконечностей, я использую предложенную Иверсоном нотацию .

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

Попробуйте онлайн!

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

1=⍵: если аргумент один, то:

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

 еще

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

   первое , что многие целые I ntegers

  ⍵*⍨ поднять их до силы аргумента

  ÷ взаимные значения

  +/ сумма

  5⍕ формат с пятью десятичными знаками

} [конец анонимной функции]


1
1E6-> !9
нгн

@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?
м2 18

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 I reverted back to the previous answer, although I'm still quite a few bytes away from your solution.
cleblanc

@ceilingcat f(1) doesn't seem correct.
cleblanc



2

MATL, 21 bytes

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

Try it online!

Explanation

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

Для входных данных кроме 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, по-видимому, достаточно, чтобы получить пятизначную точность при одновременном тестировании; 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

Why this equation instead of Σ(1/(n^s))? It seems much more complicated...
Beta Decay

@BetaDecay because it seems to me more fast in find the result; here there is the range for sum s in 1..999, in the 'Σ(1/(n^s)) ' there is need s in the range 1..10^6
RosLuP

1
I see. FYI, simply oo is fine, you don't need to specify it as positive
Beta Decay


@ceilingcat you can write one other entry for this question... it seems I remember here without math.h header it not link...
RosLuP

2

Python 3: 67 bytes (no built-ins)

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.