গামা ফাংশন গল্ফ


17

একটি বাস্তব নম্বর দেওয়া tমধ্যে (-10^9,13)(তত্সহ না -10^9বা 13ইনপুট, আউটপুট হিসাবে) Γ(t), নামেও পরিচিত গামা ফাংশন , যা অনুসরণ হিসাবে সংজ্ঞায়িত করা হয়:

গামা ফাংশন সংজ্ঞা

আপনি এই টাস্কটি সমাধান করতে কোনও অন্তর্নির্মিত গামা ফাংশনটি ব্যবহার করতে পারবেন না বা বিল্ট-ইন সংখ্যাসূচক বা প্রতীকী ইন্টিগ্রেশন ফাংশনও ব্যবহার করতে পারবেন না। আপনার আউটপুটটি 6 টি উল্লেখযোগ্য পরিসংখ্যান বা 10^-6প্রকৃত মানের মধ্যে সঠিক হওয়া উচিত , যেটি প্রদত্ত মানের জন্য কম প্রতিবন্ধক। পাইথনের অন্তর্নির্মিত গামা ফাংশনটি আসল মান নির্ধারণের জন্য ব্যবহৃত হবে। আপনি ধরে নিতে পারেন Γ(t)সংজ্ঞায়িত - যেটি tহয় একটি ধনাত্মক আসল সংখ্যা বা একটি অ-পূর্ণসংখ্যার নেতিবাচক বাস্তব সংখ্যা - এবং এটি |Γ(t)| ≤ 10^9এখানে একটি রেফারেন্স প্রোগ্রাম রয়েছে যা আপনি পাইথনের অন্তর্নির্মিত গামা ফাংশনটি ব্যবহার করে প্রকৃত মানগুলি পেতে ব্যবহার করতে পারেন।

উদাহরণ

1 -> 1.000000
-2.5 -> -0.945309
3.14159265 -> 2.288038
-2.71828182846 -> -0.952682
12 -> 39916800.000000
0.5 -> 1.772454
8.675309 -> 20248.386956
-10.1 -> -0.000002

বিধি

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

লিডারবোর্ড

এই পোস্টের নীচে স্ট্যাক স্নিপেট উত্তরগুলি থেকে লিডারবোর্ড তৈরি করে) ক) ভাষা প্রতি সংক্ষিপ্ত সমাধানের তালিকা হিসাবে এবং খ) সামগ্রিক লিডারবোর্ড হিসাবে।

আপনার উত্তরটি প্রদর্শিত হয়েছে তা নিশ্চিত করার জন্য, দয়া করে নীচের মার্কডাউন টেমপ্লেটটি ব্যবহার করে আপনার উত্তরটি শিরোনাম দিয়ে শুরু করুন:

## Language Name, N bytes

Nআপনার জমা দেওয়ার আকারটি কোথায় ? আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন । এই ক্ষেত্রে:

## Ruby, <s>104</s> <s>101</s> 96 bytes

যদি আপনি নিজের শিরোনামে একাধিক সংখ্যা অন্তর্ভুক্ত করতে চান (যেমন আপনার স্কোর দুটি ফাইলের সমষ্টি বা আপনি পৃথকভাবে দোভাষী পতাকা দণ্ডের তালিকা করতে চান), নিশ্চিত করুন যে আসল স্কোরটি শিরোনামের শেষ সংখ্যা:

## Perl, 43 + 2 (-p flag) = 45 bytes

আপনি ভাষাটির নামটিকে একটি লিঙ্কও তৈরি করতে পারেন যা স্নিপেটে প্রদর্শিত হবে:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
অনুগ্রহ করে টি এর জন্য স্পষ্ট সীমা সরবরাহ করুন | গামা (টি) | <10 ^ 9
flawr

লিংক একটি রেফারেন্স বাস্তবায়ন নয়, ...
sergiol

@ সার্জিওল এটির উচ্চারণ করেছেন
মেগো

উত্তর:


2

পাইথ, 21 বাইট

আমার টিআই-বেসিক উত্তরের মতো, আমি এটি পুরো 8 ^ 10 পুনরাবৃত্তির সাহায্যে পরীক্ষা করতে সক্ষম হয়েছি না, তবে ছোট ছোট ক্ষেত্রেও সবকিছু ভাল দেখাচ্ছে।

cu*Gc^hc1HQhcQHS^8T1Q

ব্যাখ্যা:

                            [implicit: Q=input]
                ^8T         8**10
               S^8T         [1,2,3,...,8**10]
  *Gc^hc1HQhcQH             lambda G,H:G*(1+1/H)**Q/(1+Q/H)
                   1        Base case
 u*Gc^hc1HQhcQHS^8T1        Reduce with base case 1
c                   Q       Divide by Q

এখানে 8 ^ 10 এর পরিবর্তে 2000 পুনরাবৃত্তির সাহায্যে চেষ্টা করুন ।


10

সি ++ 14, 86 85 81 বাইট

[](auto t){auto v=1.;for(int x=1;x<1e9;++x)v*=pow(1+1./x,t)/(1+t/x);return v/t;};

আমি এই একটি খুব বেশি সময় ব্যয় করিনি। আমি কেবল আনুমানিক দিকে নজর রেখেছি যা প্রয়োগ করা সবচেয়ে সহজ বলে মনে হয়েছিল (বাইটের পদ্ধতিতে)। মানটি গণনা করতে কিছুটা সময় লাগবে (যেহেতু লুপটি সমস্ত ধনাত্মক পূর্ণসংখ্যার চেয়ে বেশি) তবে চ্যালেঞ্জটিতে সময় সীমাবদ্ধতা নির্দিষ্ট করা হয়নি। এটি বেনাম ফাংশন (ল্যাম্বডা), যা কোনও যুক্তি নেয় ( Tযার উপর রূপান্তরযোগ্য pow(double, T)এবংoperator/(T,int) বলা যেতে পারে) এবং আয় double

ব্যবহারের সাথে অবরুদ্ধ

#include <iostream>
int main()
{
    auto r = [](auto t)
    {
        auto v = 1.;
        for (int x = 1; x < 1e9; ++x)
            v *= pow(1 + 1. / x, t) / (1 + t / x);
        return v / t;
    };
    std::cout << r(-2.71828182846); // outputs -0.952682
}

@ মেগো অবশ্যই! ধন্যবাদ।
জেরেজেস

তাহলে আপনি কী -10 ^ 9 এবং 10 ^ 9 এর জন্য কী মূল্য পাবেন? আপনি আমার উত্সাহ পাওয়ার আগে আপনার জিনিসগুলি কতটা ভাল কাজ করে তা আমি প্রথমে জানতে চাই।
flawr

@ মেগো মাইক্রোসফ্ট সংকলকটির থাইসে অন্তর্ভুক্ত নয় need
জেরেজেস

@ মেগোMicrosoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x86
জেরেজেস

@ ফ্লোয়ার মাইন প্রোগ্রাম 0 এর ফলাফল দেয় gamma(-10e9)তবে ওপি বলেছিল যে কেবলমাত্র পরামিতি, যার জন্য গামা ফাংশন সংজ্ঞায়িত হয়েছে, বিবেচনা করা যেতে পারে। gamma(10e9)আয় inf, যখন পাইথন এর বিল্ট-ইন গামা ফাংশন প্রকৃত মূল্য নির্ধারণের জন্য ব্যবহৃত হবে বলেOverflowError: math range error
Zereges

7

মিনকোলং 0.12 , 35 34 25 বাইট

n$zl8;dz;z$:r[i1+dz+$:*]N

এটি একটি ত্রুটি (0 দ্বারা ভাগ করার চেষ্টা করার ক্ষেত্রে) দিয়ে থামবে না, তবে এটি মেটা sensকমত্য অনুযায়ী অনুমোদিত । একটি যোগ করুন .একটি প্রোগ্রাম যা স্থগিত স্বাভাবিকভাবে জন্য শেষে। সমস্ত পরীক্ষার কেস একবারে চেষ্টা করে দেখুন। (লুপটি কেবল 1e4 বার পুনরাবৃত্তি করে তাই এটি শেষের চেয়ে শীঘ্রই শেষ হবে))

ব্যাখ্যা

জেরেজেসগুলি বিকল্পগুলির এক , অসীম পণ্যের সংজ্ঞা ব্যবহার করেছে । দেখা যাচ্ছে যে, অন্যটি মিনকোলাঙে প্রয়োগের জন্য আরও অনেক বেশি কার্যকর।

ইউমার বিকল্প গামা ফাংশন গঠনের

nঅনন্তের দিকে যাওয়ার ক্ষেত্রে এটি একটি সীমা , যার অর্থ আমি উভয়ই গণনা করতে পারি n!এবং (t+n)যাচ্ছি। সুতরাং আমি বের করে আছি 1/t(কারণ 0!=1) এবং n^tকারণ এর শেষের মানটি না জেনে ক্রমান্বয়ে গণনা করা যায় না n। যেমনটি ঘটে, কারণn হ'ল সীমা হ'ল, আমি এটি দুটিবার ব্যবহার করতে পারি। একবার গণনার ফ্যাক্টর হিসাবে এবং একবারে লুপটি চালানোর সংখ্যা হিসাবে।

একটি ক্রমহীন অসীম পণ্যটি কিছু দিয়ে শুরু করতে হয়, সাধারণত 1. এই ক্ষেত্রে, এটি n^t/t। লুপের শরীরে, আমি k/(t+k)এখন পর্যন্ত পণ্যটির সাথে এটি গণনা এবং গুণ করি । শেষে, পুরো পণ্য গণনা করা হয়েছে এবং আউটপুট। এটি আমার প্রোগ্রামটি মূলত যা করে, nযথেষ্ট উচ্চমাত্রার সাথে উত্তরটি যথেষ্ট যথাযথ।

অসীম পণ্যের বিস্ফোরিত সংস্করণ

n                            Take number from input
 $z                          Store it in the register (this is t; retrieved with z)
   l8;                       10^8 (this is n, the limit)
      d                      n,n
       z;                    n,n^t
         z$:                 n,n^t/t
            r                Reverse stack -> n^t/t,n
             [               For loop that runs n times
              i1+            k
                 d           k,k
                  z+         k,t+k
                    $:       k/(t+k)
                      *      Multiply
                       ]N    Close for loop and output as integer

যেমন নেই ., এটি চারপাশে মোড়ানো এবং আবার শুরু হয়। যাইহোক, nএখন উত্পাদন করে -1কারণ ইনপুটটি খালি, যা শেষ পর্যন্ত 0 দ্বারা ভাগ করার চেষ্টা করে, যা প্রোগ্রামটি থামিয়ে দেয়।


5

জুলিয়া, 141 বাইট

z->(z-=1;a=90;c(k)=(k=big(k);(-1)^(k-1)/factorial(k-1)*(a-k)^(k-.5)*exp(a-k));(z+a)^(z+.5)*exp(-z-a)*(√(2π)+sum([c(k)/(z+k)for k=1:a-1])))

এটি একটি নামবিহীন ল্যাম্বদা ফাংশন তৈরি করে যা একটি আসল সংখ্যা গ্রহণ করে এবং একটি আসল নম্বর প্রদান করে। এটি গামা গণনা করতে স্পঞ্জের সান্নিধ্য ব্যবহার করে ।

Ungolfed:

function Γ(z::Real)
    # Spounge's approxmation is for Γ(z+1), so subtract 1
    z -= 1

    # Choose a number for the constant a, which determines the
    # bound on the error
    a = 90

    # Define a function for the sequence c_k
    function c(k::Integer)
        # Convert k to a BigInt
        k = big(k)
        return (-1)^(k-1) / factorial(k-1) * (a-k)^(k-1/2) * exp(a-k)
    end

    # Compute the approximation
    return (z+a)^(z+1/2) * exp(-z-a) * (√(2π) + sum([c(k)/(z+k) for k=1:a-1]))
end

খুব, খুব দেরিতে গল্ফ, তবে z->(z-=1;a=90;c(k)=(k=big(k);(-1)^~-k/factorial(k-1)*(a-k)^(k-.5)*exp(a-k));(z+a)^(z+.5)*exp(-z-a)*(√(2π)+sum(c(k)/(z+k)for k=1:a-1)))137 বাইটের জন্য কাজ করা উচিত (কমপক্ষে
জুলিয়ায়

3

জাপট, 45 বাইট

Japt একটি সংক্ষিপ্ত সংস্করণ জা vaScri পর্তুগীজ ভাষায়অনুবাদক

$for(V=X=1;X<1e9;)$V*=(1+1/X pU /(1+U/X++;V/U

অবশ্যই, 1e9 = 1,000,000,000 পুনরাবৃত্তি চিরকাল লাগে, তাই পরীক্ষার জন্য, এর 9সাথে প্রতিস্থাপনের চেষ্টা করুন try6 । (1e6 significant 5 উল্লেখযোগ্য পরিসংখ্যানের সাথে নির্ভুল। ইনপুটটিতে 1e8 ব্যবহার করা 12প্রথম ছয়টি পেতে যথেষ্ট))

পরীক্ষার ক্ষেত্রে ফলাফল: (1e7 নির্ভুলতা ব্যবহার করে)

       1:  1
    -2.5: -0.9453083...
      pi:  2.2880370...
      -e: -0.9526812...
      12:  39916536.5...
     0.5:  1.7724538...
8.675309:  20248.319...
   -10.1: -0.0000022...

কিভাবে এটা কাজ করে

         // Implicit: U = input number
$for(    // Ordinary for loop.
V=X=1;   //  Set V and X to 1.
X<1e9;)$ //  Repeat while X is less than 1e9.
V*=      // Multiply V by:
(1+1/X   //  1 plus (1 over X),
pU /     //  to the power of U, divided by
(1+U/X++ //  1 plus (U over X). Increment X by 1.
;V/U     // Output the result of (V over U).

3

টিআই-বেসিক, 35 বাইট

Input Z
1
For(I,1,ᴇ9
Ans(1+I⁻¹)^Z/(1+Z/I
End
Ans/Z

এটি জেরেজেসের মতো একই অ্যালগরিদম ব্যবহার করে।

ক্যাভেট: আমি আসলে এটি পুরো 1e9 পুনরাবৃত্তির সাথে পরীক্ষা করিনি; ছোট মানগুলির জন্য নেওয়া সময়ের ভিত্তিতে আমি আশা করি রানটাইমটি মাসের ক্রম অনুসারে থাকবে । তবে এটি রূপান্তরিত হয়েছে বলে মনে হচ্ছে এবং গোলাকৃতি ত্রুটির সাথে কোনও সমস্যা হওয়া উচিত নয়। টিআই সংখ্যার দশমিক ভাসমান হিসাবে নির্ভুলতার 14 অঙ্কের সাথে ভাসমান।


আপনি এটি পরীক্ষা করেননি ?!
তানমাথ

1
@ ট্যানম্যাথ আমি চাইব, তবে পরের মাসে আমার চূড়ান্ত পরীক্ষার জন্য আমার ক্যালকুলেটর দরকার।
lirtosiast

3

পাইথন 3, 74 68 78 73 বাইট

ধন্যবাদ @ মেগো এবং @ এক্সনর

এটি জেরেজেসের সি ++ উত্তরের অনুবাদ translation মূলত, এটি গামা ফাংশনের একটি বিকল্প সংজ্ঞা, অতএব আরও নির্ভুল (এবং কী দুর্দান্ত তা হ'ল কম বাইট ব্যবহার করা হয়!)

আমি সব ভুলের জন্য দুঃখিত!

def g(z,v=1):
 for i in range(1,10**9):v*=(1+1/i)**z/(1+z/i)
 return v/z

1
+1ব্যাপ্তির উপর কোন ব্যাপার না যখন আপনি কোটি কোটি সঙ্গে তার আচরণ করছে। এছাড়াও, আপনি উল্লেখ করা উচিত যে এই পাইথন 3 - আপনি প্রয়োজন চাই from __future__ import divisionআসলে মোকাবেলা করার যে ভাসা বিভাগ এবং র্যাম কয়েক টেরাবাইট জন্য rangeআয় পাইথন 2. প্লাস একটি তালিকা, আপনি প্রতিস্থাপন করতে পারেন 1.0সঙ্গে গুলি 14 বন্ধ s এবং শেভ বাইট।
মেগো

2
@ ট্যানম্যাথ: ^কি জোর , আপনি কি ক্ষয়ক্ষতি **হিসাবে বোঝাতে চাইছেন না ?
জের্মানকু

3
int(1e9)ন্যায়সঙ্গত 10**9, এবং আপনার চারপাশে পেরেনগুলির দরকার নেই (1+1/i)**z
xnor

3

পাইথন, 348 448 407 390 389 বাইট

@ মেগোকে বিশেষ ধন্যবাদ!

ছাড়িয়ে গেছে 448 (প্রায়) এখনও একটি 448! : P

এটি ল্যাঞ্জকোস আনুমানিকতার উপর ভিত্তি করে। থেকে Golfed এখানে

from cmath import*
C=[0.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-17‌6.6150291621406,12.507343278686905,-0.13857109526572012,9.984369578019572e-6,1.5‌​056327351493116e-7]
def g(z):
 z-=1;if z.real<0.5:return pi/(sin(pi*z)*gamma(1-z))
 else:
  x=C[0]
  for i in range(1,9):x+=C[i]/(z+i)
  t=z+7.5;return sqrt(2*pi)*t**(z+0.5)*exp(-t)*x

1
দয়া করে আপনার জমাটি সর্বনিম্নভাবে, সাদা স্থান সরিয়ে (= এর আগে এবং পরে - = এবং import *উদাহরণস্বরূপ) এবং এক-চরিত্রের ফাংশন নাম ব্যবহার করে গল্ফ করুন । এছাড়াও মনে রাখবেন যে আপনাকে কেবল আসল ইনপুট সমর্থন করতে হবে।
lirtosiast

@ থমাসকওয়া এটি সম্পাদনা করেছি। আমার আসল সংস্করণটি কার্যকর হয়নি, এখানে একটি নতুন সংস্করণ।
তানমাথ

@ মেগো সম্পাদিত ...
তানমাথ

এটি পুনরাবৃত্তির ত্রুটির কারণ ঘটায় - এটি ঠিক করার জন্য z-=1;প্রথম লাইনে সরিয়ে ফেলুন gamma। আপনারও নাম পরিবর্তন gammaকরা উচিতg বাইট সংরক্ষণ এবং সাথে সঙ্ঘাত নামকরণ এড়াতে cmath.gamma। বহির্মুখী নেতৃস্থানীয় জিরোগুলিও বাদ দিন।
মেগো

1

জুলিয়া, 41 বাইট

x->prod([(1+1/i)^x/(1+x/i)for i=1:1E7])/x

এটি জেরেগেসের সি ++ উত্তরের অনুবাদ is যদিও আমার অন্যান্য জুলিয়া উত্তর তাত্ক্ষণিকভাবে শেষ হচ্ছে, এটি বরং ধীর। এটি আমার কম্পিউটারে প্রতি কয়েক সেকেন্ডের মধ্যে পরীক্ষার কেসগুলি গণনা করে।

Ungolfed:

function f(x::Real)
    prod([(1 + 1/i)^x / (1 + x/i) for i = 1:1E7]) / x
end

1

প্রোলোগ, 114 বাইট

এটি জেরেগেসের সি ++ উত্তরের অনুবাদ is

q(F,F,V,Z):-X is V/Z,write(X).
q(F,T,V,Z):-W is(1+1/F)**Z/(1+Z/F)*V,I is F+1,q(I,T,W,Z).
p(N):-q(1.0,1e9,1,N),!.

এটি অনলাইনে চেষ্টা করে দেখুন এখানে
ফর্মের ক্যোয়ারী দিয়ে চালান:

p(12).

এটি 1e9 পুনরাবৃত্তির সাথে চালাতে প্রায় 15 মিনিট সময় লাগে।
আপনি যদি এটি 1e6 এ হ্রাস করেন তবে এটি প্রায় 1 সেকেন্ড সময় নেয় যা সহজ (তবে কম স্বচ্ছ) পরীক্ষার জন্য তোলে।
আপনার কম্পিউটার / ল্যাপটপের একটি দোভাষী হিসাবে এটি চালানো সম্ভবত বেশিরভাগ লোকের পক্ষেও দ্রুত।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.