বহুবর্ষীয় অন্তরঙ্গকরণ


12

এমন একটি প্রোগ্রাম লিখুন যা সত্য নির্বিচারে নির্ভুলতা যুক্তিযুক্ত সংখ্যাগুলি ব্যবহার করে বহুভিত্তিক ইন্টারপোলেশন সম্পাদন করে। ইনপুটটি দেখতে এমন দেখাচ্ছে:

f (1) = 2/3
f (2) = 4/5
f (3) = 6/7
...

আপনি ধরে নিতে পারেন যে =সাইন এর আগে এবং পরে ঠিক একটি সাদা জায়গা আছে , সমস্ত সংখ্যা হয় ভগ্নাংশ বা পূর্ণসংখ্যা। আপনি ধরেও নিতে পারেন, ইনপুটটির সমস্ত ভগ্নাংশ ইতিমধ্যে অপ্রতিয়োগযোগ্য।

কোনও ত্রুটি যাচাইয়ের দরকার নেই, আপনি ধরে নিতে পারেন, ইনপুটটি বৈধ এবং কোনও এক্স এফ (এক্স) এর দ্বিগুণ নয়।

আউটপুট একটি LaTeX সামঞ্জস্যপূর্ণ ফর্ম হতে হবে, নির্গত LaTeX কোড এখানে দেওয়া আউটপুট হিসাবে একই গ্রাফিকাল উপস্থাপনা পাওয়া উচিত।

f (x) = 123x ^ 2 + \ frac {45} {2} x + rac frac {7} {4}

ভগ্নাংশটি যথাসম্ভব হ্রাস করতে হবে, যেমন। এর মতো কিছু \frac{2}{4} অনুমোদিত নয়। সংখ্যাটি পূর্ণসংখ্যা হলে কোনও ভগ্নাংশ ব্যবহার করবেন না।

বিশেষ নিয়ম:

আপনার প্রোগ্রাম করা উচিত ...

  • 12 ডিগ্রি পর্যন্ত বহুপদী জন্য কাজ
  • যুক্তিসঙ্গত ইনপুট জন্য কম 1 মিনিট পরে সম্পূর্ণ
  • আপনার জন্য পুরো গণনা করে এমন কোনও ফাংশন ব্যবহার করবেন না
  • ক্ষুদ্রতম ডিগ্রির বহুপদী আউটপুট

Testcases:

প্রদত্ত পরীক্ষাগুলি কেবল স্পষ্ট করার জন্য। আপনার প্রোগ্রামে সমস্ত সঠিক ইনপুটগুলির জন্য সঠিক ফলাফল পাওয়া উচিত।

ইনপুট

f (1) = 2/3
f (2) = 4/5
f (3) = 6/7

আউটপুট

f (x) = - rac frac {4} {105} x ^ 2
       + \ frac {26} {105} x
       + rac frac {16} {35

ইনপুট

f (-12) = 13/2
f (5/3) = 3/5
f (13) = -6
f (1/5) = -3/4

আউটপুট

f (x) = - rac frac {2186133} 9 239455744} x ^ 3
       + \ frac {2741731 {9 149659840} x ^ 2
       + rac frac {26720517} 201 29201920} x
       - rac frac {279464297 {9 299319680}

ইনপুট

f (4/3) = 617/81
f (2) = 20/3
f (-8/3) = 6749/81
f (-5) = 7367/12
f (0) = 23/3

আউটপুট

f (x) = \ frac {1} {2} x ^ 4
     - 2x। 3
     + rac frac {7} {4} x ^ 2
     + rac frac {23} {3}

ইনপুট

f (0) = 5
f (1) = 7
f (2) = 9
f (3) = 11
f (4) = 13

আউটপুট

f (x) = 2x
     + 5

ইনপুট

f (1/2) = -1/2
f (-25) = -1/2
f (-54/12) = -1/2

আউটপুট

f (x) = - rac frac {1} {2}

আপনি যদি সবসময় ব্যবহার করছেন সমস্ত যুক্তিযুক্ত সংখ্যা হয় তবে আপনি কেন আসল সংখ্যাগুলির বিষয়ে কথা বলছেন?
জোয়ি

দুঃখিত। আমি ইংরেজীতে কাচা. হ্যাঁ, কেবল যুক্তিযুক্ত সংখ্যা ব্যবহার করুন। ফলাফলগুলি সঠিক হতে হবে।
FUZxxl

প্রথম টেস্টকেসে, বিন্দুগুলি ( ...) কী সত্যিই ইনপুটটির অংশ?
ইলেভেক্স

@ এলভেক্স: না সংশোধন করা হয়েছে।
FUZxxl

তৃতীয় টেস্টকেসের জন্য আউটপুটটি ভুল। সঠিক উত্তরটি হ'ল -\frac{37745}{14592}x^4 - \frac{853249}{43776}x^3 + \frac{57809}{7296}x^2 + \frac{225205}{2736}x + \frac{23}{3}। আমার সন্দেহ হয় ইনপুটটি অন্যরকম কিছু হতে পারে :)
টিমউই

উত্তর:


3

জে + শ

জে লিপি:

i=:0".(1!:1)3
i=:((-:#i),2)$i
c=:|.(%.(x:((i.#i)^~])"0({."1 i)))(+/ .*)(|:{:"1 i)
(":(-.0=c)#(c,.i.-#c))(1!:2)2

এস স্ক্রিপ্ট:

echo -n 'f(x) = '
tr -d 'f()=' | tr /\\n- r' '_  | ./polyint.ijs | sed -e 's/^/+/;s/_/-/;s/\([0-9]*\)r\([0-9]*\)/\\frac{\1}{\2}/;s/ \([0-9]*$\)/x^\1/;s/\^1//;s/x^0//;s/+\(.*-.*\)/\1/'

শ স্ক্রিপ্ট চালান:

./pol-int.sh
f(1/2) = -1/2
f(-25) = -1/2
f(-54/12) = -1/2

f(x) = -\frac{1}{2}

./pol-int.sh
f(4/3) = 617/8
f(2) = 20/3
f(-8/3) = 6749/81
f(-5) = 7367/12
f(0) = 23/3

f(x) = -\frac{37745}{14592}x^4
       -\frac{853249}{43776}x^3
     +  \frac{57809}{7296}x^2
     + \frac{225205}{2736}x
     +  \frac{23}{3}

আপনাকে ঠিক একই উত্সকোড ফর্ম্যাটিং তৈরি করতে হবে না। ল্যাটেক্স আউটপুটে। এটি ল্যাটেক্সের মধ্য দিয়ে চলার পরে একই গ্রাফিকাল প্রতিনিধিত্ব করা উচিত। কিছু অক্ষর সংরক্ষণ করুন নির্দ্বিধায়।
FUZxxl

আমি জে পড়তে পারি না, তবে সংক্ষিপ্ত দৈর্ঘ্য থেকে আমি এটি গ্রহণ করি তার অর্থ জে ম্যাট্রিক্স ইচেলন ফর্মের জন্য অন্তর্নির্মিত ফাংশন আছে?
টিমউই

@ টিমভি: না, তবে আমি অন্তর্নির্মিত "বিপরীত ম্যাট্রিক্স" ব্যবহার করি। জে খুব বিরক্ত যদিও: আমি যদি "ইনভার্ট ম্যাট্রিক্স" প্রয়োগ করি তবে এটি কয়েক অক্ষর দীর্ঘ হবে long
এলেভেক্স

3

পার্ল (569 টি অক্ষর)

use Math'BigInt;sub r{($u,$v)=@_;$v?r($v,$u%$v):$u}sub c{new Math'BigInt$_[0]}$a=@c=<>;for(@c){m!(-?\d+)/?(\d*). = (-?\d+)/?(\d*)!;$j{$_,$i}=$1**c$_,$k{$_,$i|=0}=($2||1)**c$_ for 0..$a;$j{$a,$i}=c$3;$k{$a,$i++}=c$4||1}for$p(0..$a-1){for$y(0..$p-1,$p+1..$a-1){$n=$j{$p,$y}*$k{$p,$p};$o=$k{$p,$y}*$j{$p,$p};$j{$_,$y}=$j{$_,$y}*$k{$_,$p}*$o-$k{$_,$y}*$j{$_,$p}*$n,$k{$_,$y}*=$k{$_,$p}*$o for 0..$a}}print"f(x)=";for(1..$a){$s=r$t=$j{$a,$p=$a-$_}*$k{$p,$p},$w=$k{$a,$p}*$j{$p,$p};$u=abs$t,print$t>0?"$z":'-',($z='+',$w/=$s)-1?"\\frac{$u}{$w}":$u,$p>1?"x^$p":x x$p if$t/=$s}

বিস্তারিত ব্যাখ্যা:

use Math'BigInt;

# Subroutine to calculate gcd of two numbers
sub r{($u,$v)=@_;$v?r($v,$u%$v):$u}

# Subroutine to create BigInts
sub c{new Math'BigInt$_[0]}

# Read input
# Throughout, $a is the number of equations.
$a=@c=<>;

# Initialises the $a+1 × $a matrix with all the values.
# $j{$x,$y} contains the numerator, $k{$x,$y} the denominator.
for(@c)
{
    m!(-?\d+)/?(\d*). = (-?\d+)/?(\d*)!;

    # Puzzle for the reader: why is $i|=0 in the second one,
    # not the first one? Answer at the bottom!
    $j{$_,$i}=$1**c$_,$k{$_,$i|=0}=($2||1)**c$_ for 0..$a;
    $j{$a,$i}=c$3;
    $k{$a,$i++}=c$4||1
}

# Generates the matrix echelon form.
# Basically, it works like this:
for$p(0..$a-1)
{
    # For each element along the diagonal {$p,$p}, set all the values above and
    # below it to 0 by adding a multiple of row $p to each of the other rows.
    for$y(0..$p-1,$p+1..$a-1)
    {
        # So we need to multiply the row $p by the value of {$p,$y}/{$p,$p}
        # (stored in $n/$o) and then subtract that from row $y.
        $n=$j{$p,$y}*$k{$p,$p};
        $o=$k{$p,$y}*$j{$p,$p};
            $j{$_,$y}=$j{$_,$y}*$k{$_,$p}*$o-$k{$_,$y}*$j{$_,$p}*$n,
            $k{$_,$y}*=$k{$_,$p}*$o
        for 0..$a
    }
}

# Outputs the result
print"f(x)=";
for(1..$a)
{
    # Note this sets $p = $a-$_. $p is the power of x.
    # We need to divide {$a,$p} by {$p,$p}. Store the result in $t/$w.
    # We also need to put the fraction in lowest terms, so calculate the gcd.
    $s=r$t=$j{$a,$p=$a-$_}*$k{$p,$p},$w=$k{$a,$p}*$j{$p,$p};

    # Output this term only if the numerator ($t) is non-zero.
    # Output a plus sign only if this isn’t the first term.
    # Output a fraction only if the denomator ($w) isn’t 1.
        $u=abs$t,print$t>0?"$z":'-',
        ($z='+',$w/=$s)-1?"\\frac{$u}{$w}":$u,$p>1?"x^$p":x x$p
    if$t/=$s
}

# Answer to the puzzle buried in the code above:
# It’s because the second part is passed as a second argument to c,
# hence it is evaluated before the first part.

মন্তব্য

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

সম্পাদনাগুলি

  • (630 → 585) অনুভূত আমি দুটিটির পরিবর্তে এক লুপে ইচেলন ফর্মটি করতে পারি। কোড মন্তব্য হিসাবে ব্যাখ্যা যোগ করুন।

  • (585 → 583) সবেমাত্র প্যাকেজ সিনট্যাক্সটি আবিষ্কার করেছে যা আমাকে এর 'পরিবর্তে ব্যবহার করতে দেয় ::

  • (583 → 573) আরও কিছু মাইক্রোগলফিং

  • (573 → 569) ইনপুট পার্স করার জন্য স্বল্প নিয়মিত অভিব্যক্তি


আমি সংকলনের ত্রুটিগুলি পেতে থাকি: আদর্শ one.com/LoB2T
FUZxxl

@FUZxxl: এটি নির্দেশ করার জন্য ধন্যবাদ এখানে একটি অনুপস্থিত জায়গা ছিল। এখনই স্থির।
টিমউই

3

টিআই-বেসিক (83/84): 109 টি অক্ষর

প্রযুক্তিগতভাবে 109 টি অক্ষর, টিআই-বেসিকটি ম্লান হয়ে যায় ((এর জন্য,, ->, rref (, [এ]), এবং "একটি অক্ষর" হিসাবে তালিকাবদ্ধ করে।

ইনপুটটি L1 এবং L2, (x, y) জোড়া [প্রাক্তন L1 = (1,2,3,4), L2 = (2,3,5,7)] এ ফর্ম্যাট করা হয়েছে।

{1,1}->dim([A]
{dim(L1),dim(L2)+1}->dim([A]
For(A,1,dim(L1)
For(B,dim(L1)-1,0,-1
L1(A)^B->[A](A,dim(L1)-B
End
L2(A->[A](A,dim(L1)+1
End
rref([A]->[A]
{0}->L3
For(A,1,dim(L1)
[A](A,dim(L1)+1->L3(A
End
Disp L3

1
এটি যৌক্তিক বা ল্যাটেক্স ফর্ম ব্যবহার করে না।
lirtosiast

1

লাগরেঞ্জ পদ্ধতি, পাইথন, 199 বাইট

একটু দেরি হলেও, ...

def lagrange(dp):
l = lambda i: lambda x: (prod([(x - dp[j][0]) / (dp[i][0] - dp[j][0]) for j in range(len(dp)) if i != j]))
return lambda x: sum([l(i)(x) * dp[i][1] for i in range(len(dp))])

1
অপারেটরগুলির চারপাশে আপনার সম্ভবত সমস্ত সাদা জায়গা দরকার নেই, তাই না?

0
l=lambda D,i:lambda x:prod((x-Dj[0])/(D[i][0]-Dj[0])for j,Dj in enumerate(D)if i!=j)
L=lambda D:lambda x:sum(l(D,i)(x)*Di[1]for i,Di in enumerate(D))

ফ্রেড ফ্রেসের কোডটির একটি সংক্ষিপ্ত সংস্করণ। মনে রাখবেন যে কেউ সম্ভবত ডি থেকে এল পাসিং এড়িয়ে যেতে পারে, যেহেতু এটি কেবল এটিকে বাইরের সুযোগ থেকে টানতে পারে। আপনি সম্ভবত আমি এখানে একই জিনিস করতে পারেন, আমরা এমনকি একটি ল্যাম্বডা শেভ করতে পারে। আমি এটা পরীক্ষা করব।

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