গণনার ক্ষুদ্র অঙ্কের অঙ্কগুলি পাইগুলির ক্ষমতার পরিমাণ


12

ধনাত্মক পূর্ণসংখ্যা n আউটপুট দেওয়া π n এর ভগ্নাংশের প্রথম n দশমিক সংখ্যার যোগফল ।

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

1 → 1
2 → 14
3 → 6
4 → 13
5 → 24
50 → 211
500 → 2305
5000 → 22852

অন্তর্নির্মিত ফাংশনগুলি π এর ডিজিট সংখ্যার গণনা করা বা পাওয়ার সিরিজ বা অব্যাহত ভগ্নাংশগুলির কোনওটিকে মূল্যায়ন করার অনুমতি নেই। স্ট্যান্ডার্ড লুফোলস প্রযোজ্য। ইনপুট / আউটপুট একটি সুবিধাজনক বিন্যাসে হতে পারে (স্টিডিন, স্টডআউট, ফাংশন ইন / আউটপুট, ইত্যাদি)।

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


অন্যান্য ট্রিগ ফাংশনগুলি কি পাই গণনা করতে ব্যবহার করা যেতে পারে তবে প্রয়োজনীয়ভাবে সরাসরি নয়, যেমন আর্টাক্যানজেন্ট বা কাল্পনিক লোগারিদমের মতোও নিষিদ্ধ? এছাড়াও, n এর উচ্চতর সীমা কি এটির পরে ব্যর্থ হতে পারে?
FryAmTheEggman

@ ফ্রাইআম দ্য এজিগম্যান যদি এই ট্রিগার ফাংশনগুলি পাই এর স্বেচ্ছাসেবী অঙ্কগুলি গণনা করতে পারে তবে হ্যাঁ তারা নিষিদ্ধ। আপনার প্রোগ্রামটি যে কোনও এন এর জন্য তাত্ত্বিকভাবে কাজ করা উচিত , তবে রানটাইম বা স্মৃতিশক্তি খুব বেশি হয়ে গেলে তা ক্ষমা হবে।
orlp

উত্তর:


4

পাইথন - 191 বাইট

t=i=1L;k=n=input();f=2000*20**n;A=range(n+1)
for k in range(2,n):A=[(A[j-1]+A[j+1])*j>>1for j in range(n-k+1)];f*=k
while k:k=(1-~i*n%4)*f/A[1]/i**n;t+=k;i+=2
print sum(map(int,`t`[-n-4:-4]))

X 4x দ্রুত সংস্করণ - 206 বাইট

t=i=1L;k=n=input();f=2000*20**n;A=[0,1]+[0]*n
for k in range(1,n):
 f*=k
 for j in range(-~n/2-k+1):A[j]=j*A[j-1]+A[j+1]*(j+2-n%2)
while k:k=(1-~i*n%4)*f/A[1]/i**n;t+=k;i+=2
print sum(map(int,`t`[-n-4:-4]))

স্ট্যান্ডিন থেকে ইনপুট নেওয়া হয়। জন্য আউটপুট এন = 5000 (প্রথম সহ বা 60) প্রায় দ্বিতীয় স্ক্রিপ্ট 14s লাগে।


নমুনা ব্যবহার:

$ echo 1 | python pi-trunc.py
1

$ echo 2 | python pi-trunc.py
14

$ echo 3 | python pi-trunc.py
6

$ echo 4 | python pi-trunc.py
13

$ echo 5 | python pi-trunc.py
24

$ echo 50 | python pi-trunc.py
211

$ echo 500 | python pi-trunc.py
2305

$ echo 5000 | python pi-trunc.py
22852

ব্যবহৃত সূত্রটি নিম্নলিখিত:

যেখানে একটি এন হল এন থ্রি অলটারনেটিং সংখ্যা , যা আকারের এন এর সেটগুলিতে বিকল্প ক্রম সংখ্যা হিসাবে আনুষ্ঠানিকভাবে সংজ্ঞায়িত করা যেতে পারে (এছাড়াও দেখুন: A000111 )। বিকল্পভাবে, ক্রমটিকে স্পর্শকাতর সংখ্যা এবং সিকেন্ট নম্বরগুলির সংজ্ঞা হিসাবে সংজ্ঞায়িত করা যেতে পারে ( 2 এন = এস এন , 2 এন + 1 = টি এন ), আরও পরে।

ছোট সংশোধন ফ্যাক্টর সি এন দ্রুত আকারে 1 এ রূপান্তরিত হওয়ায় এন বড় হয় এবং এর দ্বারা দেওয়া হয়:

জন্য এন = 1 , মূল্যায়ন এই পরিমাণে লিবনিজের সিরিজ । আনুমানিক π 10 ½ হিসাবে , প্রয়োজনীয় পদগুলির সংখ্যা হিসাবে গণনা করা যেতে পারে:

যা 17 এ রূপান্তরিত হয় (গোলাকার) তবে এন এর ছোট মানগুলির জন্য আরও বেশি প্রয়োজন।

এন এর গণনার জন্য বেশ কয়েকটি অ্যালগরিদম, এমনকি একটি সুস্পষ্ট সূত্রও রয়েছে তবে এগুলির সবগুলি এন দ্বারা চতুর্ভুজযুক্ত । আমি মূলত সিডেলের অ্যালগরিদমের একটি বাস্তবায়ন কোড করেছি , তবে এটি ব্যবহারিক হতে খুব ধীর হয়ে গেছে। প্রতিটি পুনরাবৃত্তির জন্য অতিরিক্ত পদ সংরক্ষণের প্রয়োজন হয় এবং শর্তগুলি খুব দ্রুত বৃদ্ধি পায় ("ভুল" ধরণের ও (এন 2 ) )।

প্রথম লিপিটি মূলত নুথ এবং বুখোল্টজ দ্বারা প্রদত্ত একটি অ্যালগরিদমের বাস্তবায়ন ব্যবহার করে :

সমস্ত কে = 1..n এর জন্য টি 1, কে = 1 দিন

টি এর পরবর্তী মানগুলি পুনরাবৃত্ত সম্পর্কের দ্বারা দেওয়া হয়:

টি এন + 1, কে = 1/2 [ (কে - 1) টি এন, কে-1 + (কে + 1) টি এন, কে + 1 ]

একটি এন তারপর টি এন দ্বারা দেওয়া হয় , 1

(আরও দেখুন: A185414 )

যদিও স্পষ্ট করে বলা হয়নি, এই অ্যালগরিদম একই সাথে ট্যানজেন্ট নম্বর এবং সিকেন্ট নম্বর উভয়ই গণনা করে। দ্বিতীয় লিপিটি ব্রেন্ট এবং জিমারম্যান দ্বারা এই অ্যালগরিদমের একটি প্রকরণ ব্যবহার করে , যা এন এর সমতা অনুসারে টি বা এস গণনা করে । উন্নতি N / 2 দ্বারা চতুর্ভুজ , অতএব speed 4x গতির উন্নতি।


1
আপনার উত্তরের পিছনে গণিতগুলির দুর্দান্ত ব্যাখ্যা।
লজিক নাইট

3

পাইথন 2, 246 বাইট

চতুষ্কোণীয় একীকরণের সাথে আমি ক্যালকুলেটে আমার উত্তরের অনুরূপ পন্থা নিয়েছি । শেষ লাইনটি পাইয়ের Nth শক্তি নেয় এবং অঙ্কগুলি যোগ করে। এন = 5000 পরীক্ষাটি এক মিনিট বা তার বেশি সময় নেয়।

from decimal import*
d=Decimal
N=input()
getcontext().prec=2*N
j=d(1)
h=d(2)
f=h*h
g=j/h
a=j
b=j/h.sqrt()
t=j/f
p=j
for i in bin(N)[2:]:e=a;a,b=(a+b)/h,(a*b).sqrt();c=e-a;t-=c*c*p;p+=p
k=a+b
l=k*k/f/t
print sum(map(int,`l**N`.split('.')[1][:N]))

কিছু পরীক্ষা:

$ echo 1 | python soln.py
1
$ echo 3 | python soln.py
6
$ echo 5 | python soln.py
24
$ echo 500 | python soln.py
2305
$ echo 5000 | python soln.py
22852

অবারিত কোড:

from decimal import *
d = Decimal

N = input()
getcontext().prec = 2 * N

# constants:
one = d(1)
two = d(2)
four = two*two
half = one/two

# initialise:
a = one
b = one / two.sqrt()
t = one / four
p = one

for i in bin(N)[2:] :
    temp = a;
    a, b = (a+b)/two, (a*b).sqrt();
    pterm = temp-a;
    t -= pterm*pterm * p;
    p += p

ab = a+b
pi = ab*ab / four / t
print sum(map(int, `pi ** N`.split('.')[1][:N]))

লাইন 8, আপনি চালু করতে পারেন a=jএবং p=jকরতে a=p=jiirc। হতে পারে.
ইলিয়াস

ধন্যবাদ। এই কোডটির জন্য আরও গল্ফিং অপটিমাইজেশন রয়েছে তবে এটি দশমিক ছাড়াই অ্যালগরিদম ব্যবহার করে পুনর্লিখন ছাড়া প্রতিযোগিতামূলক হবে না।
লজিক নাইট

1

পাইথ, 33

s<>j^u+/*GHhyHy^TyQr*TQ0ZQT_y*QQQ

Isaacg দ্বারা এই উত্তর উপর ভিত্তি করে । সম্ভবত আরও গল্ফ করা যেতে পারে। স্লো।

s<>j            Digit sum of...
  ^                 
    u               Evaluate pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))
      +
        /
          *GH
          hyH
        y^TyQ       Except we generate a large integer containing 2n digits,
                    rather than a fraction.
      r*TQ0         Experimentally verified that 10*n iterations will give enough
                    precision for 2n digits (# digits correct grows faster than 2n).
      Z
    Q               To the nth power.
  T_y*QQQ         Get the last 2n^2 digits (all the fractional digits) and get the
                  first n fractional digits.

1
এই উত্তরটির সত্যতা প্রমাণের জন্য কমপক্ষে পর্যাপ্ত ব্যাখ্যা দরকার যা সঠিক উত্তর পাওয়ার জন্য এটি যথেষ্ট সংখ্যার সাথে গণনা করে।
পিটার টেলর

@ পিটারটেলর আমি আগামীকাল একটি বিবরণ যুক্ত করব, ঠিক বিছানায় যাব।
orlp

প্রতিটি পুনরাবৃত্তি একটি সঠিক বিট উত্পাদন করে ( পরিশিষ্ট এ দেখুন )। 2n সংখ্যার জন্য ~ 6.64n পুনরাবৃত্তি প্রয়োজন।
প্রিমো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.