Оцініть функцію Зети Рімана за складним числом


11

Вступ

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

Функція Земана Рімана - це особлива функція, яка визначається як аналітичне продовження

введіть тут опис зображення

до складної площини. Існує багато рівнозначних формул для цього, що робить його цікавим для коду гольфу.

Виклик

Напишіть програму, яка приймає 2 плавці як вхідні (реальна і уявна частина складного числа) і оцінює функцію Земана Рімана в цій точці.

Правила

  • Вхід і вихід через консольну АБО функцію введення та повернення значення
  • Вбудовані в складні числа заборонені, використовуйте поплавці (число, подвійне, ...)
  • Жодних математичних функцій, за винятком + - * / pow logі дійсних значущих триггерних функцій (якщо ви хочете інтегруватися, використовуйте гамма-функцію, ... ви повинні включити визначення цього функції в код)
  • Вхід: 2 поплавця
  • Вихід: 2 поплавця
  • Ваш код повинен містити значення, яке дає теоретично довільну точність, коли воно робиться довільним великим / малим
  • Поведінка на вході 1 не важлива (це єдиний полюс цієї функції)

Найкоротший код у байтах виграє!

Приклад введення та виводу

Вхід:

2, 0

Вихід:

1.6449340668482266, 0

Вхід:

1, 1

Вихід:

0,5821580597520037, -0.9268485643308071

Вхід:

-1, 0

Вихід:

-0.08333333333333559, 0


1
Яка необхідна точність виходу? Я не впевнений, що я розумію, що ваш код повинен містити значення, яке теоретично дає довільну точність, коли воно робиться довільним великим / малим . Ви маєте на увазі, як максимальне значення циклу, ніж при збільшенні без обмежень, підвищує точність? Чи може це значення бути жорстким?
Луїс Мендо

@DonMuesli Це означає, що точність залежить від параметра, скажімо, N, якому ви можете надати будь-яке значення, яке вам подобається, але для будь-якої заданої точності ви можете зробити N малим або великим, щоб досягти цієї точності. Слово теоретично є, тому що ви не повинні турбуватися про обмежену точність машини чи мови.
Jens Renders

Для подальшого уточнення N: чи достатньо, щоб для будь-якого зв'язаного epsта вхідного даних xіснувало значення, Nяке обчислюється zeta(x)в межах eps; або чи повинен існувати такий, Nщо залежить лише від epsі гарантує, що для будь-якої x(або, можливо, для будь-якої, xніж заданої функції epsз полюса) вона досягає межі; або може Nзалежати від цього x, але відповіді повинні пояснювати, як обчислити Nзадане xі eps? (Моя теорія аналітичних чисел не дуже велика, але я підозрюю, що варіанти 2 і 3 виходять за рамки всіх, крім одного або двох регулярних плакатів).
Пітер Тейлор

@PeterTaylor N досить великий: для будь-якого xі для будь-якого epsповинен існувати Pтакий, що для всіх N>Pвихідних даних ближче, ніж epsдо точного значення. Це ясно? Чи потрібно мені це уточнити для випадку з N досить малим?
Jens Renders

Ні, це досить зрозуміло.
Пітер Тейлор

Відповіді:


8

Пітон - 385

Це пряма реалізація рівняння 21 від http://mathworld.wolfram.com/RiemannZetaFunction.html При цьому використовується умова Python для необов'язкових аргументів; якщо ви хочете вказати точність, ви можете передати третій аргумент функції, інакше вона використовує 1e-24 за замовчуванням.

import numpy as N
def z(r,i,E=1e-24):
 R=0;I=0;n=0;
 while(True):
  a=0;b=0;m=2**(-n-1)
  for k in range(0,n+1):
   M=(-1)**k*N.product([x/(x-(n-k))for x in range(n-k+1,n+1)]);A=(k+1)**-r;t=-i*N.log(k+1);a+=M*A*N.cos(t);b+=M*A*N.sin(t)
  a*=m;b*=m;R+=a;I+=b;n+=1
  if a*a+b*b<E:break
 A=2**(1-r);t=-i*N.log(2);a=1-A*N.cos(t);b=-A*N.sin(t);d=a*a+b*b;a=a/d;b=-b/d
 print(R*a-I*b,R*b+I*a)

z(2,0)дає неправильне значення, має бути pi ^ 2/6.
GuillaumeDufay

4

Python 3 , 303 297 байт

Ця відповідь заснована на відповіді Python RT в декількох модифікаціях:

  • По- перше, Binomial(n, k)визначається як , p = p * (n-k) / (k+1)який змінюється , Binomial(n,k)щоб Binomial(n,k+1)при кожному проході для циклу.
  • По-друге, (-1)**k * Binomial(n,k)стало те, p = p * (k-n) / (k+1)що перевертає знак на кожному кроці циклу for.
  • По-третє, whileцикл змінено, щоб негайно перевірити, чи є a*a + b*b < E.
  • В- четверте, побітовое НЕ оператор ~використовується в декількох місцях , де вони будуть допомагати в гольф, використовуючи тотожності , такі як -n-1 == ~n, n+1 == -~n, і n-1 == ~-n.

Для кращого гольфу було внесено кілька інших невеликих модифікацій, наприклад, наведення forпетлі на одну лінію та виклик printна одну лінію з кодом до неї.

Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

Редагувати: -6 байт від ряду невеликих змін.

import math as N
def z(r,i,E=1e-40):
 R=I=n=0;a=b=1
 while a*a+b*b>E:
  a=b=0;p=1;m=2**~n
  for k in range(1,n+2):M=p/k**r;p*=(k-1-n)/k;t=-i*N.log(k);a+=M*N.cos(t);b+=M*N.sin(t)
  a*=m;b*=m;R+=a;I+=b;n+=1
 A=2**-~-r;t=-i*N.log(2);x=1-A*N.cos(t);y=A*N.sin(t);d=x*x+y*y;return(R*x-I*y)/d,(R*y+I*x)/d

1

Аксіома, 413 315 292 байт

p(n,a,b)==(x:=log(n^b);y:=n^a;[y*cos(x),y*sin(x)]);z(a,b)==(r:=[0.,0.];e:=10^-digits();t:=p(2,1-a,-b);y:=(1-t.1)^2+t.2^2;y=0=>[];m:=(1-t.1)/y;q:=t.2/y;n:=0;repeat(w:=2^(-n-1);abs(w)<e=>break;r:=r+w*reduce(+,[(-1)^k*binomial(n,k)*p(k+1,-a,-b) for k in 0..n]);n:=n+1);[r.1*m-q*r.2,m*r.2+r.1*q])

Це також реалізувало б рівняння 21 з http://mathworld.wolfram.com/RiemannZetaFunction.html Вищенаведене повинно бути єдиним, що інтерпретується функцією Axiom z (a, b) тут на 16 разів повільніше, ніж ця нижче функція Zeta (a, b) [ це має бути той, який складений] всі непільговані та прокоментовані [1 секунда для Zeta () проти 16 секунд для z () для одного значення 20 цифр після плаваючої точки]. Для запитання про цифри слід вибрати точність, називаючи цифри (); функція, наприклад цифри (10); z (1,1) повинна надрукувати 10 цифр після точки, але цифри (50); z (1,1) повинна надрукувати 50 цифр після точки.

-- elevImm(n,a,b)=n^(a+i*b)=r+i*v=[r,v]
elevImm(n:INT,a:Float,b:Float):Vector Float==(x:=log(n^b);y:=n^a;[y*cos(x),y*sin(x)]::Vector Float);

--                      +oo               n
--                      ---              ---
--             1        \       1        \            n 
--zeta(s)= ---------- * /     ------  *  /    (-1)^k(   )(k+1)^(-s)
--          1-2^(1-s)   ---n  2^(n+1)    ---k         k  
--                       0                0


Zeta(a:Float,b:Float):List Float==
  r:Vector Float:=[0.,0.]; e:=10^-digits()

  -- 1/(1-2^(1-s))=1/(1-x-i*y)=(1-x+iy)/((1-x)^2+y^2)=(1-x)/((1-x)^2+y^2)+i*y/((1-x)^2+y^2)    

  t:=elevImm(2,1-a,-b);
  y:=(1-t.1)^2+t.2^2;
  y=0=>[] 
  m:=(1-t.1)/y; 
  q:=t.2/y
  n:=0
  repeat
     w:=2^(-n-1)
     abs(w)<e=>break  --- this always terminate because n increase
     r:=r+w*reduce(+,[(-1)^k*binomial(n,k)*elevImm(k+1,-a,-b) for k in 0..n])
     n:=n+1
  -- (m+iq)(r1+ir2)=(m*r1-q*r2)+i(m*r2+q*r1)
  [r.1*m-q*r.2,m*r.2+r.1*q]

this is one test for the z(a,b) function above:

(10) -> z(2,0)
   (10)  [1.6449340668 482264365,0.0]
                                              Type: List Expression Float
(11) -> z(1,1)
   (11)  [0.5821580597 520036482,- 0.9268485643 3080707654]
                                              Type: List Expression Float
(12) -> z(-1,0)
   (12)  [- 0.0833333333 3333333333 3,0.0]
                                              Type: List Expression Float
(13) -> z(1,0)
   (13)  []
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.