শক্তি উত্থাপন


12

চ্যালেঞ্জ

চ্যালেঞ্জ এমন একটি প্রোগ্রাম লিখছে যা ইতিবাচক সংখ্যা aএবং একটি ননজারো নম্বর bএবং আউটপুটগুলি গ্রহণ করে a^b(পাওয়ার বিটিতে উত্থাপিত)। আপনি কেবল + - * / abs()গাণিতিক ফাংশন / অপারেটর হিসাবে ব্যবহার করতে পারেন । এগুলি কেবল স্কেলারের মানগুলিতে প্রয়োগ করা যেতে পারে তবে পুরো তালিকা বা অ্যারেগুলিতে নয়।

উদাহরণ:

1.234 ^ 5.678 = 3.29980
4.5   ^ 4.5   = 869.874
4.5   ^-4.5   = 0.00114959

প্রাসঙ্গিক: http://xkcd.com/217/

বিস্তারিত

আপনি কনসোল ব্যবহার করার জন্য একটি ফাংশন বা অনুরূপ নির্মাণ লিখতে পারেন। আপনি কনসোল ইনপুট ব্যবহার করতে না পারলে আপনি ধরে নিতে পারেন যে দুটি সংখ্যা ভেরিয়েবলে সংরক্ষণ করা হয়েছে এবং স্ট্যান্ডার্ড আউটপুট বা কোনও ফাইলের মাধ্যমে লেখার মাধ্যমে আউটপুট। আউটপুটটি কমপক্ষে 4 টি হিনিয়েটের অঙ্কে সঠিক হতে হবে। আপনি ধরে নিতে পারেন যে উভয়ই aএবং bননজারো। উল্লেখযোগ্যভাবে 1 মিনিটের বেশি রানটাইম গ্রহণযোগ্য নয়। সর্বনিম্ন সংখ্যা বাইট জিতবে। আপনার প্রোগ্রাম এবং আপনার অ্যালগরিদম ব্যাখ্যা করুন।

সম্পাদনা: কেবলমাত্র ইতিবাচক ভিত্তিগুলি বিবেচনা করতে হবে। আপনি ধরে নিতে পারেন a>0উভয় সংখ্যার পূর্ণসংখ্যার দরকার নেই তা জেনে রাখুন !!!


3
আপনি কি আমাদেরকে দশমিক শক্তি বাড়িয়ে তুলতে বলছেন? যেমন বলুন, 4.5 ^ 4.5?
ফুয়ন্ডন

1
এর অর্থ কি বেসটি নেতিবাচক হলে আমাদের কল্পিত সংখ্যাগুলি আউটপুট করতে হবে?
bebe

1
আউটপুট কি -0.5 ** 0.5হতে হবে?
ডেনিস

ঠিক আছে আমি এই মামলাটি ভাবি নি, আপনাকে ধন্যবাদ: নেতিবাচক ঘাঁটিগুলি সঠিকভাবে প্রয়োগ করা উচিত নয়। @ ফুয়ানডন ঠিক, আসল সংখ্যায় দশমিক থাকতে পারে (কমপক্ষে বেশিরভাগ প্রোগ্রামিং ভাষায় =)
flawr

আমি খ <0: `4.5 ^ -4.5 = 0.0011496 '
edc65

উত্তর:


3

পাইথন, 77

কিছু অন্যান্য উত্তর হিসাবে এটি লগ এবং এক্সপ উপর ভিত্তি করে। তবে ফাংশনগুলি সাধারণ ডিফারেনশিয়াল সমীকরণগুলি সংখ্যাসূচকভাবে সমাধান করে গণনা করা হয়।

def f(a,b,y=1):
 if a<1:a=1/a;b=-b
 while a>1:a/=1e-7+1;y*=b*1e-7+1
 return y

এটি কি প্রয়োজনীয়তাগুলি পূরণ করে? প্রশ্নের উদাহরণগুলির জন্য, হ্যাঁ। বড় একটির জন্য এটি খুব দীর্ঘ সময় নিবে। বড় একটি বা খ এর জন্য, এটি ভুল হয়ে যাবে।

উদাহরণ:

a            b            f(a, b)      pow(a, b)      <1e-5 rel error?
       1.234        5.678       3.2998       3.2998   OK
         4.5          4.5      869.873      869.874   OK
         4.5         -4.5   0.00114959   0.00114959   OK
         0.5          0.5     0.707107     0.707107   OK
         0.5         -0.5      1.41421      1.41421   OK
          80            5  3.27679e+09   3.2768e+09   OK
     2.71828      3.14159      23.1407      23.1407   OK

আপডেট: flawr গণিত সম্পর্কে আরও বিশদ চেয়েছিল তাই আপনি এখানে যান। আমি নিম্নলিখিত প্রাথমিক মান সমস্যাগুলি বিবেচনা করেছি:

  • x '(টি) = x (টি), এক্স (0) = 1 সহ সমাধানটি এক্সপ (টি) হয়।
  • y '(t) = by (t), y (0) = 1 সহ সমাধানটি এক্সপ (বিটি) হয়।

আমি যদি এই জাতীয় টি (টি) = এটির মান খুঁজে পেতে পারি তবে আমার কাছে y (টি) = এক্সপ্রেস (বিটি) = ক ^ বি হবে। প্রাথমিক মান সমস্যার সংখ্যাগত সমাধান করার সহজ উপায় হ'ল ইউলারের পদ্ধতি । আপনি ডেরিভেটিভের গণনা করেন যে ফাংশনটি অনুমিত হয় এবং তারপরে একটি অনুধাবনের দিকে এবং তার সাথে আনুপাতিক দিকে একটি পদক্ষেপ গ্রহণ করুন তবে একটি ক্ষুদ্র ধ্রুবক দ্বারা ছোট করে তোলা হয়েছে। তাই আমি যা করি, এক্স যত বড় না হওয়া পর্যন্ত ছোট পদক্ষেপ নিন এবং তারপরে দেখুন এই সময়ে আপনি কী আছেন। ঠিক আছে, আমি এটিই ভেবেছিলাম। আমার কোডে টি কখনই স্পষ্টভাবে গণনা করা হয় না (এটি 1e-7 * যখন লুপের ধাপগুলির সংখ্যা) এবং আমি এর পরিবর্তে x এর জন্য গণনা করে কিছু অক্ষর সংরক্ষণ করেছি।


এটি দুর্দান্ত দেখাচ্ছে, আমি অন্য একটি ভিন্ন পদ্ধতি দেখে খুশি! এই ডিফারেনশিয়াল সমীকরণ সম্পর্কে আপনি কি আমাদের আরও কিছু বলতে পারেন? আমি সাধারণত তারা কি জানি কিন্তু আমি আপনাকে ব্যবহারসমূহ প্রোগ্রাম তাদের = জিনিসটা) পারল না
flawr

@ ফ্লোয়ার: ঠিক আছে, আমি গণিত সম্পর্কে আরও কিছু বিবরণ দিয়ে আপডেট করেছি।
reheated

6

জাভাস্ক্রিপ্ট (E6) 155 174 191

সম্পাদনা 2 @bebe দ্বারা প্রস্তাবিত হিসাবে, পুনরাবৃত্তি ফাংশন (পারফর্ম আরও খারাপ তবে খাটো) ব্যবহার করে
'খুব বেশি সংখ্যক পুনরাবৃত্তি' এড়াতে আর ফাংশনটি সামান্য পরিবর্তিত হয়েছে
টেস্ট স্যুট যুক্ত করা হয়েছে। ফাংশন <3000 ঘাঁটি এবং পরিসীমা -50..50 এর জন্য ভাল সম্পাদন করে। গল্ফ আরও এবং আরও ভাল নির্ভুলতা
সম্পাদনা করুন

যেকোন আসল সংখ্যাটি যুক্তিযুক্ত সংখ্যার সাথে আনুমানিক হতে পারে (এবং আইইইই স্ট্যান্ডার্ড 'রিয়েল' নম্বরগুলি আসলে যুক্তিযুক্ত স্টোর করে)। যেকোন যুক্তিযুক্ত সংখ্যাকে a এবং b এর পূর্ণসংখ্যার সাথে ভগ্নাংশ হিসাবে প্রকাশ করা যেতে পারে। x ^ (a / b) হ'ল (x ^ a) বা (x এর মূল বি) ^ ক root স্কোয়ারিংয়ের মাধ্যমে পূর্ণসংখ্যার ক্ষয়ক্ষতি বেশ সহজ। সংখ্যার পদ্ধতি ব্যবহার করে পূর্ণসংখ্যার মূলকে প্রায় অনুমান করা যায়।

কোড

P=(x,e)=>(
  f=1e7,e<0&&(x=1/x,e=-e),
  F=(b,e,r=1)=>e?F(b*b,e>>1,e&1?r*b:r):r,
  R=(b,e,g=1,y=1e-30,d=(b/F(g,e-1)-g)/e)=>d>y|d<-y?R(b,e,g+d,y/.99):g,
  F(R(x,f),e*f)
)

টেস্ট ইন Firefox বা ফায়ারবাগ কনসোলটি

for (i=0;i<100;i++)
{
  b=Math.random()*3000
  e=Math.random()*100-50
  p1=Math.pow(b,e) // standard power function, to check
  p2=P(b,e)
  d=(p1-p2)/p1 // relative difference
  if (!isFinite(p2) || d > 0.001) 
    console.log(i, b, e, p1, p2, d.toFixed(3))
}

ভাল কাজ, ভয়ঙ্করভাবে সুনির্দিষ্ট নয় তবে এটি অ্যালগরিদমটি দুর্দান্ত =)
flawr

আপনি কি ব্যাখ্যা করতে পারবেন এটি দ্বারা কী করে e&1&&(r*=b)গুণ rকরা ছাড়া b?
flawr

1
@ ফ্লোয়ারif(e&1 != 0) r *= b
বেবি

ধন্যবাদ, আমি যে কাজে লাগান সচেতন ছিলাম না, কিন্তু এটা golfing =) জন্য একটি চমৎকার এক মনে করা হয়
flawr

1
ওয়ার্কিং কোডটি এখানে রয়েছে: P=(x,e)=>(F=(b,e,r=1)=>e?F(b*b,e>>1,e&1?r*b:r):r,R=(b,e,g=1,y=1e-16,d=(b/F(g,e-1)-g)/e)=>d>y|d<-y?R(b,e,g+d):g,e<0&&(x=1/x,e=-e),f=1<<24,F(R(x,f),e*f))(আমি অবশ্যই ক্লান্ত
হয়েছি

6

হাস্কেল, 85 90

স্ট্যান্ডার্ড এক্সপ-লগ অ্যালগরিদম। এখন ভিন্ন নামের সাথে আরও কয়েকটি অক্ষর শেভ করুন:

a%b|a>1=1/(1/a)%b|0<1=sum$scanl((/).((-b*foldr1(\n b->(1-a)*(b+1/n))c)*))1c
c=[1..99]

raiseএখন বলা হয় (%), বা %ইনফিক্স স্বরলিপিতে এমনকি এর ব্যবহারকে কম বাইট গ্রাস করে তোলে:4.5%(-4.5)

অবরুদ্ধ সংস্করণটি কেবল 172 বাইট ব্যবহার করে:

raise a b | a > 1     = 1 / raise (1/a) b
          | otherwise = expo (-b* ln (1-a))

ln x = foldr1 (\n a -> x*a+x/n) [1..99]

expo x = sum $ scanl ((/) . (x*)) 1 [1..99]

4

জেএস (ইএস 6), 103 বাইট

t=(x,m,f)=>{for(r=i=s=u=1;i<1<<7+f;r+=s/(u=i++*(f?1:u)))s*=m;return r};e=(a,b)=>t(b,t(a,1-1/a,9)*b-b,0)

উদাহরণ:

e(1.234,5.678) = 3.299798925315965
e(4.5,4.5)     = 869.8739233782269
e(4.5,-4.5)    = 0.0011495918812070608

টেলর সিরিজ ব্যবহার করুন।
b^x = 1 + ln(b)*x/1! + (ln(b)*x)^2/2! + (ln(b)*x)^3/3! + (ln(b)*x)^4/4! + ...
সঙ্গে স্বাভাবিক লগারিদম পড়তা :
ln(b) = (1-1/x) + (1-1/x)^2/2 + (1-1/x)^3/3 + (1-1/x)^4/4 + ...

আমি গণনা করতে 128 পুনরাবৃত্তি ব্যবহার করেছি b^x(কারণগুলির জন্য আরও পুনরাবৃত্তিগুলি কঠিন) এবং এর জন্য 262144 পুনরাবৃত্তিগুলিln(b)


হতে পারে আপনার গল্ফ কম হওয়া উচিত তবে আরও নির্ভুলতা যুক্ত করা e(80,5) ->1555962210.2240903উচিত : - 3276800000 হওয়া উচিত
edc65

@ edc65, আপনি ঠিক বলেছেন, আরও পাঁচটি অক্ষরের জন্য স্থির করেছেন।
মাইকেল এম।

1
কিছু ভিন্ন পদ্ধতি দেখে খুব ভাল লাগছে!
flawr

3

গল্ফ্লুয়া 120

আমি যে সত্য ব্যবহার

a^b = exp(log(a^b)) = exp(b*log(a))

এবং আমার নিজস্ব logএবং expফাংশন লিখেছেন । টার্মিনাল চলাকালীন মানগুলি aএবং bনতুন লাইনে প্রবেশ করা দরকার:

\L(x)g=0~@ i=1,50 c=(x-1)/x~@j=2,i c = c*(x-1)/x$g=g+c/i$~g$\E(x)g=1;R=1e7~@i=1,R g=g*(1+x/R)$~g$a=I.r()b=I.r()w(E(b*L(a)))

নমুনা রান:

4.5, 4.5  ==> 869.87104890175
4.5, -4.5 ==> 0.0011495904124065
3.0, 2.33 ==> 12.932794624815
9.0, 0.0  ==> 1
2.0, 2.0  ==> 3.9999996172672

একটি অব্যক্ত লুয়া সংস্করণটি হ'ল,

-- returns log
function L(x)
   g = 0
   for i=1,50 do
      c=(x-1)/x
      for j=2,i do
         c = c*(x-1)/x
      end
      g = g + c/i
   end
   return g
end

-- returns exp
function E(x)
   g=1;L=9999999
   for i=1,L do
      g=g*(1+x/L)
   end
   return g
end

a=io.read()
b=io.read()

print(E(b*L(a)))
print(a^b)

আপনি কিছু উদাহরণ আউটপুট প্রদান করতে পারেন?
flawr

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