কমপ্লেক্স নাম্বারে রিমন জিটা ফাংশনটি মূল্যায়ন করুন


11

ভূমিকা

আমি এই প্রশ্নটি বন্ধ করে দিয়েছি কারণ এটি অস্পষ্ট ছিল, তবুও এটি একটি দুর্দান্ত ধারণা ছিল। এটিকে পরিষ্কার চ্যালেঞ্জ হিসাবে গড়ে তুলতে আমি যথাসাধ্য চেষ্টা করব।

রিম্যান জিটা ফাংশনের একটি বিশেষ ফাংশন যা বিশ্লেষণাত্মক ধারাবাহিকতা হিসাবে সংজ্ঞায়িত করা হয়

এখানে চিত্র বর্ণনা লিখুন

জটিল বিমান। এর জন্য অনেক সমতুল্য সূত্র রয়েছে যা কোড গল্ফের জন্য এটি আকর্ষণীয় করে তোলে।

চ্যালেঞ্জ

একটি প্রোগ্রাম লিখুন যা ইনপুট হিসাবে 2 টি ফ্লোট নেয় (জটিল সংখ্যার আসল এবং কল্পিত অংশ) এবং সেই সময়ে রিমন জেটা ফাংশনটি মূল্যায়ন করে।

বিধি

  • কনসোল বা ফাংশন ইনপুট এবং রিটার্ন মানের মাধ্যমে ইনপুট এবং আউটপুট
  • জটিল সংখ্যায় অন্তর্নির্মিত অনুমোদিত নয়, ফ্লোট ব্যবহার করুন (সংখ্যা, ডাবল, ...)
  • গাণিতিক কোন কাজ ছাড়া + - * / pow logআসল মূল্যবান ট্রিগ (যদি আপনি সংহত করতে চান, গামা ফাংশনটি ব্যবহার করতে চান, ... আপনাকে অবশ্যই কোডটিতে এই ফাংশন সংজ্ঞাটি অন্তর্ভুক্ত করতে হবে)
  • ইনপুট: 2 ফ্লোট
  • আউটপুট: 2 ফ্লোট
  • আপনার কোডটিতে এমন মান থাকতে হবে যা তাত্ত্বিকভাবে স্বেচ্ছাচারিত নির্ভুলতা দেয় যখন স্বেচ্ছাসেবক বড় / ছোট করা হয়
  • ইনপুট 1 এ আচরণটি গুরুত্বপূর্ণ নয় (এটি এই ফাংশনের একমাত্র মেরু)

বাইটের মধ্যে সংক্ষিপ্ততম কোড জয়!

উদাহরণ ইনপুট এবং আউটপুট

ইনপুট:

2, 0

আউটপুট:

1.6449340668482266, 0

ইনপুট:

ঘ, ঘ

আউটপুট:

0.5821580597520037, -0.9268485643308071

ইনপুট:

-1, 0

আউটপুট:

-0.08333333333333559, 0


1
প্রয়োজনীয় আউটপুট নির্ভুলতা কি? আমি নিশ্চিত না যে আমি বুঝতে পেরেছি যে আপনার কোডটিতে এমন মান থাকতে হবে যা তাত্ত্বিকভাবে স্বেচ্ছাচারিত নির্ভুলতা দেয় যখন স্বেচ্ছাসেবী বড় / ছোট করা হয় । আপনি কি লুপ সর্বাধিক মানের মতো বোঝাতে চেয়েছেন যখন বাউন্ড না বাড়ানো যথাযথতা দেয়? সেই মানটি কি হার্ড-কোডড হতে পারে?
লুইস মেন্ডো

@ ডোনমুসলি এর অর্থ হ'ল নির্ভুলতা একটি প্যারামিটারের উপর নির্ভর করে, এন বলুন যা আপনি আপনার পছন্দ মতো কোনও মূল্য দিতে পারেন তবে যে কোনও নির্ভুলতার জন্য আপনি সেই নির্ভুলতা অর্জনের জন্য এন কে ছোট বা যথেষ্ট বড় করতে পারেন। তাত্ত্বিকভাবে শব্দটি এখানে রয়েছে কারণ আপনাকে অবশ্যই মেশিন বা ভাষার সীমাবদ্ধতা সম্পর্কে চিন্তা করবেন না।
জেনস রেন্ডার্স

N আরও স্পষ্ট করার জন্য: এটি কি যথেষ্ট যে কোনও আবদ্ধ epsএবং ইনপুট জন্য xএমন একটি উপস্থিত থাকে Nযা ভিতরে গণনা zeta(x)করে eps; বা অবশ্যই এমন একটি অস্তিত্ব থাকতে হবে Nযা কেবলমাত্র নির্ভর করে epsএবং গ্যারান্টি দেয় যে কোনওর জন্য x(বা সম্ভবত মেরু থেকে xপ্রদত্ত কোনও কার্যকারিতা ছাড়াও eps) এটি সীমাবদ্ধতা অর্জন করে; বা Nউপর নির্ভর করতে পারে x, তবে উত্তরগুলি কীভাবে Nদেওয়া xএবং কীভাবে গণনা করবে তা ব্যাখ্যা করা উচিত eps? (আমার বিশ্লেষণাত্মক সংখ্যা তত্ত্বটি খুব বেশি নয় তবে আমি সন্দেহ করি যে 2 এবং 3 বিকল্পগুলি এক বা দুটি নিয়মিত পোস্টার ব্যতীত সকলের বাইরে চলে যাবে)।
পিটার টেলর

@ পিটারটেলর এন যথেষ্ট পরিমাণে বড়: যে কোনও xএবং কারওর জন্য epsঅবশ্যই এর একটির উপস্থিতি থাকতে হবে Pযা সমস্ত N>Pআউটপুটের জন্য epsসঠিক মানের চেয়ে নিকটে থাকে । এটা কি পরিষ্কার? যথেষ্ট পরিমাণে এন এর ক্ষেত্রে আমার কি এটি পরিষ্কার করতে হবে?
জেনস রেন্ডার্স

না, এটি যথেষ্ট পরিষ্কার।
পিটার টেলর

উত্তর:


8

পাইথন - 385

এটি http://mathworld.wolfram.com/RiemannZetaFunction.html থেকে সমীকরণ 21 -এর একটি সরল বাস্তবায়ন Thisচ্ছিক যুক্তিগুলির জন্য এটি পাইথনের সম্মেলন ব্যবহার করে; আপনি যদি কোনও যথার্থতা নির্দিষ্ট করতে চান তবে আপনি ফাংশনে তৃতীয় যুক্তিটি পাস করতে পারেন, অন্যথায় এটি ডিফল্টরূপে 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)একটি ভুল মান দেয়, পাই ^ 2/6 হওয়া উচিত।
গিলিয়ামডুফে

4

পাইথন 3 , 303 297 বাইট

এই উত্তরটি বেশ কয়েকটি পরিবর্তন সহ আরটি-র পাইথন উত্তরের উপর ভিত্তি করে :

  • প্রথমে 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)যা লুপের প্রতিটি পদক্ষেপে সাইনটি ফ্লিপ করে।
  • তৃতীয়ত, whileলুপটি তাত্ক্ষণিকভাবে পরীক্ষা করার জন্য পরিবর্তন করা হয়েছে a*a + b*b < E
  • চতুর্থত, bitwise না অপারেটর ~বিভিন্ন জায়গায় ব্যবহার করা হয় যেখানে তারা golfing সাহায্য করবে, যেমন পরিচয় ব্যবহার -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])

এটি http://mathworld.wolfram.com/RiemannZetaFunction.html থেকে 21 সমীকরণটিও বাস্তবায়িত করবে উপরেরটি একটি নীচে বর্ণিত অক্ষর ফাংশন z (ক, খ) এর নীচের ফাংশন জিটা (ক, খ) এর চেয়ে 16x কম হওয়া উচিত [ এটিই একটি সংকলিত হওয়া উচিত] সমস্ত অসম্পূর্ণ এবং মন্তব্য করা হয়েছে [জেটের (1 সেকেন্ডের বিপরীতে 16 সেকেন্ডের বিপরীতে জেড () এর জন্য ভাসমান পয়েন্টের পরে 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)  []
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.