बहुपद प्रक्षेप


12

एक प्रोग्राम लिखें जो सच्चे मनमाना सटीक तर्कसंगत संख्याओं का उपयोग करके बहुपद इंटरपोलेशन करता है । इनपुट इस तरह दिखता है:

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

आप मान सकते हैं कि =साइन से पहले और बाद में बिल्कुल एक व्हाट्सएप है , सभी नंबर या तो अंश या पूर्णांक हैं। आप यह भी मान सकते हैं, कि इनपुट में सभी अंश पहले से ही अप्रासंगिक हैं।

कोई त्रुटि जाँच की आवश्यकता नहीं है, आप मान सकते हैं कि इनपुट वैध है और कोई x f (x) में दोगुना नहीं है।

आउटपुट एक LaTeX संगत रूप में होना चाहिए, उत्सर्जित LaTeX कोड को यहां आउटपुट के समान चित्रमय प्रतिनिधित्व प्राप्त करना चाहिए।

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

अंश को यथासंभव कम किया जाना चाहिए, जैसे। ऐसा कुछ करने की \frac{2}{4} अनुमति नहीं है। यदि संख्या पूर्णांक है, तो एक अंश का उपयोग न करें।

विशेष नियम:

आपका कार्यक्रम चाहिए ...

  • डिग्री 12 तक बहुपद के लिए काम करते हैं
  • कम में पूरा तो उचित इनपुट के लिए 1 मिनट
  • किसी भी फ़ंक्शन का उपयोग न करें जो आपके लिए पूरी गणना करता है
  • छोटी से छोटी संभव डिग्री के बहुपद का उत्पादन

परीक्षण के मामलों:

दिए गए परीक्षण केवल स्पष्टीकरण के लिए हैं। आपके प्रोग्राम को सभी सही इनपुट के लिए सही परिणाम प्राप्त करना चाहिए।

इनपुट

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

उत्पादन

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

इनपुट

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

उत्पादन

f (x) = - \ frac {2186133} {239455744} x ^ 3
       + \ frac {2741731} {149659840} x ^ 2
       + \ frac {26720517} {29201920} x
       -> फ्राक {279464297} {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
     + \ frac {7} {4} x ^ 2
     + \ frac {23} {3}

इनपुट

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

उत्पादन

f (x) = 2x
     + ५

इनपुट

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

उत्पादन

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

आप असली संख्याओं के बारे में क्यों बात कर रहे हैं यदि आप कभी भी तर्कसंगत संख्या का उपयोग कर रहे हैं?
जोए

माफ़ करना। मेरी अंग्रेजी खराब है। हां, केवल तर्कसंगत संख्याओं का उपयोग करें। परिणाम सटीक होना चाहिए।
फ़ूजएक्सएक्सएल

पहले टेस्टकेस में, डॉट्स ( ...) वास्तव में इनपुट का हिस्सा हैं?
आठवीं

@ बारहमासी: नहीं। फिक्स्ड।
18 जून को फ़ूजक्कल

तीसरे टेस्टकेस के लिए आउटपुट गलत है। सही जवाब है -\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}

आपको सटीक समान सोर्सकोड फ़ॉर्मेटिंग बनाने की आवश्यकता नहीं है। LaTeX आउटपुट में। यह सिर्फ LaTeX के माध्यम से चलने के बाद उसी चित्रमय प्रतिनिधित्व का उत्पादन करना चाहिए। बेझिझक कुछ चर्र्ों को बचाएं
फ़ूजक्कल

मैं J को नहीं पढ़ सकता, लेकिन छोटी लंबाई से मैं इसे लेता हूं जिसका अर्थ है कि J में मैट्रिक्स इक्वेलन फॉर्म के लिए एक अंतर्निहित फ़ंक्शन है?
टिमवी

@ टिमी: नहीं, लेकिन मैं अंतर्निहित "उलटा मैट्रिक्स" का उपयोग करता हूं। J बहुत ही प्रचलित है: भले ही मैं "इनवर्ट मैट्रिक्स" को लागू करने के लिए था, यह कुछ वर्ण लंबा होगा।
बारहवीं

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.

टिप्पणियाँ

  • मुझे यकीन है कि मैट्रिक्स हेरफेर के लिए एक मॉड्यूल है जो ईक्लेन फॉर्म के लिए एक फ़ंक्शन प्रदान करता है। मैंने विशेष रूप से इसका उपयोग नहीं किया (एक के लिए भी खोज नहीं की) क्योंकि मुझे लगता है कि यह इस प्रतियोगिता का बिंदु है कि आप इसे स्वयं करें। यह उस तरह से अधिक दिलचस्प है, भी। बेशक बिगआईंट के बारे में भी यही कहा जा सकता है, लेकिन फिर मुझे संदेह है कि कोई भी इस चुनौती का प्रयास नहीं करेगा ...

संपादित करता

  • (६३० → ५hel५) एहसास हुआ कि मैं एक लूप में दो की जगह इकोलोन फॉर्म कर सकता हूं। कोड में टिप्पणियों के रूप में स्पष्टीकरण जोड़ें।

  • (५ (५ → ५ 5३) बस पैकेज सिंटैक्स की खोज की जो मुझे 'इसके बजाय उपयोग करने देता है ::

  • (583 → 573) कुछ और माइक्रोग्लॉफ़िंग

  • (५ )३ → ५६ ९) शॉर्ट पार्स इनपुट के लिए नियमित अभिव्यक्ति


मुझे संकलन त्रुटियां मिलती रहती
फ़ूजक्कल

@FUZxxl: यह इंगित करने के लिए धन्यवाद। बस एक मिसिंग स्पेस था। अभी तय किया है।
टिमवी

3

टीआई-बेसिक (83/84): 109 अक्षर

तकनीकी रूप से 109 वर्ण, TI-Basic मायने रखता है मंद (, के लिए, ->, rref (, [A]), और "एक वर्ण" के रूप में सूचीबद्ध करता है।

इनपुट को L1 और L2, (x, y) जोड़े [ex 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
यह तर्कसंगत या LaTeX फॉर्म का उपयोग नहीं करता है।
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))

फ्रेड फ्रीस कोड का सिर्फ एक छोटा संस्करण। ध्यान दें कि कोई संभवतः डी को पास करने के लिए छोड़ सकता है, क्योंकि यह सिर्फ बाहरी दायरे से खींच सकता है। जैसा कि आप शायद यहाँ मैं के साथ भी कर सकते हैं, हम एक भेड़ का बच्चा भी दाढ़ी कर सकते हैं। मैं किसी दिन इसका परीक्षण करूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.